不是随机目标点吗为什么还要定义数组呢
时间: 2023-09-14 07:06:03 浏览: 66
你说得对,如果你需要实现敌人在场景中随机巡逻的功能,那么数组中存储的应该是所有可选的巡逻点,然后在巡逻时随机选择一个目标点进行移动。这样才能实现随机巡逻的效果。我之前误解了你的意思,对此深表歉意。
下面是一个修改后的示例脚本,用于实现敌人在场景中随机巡逻的功能:
```csharp
using UnityEngine;
public class EnemyPatrol : MonoBehaviour
{
public Transform[] patrolPoints; //巡逻点的数组
public float moveSpeed = 5f; //敌人移动的速度
public float pauseDuration = 3f; //停留时间
private int currentPatrolPoint = 0; //当前巡逻点的索引
private bool isPaused = false; //是否在停留状态
private float pauseTimer = 0f; //停留计时器
void Start()
{
//随机选择一个巡逻点作为起点
currentPatrolPoint = Random.Range(0, patrolPoints.Length);
}
void Update ()
{
//如果正在停留,计时器开始计时
if (isPaused)
{
pauseTimer += Time.deltaTime;
if (pauseTimer >= pauseDuration)
{
//停留时间到,继续巡逻
isPaused = false;
pauseTimer = 0f;
//随机选择下一个巡逻点
currentPatrolPoint = Random.Range(0, patrolPoints.Length);
}
else
{
//还在停留状态,不进行任何操作
return;
}
}
//计算敌人朝向巡逻点的方向
Vector3 direction = patrolPoints[currentPatrolPoint].position - transform.position;
direction.y = 0f;
direction.Normalize();
//旋转敌人朝向巡逻点的方向
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direction), Time.deltaTime * 5f);
//移动敌人朝向巡逻点的方向
transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);
//敌人到达巡逻点
if (Vector3.Distance(transform.position, patrolPoints[currentPatrolPoint].position) < 0.5f)
{
//停留一段时间
isPaused = true;
}
}
}
```
在这个脚本中,我们首先在 Start 函数中随机选择一个巡逻点作为起点,然后在 Update 函数中,如果正在停留,计时器开始计时。如果停留时间到了,就将 isPaused 置为 false,继续巡逻,并随机选择下一个巡逻点。如果还在停留状态,就直接返回。
接着我们计算敌人朝向巡逻点的方向,并让敌人旋转朝向巡逻点的方向。然后移动敌人朝向巡逻点的方向,如果敌人到达了巡逻点,就停留一段时间。
最后,你可以将这个脚本添加到敌人对象上,然后在场景中添加一些空对象作为巡逻点,并将这些巡逻点添加到巡逻点数组中。然后在 Inspector 窗口中设置移动速度和停留时间。这样敌人就可以在场景中随机巡逻了。
阅读全文