You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

游戏敌人AI归位实现求助:超出范围后暂停5秒返回起点

嘿,我来帮你搞定这个敌人AI归位的需求!其实核心就是加个5秒延迟逻辑,再加上返回初始位置的移动代码,我一步步给你拆解,保证你能轻松上手~

敌人AI归位逻辑实现步骤

1. 先保存敌人的初始位置

首先得给敌人记好“老家”在哪,后面才能准确回去。在你的敌人脚本顶部加个变量,然后在游戏启动时记录初始位置:

private Vector3 startPosition; // 存储敌人初始位置

void Start()
{
    startPosition = transform.position; // 游戏启动时把当前位置存下来
    // 这里保留你原来Start方法里的其他代码,比如获取玩家引用、初始化组件等
}

2. 用状态管理让逻辑更清晰

为了避免一堆if-else绕晕,我们给敌人定义几个状态,用枚举来管理:

// 定义敌人的三种状态
private enum EnemyState
{
    TrackingPlayer,   // 追踪玩家
    WaitingToReturn,  // 暂停等待5秒
    ReturningToStart  // 返回初始位置
}

private EnemyState currentState; // 当前敌人所处的状态

3. 实现5秒延迟的等待逻辑

Unity里处理这种延迟最适合用协程(Coroutine),新手也很好理解。写一个专门处理等待的协程:

// 等待5秒后切换到返回状态的协程
IEnumerator WaitThenReturn()
{
    yield return new WaitForSeconds(5f); // 停5秒
    currentState = EnemyState.ReturningToStart; // 时间到了,触发返回逻辑
}

4. 修改追踪范围判断逻辑

找到你原来判断玩家是否在追踪范围内的代码,把“玩家离开就停止”的逻辑改成切换到等待状态:
假设你原来的Update方法里有类似这样的判断:

void Update()
{
    float distanceToPlayer = Vector3.Distance(transform.position, player.transform.position);
    
    // 替换你原来的判断逻辑,改用状态机处理
    switch(currentState)
    {
        case EnemyState.TrackingPlayer:
            // 这里放你原来的追踪玩家代码,比如MoveTowards或者NavMeshAgent移动
            // 检查玩家是否超出追踪范围
            if (distanceToPlayer > chaseRange)
            {
                currentState = EnemyState.WaitingToReturn;
                StartCoroutine(WaitThenReturn()); // 启动等待协程
            }
            break;
            
        case EnemyState.WaitingToReturn:
            // 等待期间可以让敌人保持不动,或者播放 idle 动画
            break;
            
        case EnemyState.ReturningToStart:
            // 平滑移动回初始位置
            float returnSpeed = 2.5f; // 可以自己调整返回的速度
            transform.position = Vector3.MoveTowards(transform.position, startPosition, returnSpeed * Time.deltaTime);
            
            // 检查是否已经回到原位(用0.1f的误差避免精度问题)
            if (Vector3.Distance(transform.position, startPosition) < 0.1f)
            {
                transform.position = startPosition; // 精确归位
                currentState = EnemyState.TrackingPlayer; // 回到可追踪状态,等待玩家再次进入范围
            }
            break;
    }
    
    // 额外处理:如果玩家在等待期间重新进入范围,要立刻停止等待继续追踪
    if (distanceToPlayer <= chaseRange && currentState == EnemyState.WaitingToReturn)
    {
        StopCoroutine(WaitThenReturn()); // 终止等待协程
        currentState = EnemyState.TrackingPlayer;
    }
}

5. 针对NavMeshAgent的额外优化(如果你的敌人用了导航组件)

如果你是用NavMeshAgent做移动的,返回逻辑可以更简单:

  • WaitingToReturn状态时设置agent.isStopped = true让敌人停下
  • ReturningToStart状态时设置agent.SetDestination(startPosition),并把agent.isStopped = false
  • 检查是否到达目的地可以用agent.remainingDistance < 0.1f

内容的提问来源于stack exchange,提问作者mortis20

火山引擎 最新活动