unity用navmesh的方法写敌人随机巡逻,当到达随机目标点时停止3秒,然后继续去下一个随机目标点
时间: 2024-03-21 07:38:12 浏览: 178
Unity3D实现NavMesh导航网格寻路
可以按照以下步骤实现:
1. 在场景中创建一个 NavMesh,确保 NavMesh 上有足够的可行走区域。
2. 创建一个敌人角色,给它添加 NavMeshAgent 组件,设置其移动速度和加速度等属性。
3. 在敌人角色的脚本中,定义一个目标点列表,存储敌人需要巡逻的目标点。
4. 在 Start 函数中,使用 NavMesh.SamplePosition 函数在 NavMesh 上随机生成一个目标点,并将其添加到目标点列表中。
5. 在 Update 函数中,判断敌人是否到达了当前目标点。如果到达了,则将敌人停下来,等待 3 秒钟后继续前往下一个目标点。
6. 在敌人到达目标点时,使用 Random.Range 函数在目标点列表中随机生成下一个目标点,并设置为当前目标点,同时将敌人状态设置为“移动”。
下面是一个大致的代码框架:
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class EnemyController : MonoBehaviour
{
public float moveSpeed = 3f;
public float acceleration = 8f;
public float stoppingDistance = 0.1f;
public float waitTime = 3f;
private NavMeshAgent agent;
private List<Vector3> targetPositions = new List<Vector3>();
private Vector3 currentTarget;
private bool isMoving = true;
private float waitTimer = 0f;
void Start()
{
agent = GetComponent<NavMeshAgent>();
agent.speed = moveSpeed;
agent.acceleration = acceleration;
// 随机生成起始目标点
NavMesh.SamplePosition(transform.position, out NavMeshHit hit, 10f, NavMesh.AllAreas);
targetPositions.Add(hit.position);
// 随机生成 5 个目标点
for (int i = 0; i < 5; i++)
{
NavMesh.SamplePosition(transform.position, out hit, 10f, NavMesh.AllAreas);
targetPositions.Add(hit.position);
}
// 设置第一个目标点为当前目标点
currentTarget = targetPositions[0];
agent.SetDestination(currentTarget);
}
void Update()
{
if (isMoving)
{
float distance = Vector3.Distance(transform.position, currentTarget);
if (distance < stoppingDistance)
{
waitTimer += Time.deltaTime;
if (waitTimer >= waitTime)
{
// 随机选择下一个目标点
int index = Random.Range(0, targetPositions.Count);
currentTarget = targetPositions[index];
agent.SetDestination(currentTarget);
// 重置计时器和状态
waitTimer = 0f;
isMoving = true;
}
}
}
}
}
```
这里仅提供了一个简单的实现,具体可以根据自己的需求进行修改和扩展。
阅读全文