Unity3D实现类似RUSH手游触摸移动玩家功能的异常问题求解
问题根因与修复方案
异常原因分析
- 单次触摸闪动问题:
Vector3.MoveTowards方法参数顺序错误,该方法的参数顺序为(当前位置, 目标位置, 移动步长),原代码将当前位置和目标位置写反,导致每一帧位置计算逻辑完全错乱;同时位置判断逻辑基于移动中的实时坐标,极端情况下会出现单帧内多次触发目标位置修改的问题。 - 长按反复切换问题:未对触摸输入的阶段做判断,
Input.touches会在手指按住屏幕的每一帧都返回触摸实例,原代码仅判断touch.tapCount == 1,导致长按期间每一帧都会执行位置切换逻辑,目标位置被反复修改。
修复后代码
private Vector3 targetPos; public float Xincrement; public float speed; // 初始化目标位置,避免启动时位置异常跳动 private void Start() { targetPos = transform.position; } void Update() { // 移动逻辑抽离到触摸遍历外部,保证每一帧正常执行移动 transform.position = Vector3.MoveTowards(transform.position, targetPos, speed * Time.deltaTime); foreach (Touch touch in Input.touches) { // 仅在手指刚按下的帧触发切换,解决长按反复切换问题 if (touch.phase == TouchPhase.Began && touch.tapCount == 1) { // 基于目标位置判断切换方向,避免移动过程中坐标中间值导致的判定异常 if (targetPos.x >= 0) { targetPos = new Vector3(-1, 0, 0); } else { targetPos = new Vector3(1, 0, 0); } } } }
优化说明
- 移动逻辑与输入逻辑分离,不受触摸事件频率影响,移动过程更流畅
- 以目标位置作为切换判定依据,点击响应逻辑更稳定,不会出现移动中途点击无响应的问题
- 触摸阶段判定仅响应单次按下动作,完全避免长按误触发问题
内容的提问来源于stack exchange,提问作者Henri Van Puyvelde
相关产品推荐
相关产品推荐

