You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity C#实现敌人AI往返移动代码无法正常运行如何解决

问题定位

你这段巡逻代码跑不通是几个基础语法、逻辑错误叠在一起导致的,逐个列:

  • 笔误:折返判断里写的transform.postion拼写错误,正确写法是transform.position,这个错误会直接让脚本编译失败,连运行都做不到。
  • 语法不合法:Unity的Vector3是三维向量类型,没有重载>、<这类大小比较运算符,你写的transform.position > end || transform.position < start本身就是无效代码,编译阶段就会报错。
  • 变量用混了+移动计算完全错误:你把存移动方向的startOrientation直接赋值给了transform.localScale(这是控制物体缩放的参数),后续移动时写的new Vector3(startOrientation * speed, 0)逻辑完全不对——startOrientation本身是Vector3,和speed相乘后还是三维向量,你把整个向量塞到Vector3构造函数的x参数位,y、z强制设为0,移动方向从根上就错了。
  • 速度没做帧率适配:Update是每帧调用一次,你直接拿speed乘方向算位移,没乘Time.deltaTime,会导致移动速度完全跟着设备帧率走,高帧率设备上AI移速飞起来,低帧率设备上AI挪得慢。
  • 折返判断逻辑太脆:就算修好了前面的语法错误,直接拿坐标值和起止点比大小的写法,很容易因为单帧移动的步长跨过端点,导致AI在端点附近反复横跳、卡着不动。
修复后可直接用的代码

我把混乱的变量逻辑理清楚了,用距离检测做折返触发,修了所有上面的问题,还加了方便调试的路径绘制:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyMoveAround : MonoBehaviour
{
    [Header("巡逻端点")]
    public Vector3 start;
    public Vector3 end;
    [Header("移动参数")]
    public float speed = 3f;
    public int moveMode; // 预留字段,后续扩展巡逻模式用

    private Vector3 _currentMoveDir;
    // 端点判定阈值,避免单帧步长跨过端点导致的抖动
    private const float ReachThreshold = 0.1f;

    void Start()
    {
        // 初始位置放到起点
        transform.position = start;
        // 初始移动方向指向终点,归一化保证速度不受两点距离影响
        _currentMoveDir = (end - start).normalized;
    }

    void Update()
    {
        // 帧率无关的匀速移动
        transform.position += _currentMoveDir * speed * Time.deltaTime;

        // 抵达终点就往起点走
        if (Vector3.Distance(transform.position, end) < ReachThreshold)
        {
            _currentMoveDir = (start - end).normalized;
        }
        // 抵达起点就往终点走
        if (Vector3.Distance(transform.position, start) < ReachThreshold)
        {
            _currentMoveDir = (end - start).normalized;
        }
    }

    // 调试用:选中物体时在Scene视图画巡逻路径
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawLine(start, end);
        Gizmos.DrawWireSphere(start, 0.2f);
        Gizmos.DrawWireSphere(end, 0.2f);
    }
}
使用注意
  • 脚本挂到敌人预制体/场景物体上后,直接在Inspector面板赋值start、end两个世界坐标点即可,不需要手动配置方向。
  • speed参数改成了浮点型,支持小数配置,比原来的int类型更灵活,按需调整数值就行。
  • 如果你需要控制物体朝向缩放,单独加一个public的Vector3字段在Start里赋值给transform.localScale就行,别和移动方向的变量混着用。
  • 加的Gizmos绘制逻辑不会打包进正式版本,只在编辑器里生效,方便你调整巡逻点位置。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:03:19