Unity2D,设计敌人待机代码,在视野内未发现玩家时待机,发现玩家时追踪玩家
时间: 2024-03-20 15:38:56 浏览: 97
好的,针对这个问题,我可以给出一个简单的实现方案。首先,我们需要明确敌人的行为模式,即待机和追踪两种状态。在待机状态下,敌人需要周期性地检查视野范围内是否有玩家存在,如果没有则继续待机,如果有则切换到追踪状态。在追踪状态下,敌人需要朝着玩家的位置移动,并不断更新自己的朝向,以面向玩家。
下面是一个简单的代码示例,供参考:
```csharp
public class EnemyController : MonoBehaviour
{
public float moveSpeed = 3f; // 移动速度
public float rotateSpeed = 5f; // 旋转速度
public float idleDuration = 2f; // 待机时间间隔
public float viewDistance = 10f; // 视野距离
public float viewAngle = 60f; // 视野角度
private Transform player; // 玩家位置
private Vector3 moveDirection; // 移动方向
private float idleTimer = 0f; // 待机计时器
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update()
{
if (CanSeePlayer()) {
ChasePlayer();
} else {
Idle();
}
}
// 判断是否能看到玩家
bool CanSeePlayer()
{
if (Vector3.Distance(transform.position, player.position) < viewDistance) {
Vector3 dirToPlayer = (player.position - transform.position).normalized;
float angleToPlayer = Vector3.Angle(transform.forward, dirToPlayer);
if (angleToPlayer < viewAngle / 2f) {
if (Physics.Raycast(transform.position, dirToPlayer, out RaycastHit hit, viewDistance)) {
if (hit.collider.CompareTag("Player")) {
return true;
}
}
}
}
return false;
}
// 追踪玩家
void ChasePlayer()
{
moveDirection = (player.position - transform.position).normalized;
transform.forward = Vector3.Lerp(transform.forward, moveDirection, rotateSpeed * Time.deltaTime);
transform.position += moveDirection * moveSpeed * Time.deltaTime;
}
// 待机
void Idle()
{
idleTimer += Time.deltaTime;
if (idleTimer >= idleDuration) {
idleTimer = 0f;
transform.Rotate(0f, Random.Range(0f, 360f), 0f);
}
}
}
```
在这个示例中,我们定义了一些公共变量,包括移动速度、旋转速度、待机时间间隔、视野距离和视野角度等。在 `Start` 方法中,我们获取到了玩家的位置信息,然后在 `Update` 方法中,根据是否能看到玩家来判断敌人的状态。如果能看到玩家,则调用 `ChasePlayer` 方法,否则调用 `Idle` 方法。
在 `CanSeePlayer` 方法中,我们首先判断敌人和玩家之间的距离是否小于视野距离,然后计算敌人到玩家的方向和角度。如果角度小于视野角度一半,则使用 `Physics.Raycast` 方法检测敌人和玩家之间是否有遮挡物,如果没有,则说明敌人能够看到玩家。
在 `ChasePlayer` 方法中,我们使用向量差计算出敌人到玩家的方向,然后使用 `Vector3.Lerp` 方法实现平滑旋转,最后每帧根据方向和速度移动敌人。
在 `Idle` 方法中,我们使用计时器来控制待机时间间隔,并且在每次待机结束后随机旋转敌人的朝向。
当然,这只是一个简单的实现方案,还有很多可以优化和改进的地方。比如,可以添加声音效果、动画效果、攻击行为等等。
阅读全文