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
相关产品推荐
相关产品推荐

