Unity中物体X轴移动无延迟且间隔时长递减问题求助
问题修复:方块带逐渐缩短延迟的X轴移动
原代码核心问题
- 语法错误堆积:变量声明缺分号、
GetComponent拼写错误、if语句括号不完整、Vector3/GameObject.Find大小写错误,且协程定义嵌套在了Update方法内部。 - 协程重复启动:
Update每帧都触发协程启动,瞬间生成大量协程直接覆盖延迟效果。 - 无延迟缩短逻辑:固定延迟值,未实现间隔逐渐缩短的需求。
- 浮点判断风险:直接用
!= -15判断位置,浮点数精度问题可能导致逻辑失效。
修正后完整代码
public class SetMove : MonoBehaviour { private Transform _trans; // 初始延迟时间(秒) private float _currentDelay = 2f; // 每次延迟缩短幅度 private float _delayReduction = 0.1f; // 最小延迟阈值,防止无限缩短 private float _minDelay = 0.2f; // 协程运行标记,避免重复启动 private bool _isMoving = false; // 目标停止X坐标 private float _targetX = -15f; private void Start() { _trans = GetComponent<Transform>(); } private void Update() { // 未到达目标且未在移动时,启动移动协程 if (!_isMoving && _trans.position.x > _targetX) { StartCoroutine(MoveWithDecreasingDelay()); } // 到达目标后触发生成逻辑并销毁自身 else if (_trans.position.x <= _targetX) { GameObject.Find("controller").GetComponent<Set_Make>().StartMaking(); Destroy(gameObject); } } private IEnumerator MoveWithDecreasingDelay() { _isMoving = true; // 等待当前延迟时间 yield return new WaitForSecondsRealTime(_currentDelay); // 沿X轴移动-1单位 _trans.position = new Vector3(_trans.position.x - 1f, _trans.position.y); // 缩短延迟,不低于最小值 if (_currentDelay > _minDelay) { _currentDelay -= _delayReduction; } _isMoving = false; } }
关键修改说明
- 语法规范:修正所有拼写、嵌套、大小写错误,统一私有变量命名风格。
- 协程控制:添加
_isMoving标记,确保同一时间仅一个协程运行,彻底解决重复启动问题。 - 延迟动态调整:通过
_currentDelay变量记录当前间隔,每次移动后自动缩短,并用_minDelay限制下限。 - 位置判断优化:用
> _targetX替代!= -15,规避浮点数精度误差导致的逻辑失效。 - 逻辑解耦:建议给
set_make类定义公开方法(如示例中的StartMaking())触发生成逻辑,避免直接调用MonoBehaviour的Start方法。
内容的提问来源于stack exchange,提问作者Logan Kocher
相关产品推荐
相关产品推荐

