游戏开发小结——敌人躲避射击
2023-12-31 22:18:29
游戏开发小结——敌人躲避射击
目标:学习如何实现一个新的敌人,试图避免被玩家的射击击中。
再次有一个新的敌人想法供我们尝试。让我们创建一种新的敌人类型,当我们向他开火时,这个敌人将尝试避免被我们的激光击中。
我们的新敌人 sprite。
首先,我们必须确保我们的新敌人类型存在于我们的游戏中。
private enum EnemyType
{
Default,
Zigzag,
Aggressive,
Smart,
Evasive
}
由于这个敌人会寻找我们玩家的激光,我们必须确保我们的 SpawnManager 和激光容器中的所有内容都已设置好。
[SerializeField] private GameObject _playerLaserContainer;
public GameObject PlayerLaserContainer => _playerLaserContainer;
我们所做的就是创建保存容器的变量,并确保容器是的公开publicle,并且我们通过使用属性来做到这一点。
现在我们讨论敌人如何检测和躲避我们的激光。
private float _avoidDistance = 3.0f;
private void CalculateMovement()
{
switch (_type)
{
//other cases
case EnemyType.Evasive:
Vector3 _enemyMoveDirection = Vector3.down;
bool _foundLaser = false;
LaserBehaviour[] _trackLasers = SpawnManager.Instance.PlayerLaserContainer.GetComponentsInChildren<LaserBehaviour>();
for (int i = 0; i < _trackLasers.Length; i++)
{
if (_trackLasers[i] != null && _trackLasers[i].gameObject != null && _trackLasers[i].gameObject.activeSelf)
{
Vector3 _directionToLaser = _trackLasers[i].transform.position - transform.position;
if (Mathf.Abs(_directionToLaser.magnitude) < _avoidDistance)
{
_enemyMoveDirection = -_directionToLaser;
_foundLaser = true;
}
}
}
if(_foundLaser)
transform.Translate(_enemySpeed / 2f * Time.deltaTime * _enemyMoveDirection);
else
transform.Translate(_enemySpeed * Time.deltaTime * _enemyMoveDirection);
break;
default:
break;
}
TeleportNewPosition();
}
让我们分解一下我们在这里所做的一切:
_enemyMoveDirection:我们创建一个 Vector3.down,表示它默认应该向下移动,以防找不到激光。
_foundLaser:这是我们的布尔值,用于指示是否已找到激光。如果没有,我们将正常向下移动。
_trackLasers:这是我们的变量,它保存在我们的 Singleton 类 SpawnManager 的容器中找到的所有激光器的数组。
然后我们循环遍历数组中的所有项目,并检查它们是否不为空并且在场景中处于活动状态。
_directionToLaser:计算从敌人到激光的方向。
然后我们检查到激光的距离是否在指定的 _avoidDistance 范围内。
如果到激光的距离在指定的 _avoidDistance 范围内,它会更新我们的 _enemyMoveDirection 以远离激光并将 _foundLaser 设置为 true。
最后,我们检查是否找到了需要避开的激光。如果我们这样做了,我们就会以一半的速度远离它。否则,我们通常只是向下移动。
我们的敌人试图躲避我们的激光。
现在正如我们所看到的,当我们向躲避敌人发射激光时,他会不惜一切代价试图避开它。祝你好运!
文章来源:https://blog.csdn.net/qq_37270421/article/details/135309456
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!