如何在塔防游戏中让敌人停止并开始移动



我正在制作一款塔防游戏(遵循Brackeys教程(,我想让它在敌人碰到障碍物或敌人在前方时停止。当前方的障碍物或敌人被摧毁时,我希望他们再次前进。

我在Brackeys教程中为这些敌人使用基于节点的运输。到目前为止,它非常有帮助,我正处于一个想为游戏添加额外内容的时刻。

只是澄清一下,当敌人遇到障碍物或其他敌人时,他们确实会停下来,之后他们就不会再移动了。敌人也有一个刚体,这样他们就可以检测触发器,障碍物和敌人都有一个触发器对撞机。

以下是所有敌人的移动代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Enemy))]
public class EnemyMovement : MonoBehaviour
{
private Transform target;
private int wavepointIndex = 0;
EnemyTurret eTurret;
private Enemy enemy;
public bool canMove = true;

//private CapsuleCollider _cc;

private void Start()
{
enemy = GetComponent<Enemy>();
target = WaypointScript.points[0];
}
private void OnTriggerEnter(Collider col)
{
if (col.CompareTag("Obstacle") || col.CompareTag("Enemy"))
{
canMove = false;
Debug.Log("Stop");
}
}
private void OnTriggerStay(Collider col)
{
if (col.CompareTag("Obstacle") || col.CompareTag("Enemy"))
{
if (col.GetComponent<Enemy>().health <= 0)
{
Movement();
Debug.Log("Start Moving!");
}            
}
}
void Movement()
{
canMove = true;
}
private void Update()
{
if (canMove == true)
{
Vector3 dir = target.position - transform.position;
transform.Translate(dir.normalized * enemy.speed * Time.deltaTime, Space.World);
if (Vector3.Distance(transform.position, target.position) <= 0.4f)
{
GetNextWayPoint();
}
enemy.speed = enemy.startSpeed;
}        
}
void GetNextWayPoint() //Sets the new waypoint to the enemy, however when it finishes it's cycle of waypoints, the enemy is destroyed.
{
if (wavepointIndex >= WaypointScript.points.Length - 1)
{
EndPath();
return;
}
wavepointIndex++;
target = WaypointScript.points[wavepointIndex];
}
void EndPath()
{
canMove = false;
//PlayerStats.Health--;
//Destroy(gameObject);
} ```

我只是将我的评论转换为一个答案,这样,如果您已经解决了问题,您就可以接受它。

当敌人的生命值达到0时,你是否正在摧毁敌人的对撞机,因此OnTriggerStay中第二个条件语句中的代码没有执行?

一个快速的解决办法是在敌人被摧毁之前增加一个短暂的延迟。在这里您可以看到,您可以在destroy方法本身中添加延迟。

OnTriggerStay((函数检查其健康状况之前,敌人或障碍物可能已经被摧毁。您可以尝试将敌人或障碍物存储在GameObject对象中,然后在Update((中,当对象因被摧毁而返回null时启用移动。

您也可以尝试使用OnTriggerExit((,如下所示:

private void OnTriggerExit(Collider col)
{
if (col.CompareTag("Obstacle") || col.CompareTag("Enemy"))
{
Movement();
Debug.Log("Start Moving!");           
}
}

最新更新