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

Unity敌人每2秒移至随机X位置卡顿且位移过短问题求助

问题原因分析

你的代码问题核心在于:Vector2.MoveTowards需要每一帧持续调用才能实现平滑移动到目标位置,但当前代码只在协程等待2秒后的单帧执行一次移动操作。这就导致每次仅移动speed * Time.deltaTime的距离(比如Time.deltaTime约0.02秒、speed为10时,单次仅移动0.2单位),且要等2秒才会触发下一次移动,最终表现为位移极短且卡顿。

两种修复方案

方案1:协程内循环实现平滑移动

修改协程逻辑,生成目标位置后,循环调用MoveTowards直到敌人到达目标,每一帧更新位置:

using System.Collections;
using UnityEngine;
using Random = UnityEngine.Random;

public class EnemyController : MonoBehaviour
{
    public Transform enemy;
    private float targetX;
    [SerializeField] private float speed = 10f;

    void Start()
    {
        StartCoroutine(MoveEnemyRoutine());
    }

    IEnumerator MoveEnemyRoutine()
    {
        while (!MainGame.lose)
        {
            // 每2秒生成新的目标X坐标
            yield return new WaitForSeconds(2);
            targetX = Random.Range(-2.4f, 2.4f);
            Debug.Log("新目标位置:" + targetX);

            // 循环移动,直到与目标位置的误差小于0.01(避免死循环)
            while (Mathf.Abs(enemy.position.x - targetX) > 0.01f)
            {
                enemy.position = Vector2.MoveTowards(enemy.position, 
                    new Vector3(targetX, enemy.position.y), 
                    speed * Time.deltaTime);
                yield return null; // 等待下一帧,保证平滑移动
            }

            // 最终将位置精确对齐到目标点
            enemy.position = new Vector3(targetX, enemy.position.y);
        }
    }
}

方案2:分离目标更新与移动逻辑(更符合Unity常规写法)

把移动逻辑放到Update(每一帧执行),协程仅负责每隔2秒更新目标位置,代码结构更清晰:

using System.Collections;
using UnityEngine;
using Random = UnityEngine.Random;

public class EnemyController : MonoBehaviour
{
    public Transform enemy;
    private float targetX;
    [SerializeField] private float speed = 10f;

    void Start()
    {
        // 初始化第一个目标位置
        targetX = Random.Range(-2.4f, 2.4f);
        StartCoroutine(UpdateTargetPositionRoutine());
    }

    void Update()
    {
        if (MainGame.lose) return;
        
        // 每一帧向目标位置移动
        enemy.position = Vector2.MoveTowards(enemy.position, 
            new Vector3(targetX, enemy.position.y), 
            speed * Time.deltaTime);
    }

    IEnumerator UpdateTargetPositionRoutine()
    {
        while (!MainGame.lose)
        {
            yield return new WaitForSeconds(2);
            targetX = Random.Range(-2.4f, 2.4f);
            Debug.Log("新目标位置:" + targetX);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:55:16