在虚拟现实(VR)游戏开发的过程中,经常会遇到各种技术挑战。今天,将重点解决几个关键问题,以提升游戏体验。具体来说,将改进事件触发逻辑,以支持持续射击;修复玩家角色被敌人推动的问题;解决骑士角色变黑的问题;并调整敌人的速度,使游戏更易上手。让开始吧!
目前,面临的问题是,只有当点击敌人时才会对其造成伤害。如果持续按住屏幕,虽然可以连续射击,但敌人不会受到伤害。昨天,发现有两种方法可以实现游戏逻辑:一种是使用现有的射线投射代码,根据击中的对象运行某些函数;另一种是使用事件触发系统以及Google的变更。经过一番尝试,提出了一个解决方案,虽然不是最佳,但没关系,只是在学习!
需要解决两个问题:一是当按住屏幕瞄准敌人时会发生什么;二是当按住屏幕并移动瞄准另一个敌人时会发生什么。经过一番尝试,现有的PointerClick解决方案将不再适用。相反,开始尝试PointerEnter和PointerExit事件。
将在EnemyHealth类中添加更改:
public class EnemyHealth : MonoBehaviour
{
public float Health = 100;
public AudioClip[] HitSfxClips;
public float HitSoundDelay = 0.1f;
private SpawnManager _spawnManager;
private Animator _animator;
private AudioSource _audioSource;
private float _hitTime;
private Boolean _isEnter;
void Start()
{
// 初始化代码...
}
void Update()
{
_hitTime += Time.deltaTime;
if (Input.GetButton("Fire1") && _isEnter)
{
TakeDamage(1);
}
}
private void TakeDamage(float damage)
{
// 伤害处理代码...
}
private void SetupSound()
{
// 音效设置代码...
}
private void PlayRandomHit()
{
// 随机播放音效代码...
}
private void Death()
{
// 死亡处理代码...
}
public void HealthEnter()
{
_isEnter = true;
print("enter");
}
public void HealthExit()
{
_isEnter = false;
print("exit");
}
}
在EnemyHealth中,创建了两个新函数:HealthEnter()和HealthExit()。这些函数将从设置的事件触发器中调用。在这些函数中,设置了一个名为_isEnter的新变量,以便知道何时被选中。在Update()中,检查是否当前悬停在敌人上方,并且是否按下了屏幕。如果是,将调用现有的Shoot函数。
也改变了击中音效效果,使其每0.1秒播放一次,就像射击延迟一样。
现在已经将射击脚本放入,接下来需要做的最后一件事就是创建事件触发器以使用它们。需要移除之前设置的PointerClick事件,转而创建两种新的事件触发器:PointerExit和PointerEnter。
将执行以下操作: - 将HealthEnter()附加到PointerEnter - 将HealthExit()附加到PointerExit
现在可以像最初计划的那样玩游戏了。确保对Bandit和Zombie也进行这些更改!
目前,如果玩游戏,当敌人靠近玩家角色时,会掉落。应该在之前设置RigidBody组件的约束时解决这个问题,但显然没有。
让回去修复这个问题: - 在层级结构中选择Player - 在RigidBody组件下,将设置约束。具体来说,想要冻结位置和旋转,这样敌人就不会推动角色。让游戏移动可能会导致玩家感到恶心。
如果在移动设备上玩游戏,会注意到一个大问题。骑士都是黑色的。
如果注意日志,会看到: - 似乎使用的资产的着色器有问题。
不幸的是,对这个问题了解不够,无法解决。有两个选择: - 忽略问题,让所有骑士都是黑色的 - 将使用这些着色器的材料更改为标准着色器。
在案例中,将探索第二个选项。 - 在Assets/Knight/models/Materials中,使用了3种材料:clothColor、knight1Color、weaponsColor,它们都使用了上述两种着色器之一。让选择它们并将它们更改为Standard。
现在如果在Unity上玩游戏,这就是骑士的样子: - 它失去了最初为它设置的颜色,但至少保留了模型的细节。
目前,在游戏中,会遭到敌人的围攻。如果能四处移动,那就好了,不幸的是,不能再这样做了,因此,需要进行一些调整。
将做两件事: - 改变敌人生成的时间间隔 - 减慢敌人的移动速度
目前,每2秒生成一个敌人。让将其更改为5。 - 选择SpawnManager游戏对象(GameManager的子对象) - 将Time Between Enemies设置为从2到5
正如可能记得的,要控制敌人速度,必须查看敌人预制件中的Nav Mesh Agent组件。 - 按照速度顺序,速度顺序是Bandit、Knight、Zombie,其中Bandit最快,Zombie最慢。
将稍微改变速度: - Bandit到2 - Knight到1.5 - Zombie到1
例如:
public void AdjustEnemySpeed()
{
// 调整敌人速度的代码...
}
现在完成了!处理了很多遇到的技术问题。 - 明天,将继续完成游戏的其余部分,找出如何将UI添加到虚拟现实环境中。 - 到那时,将在第40天见到!