Unity角色移动控制脚本需点击两次目标位置才生效问题咨询
点击两次才触发角色移动的问题修复
核心问题原因
- 执行顺序错误:
Update方法里你先计算了当前角色和mousePos的距离,之后才响应鼠标点击给mousePos赋新值。第一次点击的帧,距离计算用的还是旧的mousePos数值,不会触发后续移动逻辑,第二次点击的时候才会用到第一次赋值的坐标,所以出现要点两次的问题。 - 浮点数等值判断完全不可靠:你用
switch(distance)匹配case 10f,浮点数运算存在精度误差,角色移动过程中几乎不可能刚好让距离等于10f,会导致后续permission和ready的状态重置逻辑永远不触发。 - 时间参数使用错误:
Update中执行移动逻辑时用了Time.fixedDeltaTime,这个参数是专用于FixedUpdate物理帧的,在Update里使用会导致移动速度随设备帧率波动。 - 3D坐标转换问题:用
ScreenToWorldPoint转换鼠标坐标的时候没有给Z轴赋值,默认会取相机的Z轴坐标,转换出来的坐标和角色所在平面的坐标不匹配,会导致距离计算错误。
修复方案
调整Update里的逻辑顺序,把鼠标点击响应放到距离计算之前;把等于10f的判断改成小于等于极小阈值的判断;把Time.fixedDeltaTime换成Time.deltaTime;转换鼠标坐标的时候补全Z轴数值。
修正后代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MOV_JANPU_SAN : MonoBehaviour { private Animator Anim; private Vector3 mousePos; private float distance; private bool ready; private bool permission = true; void Start() { Anim = GetComponent<Animator>(); // 初始化mousePos为角色初始位置,避免第一次计算距离出错 mousePos = transform.position; } void Update() { // 先响应鼠标点击,更新目标坐标 if(permission) { if(Input.GetMouseButtonDown(0)) { // 补全Z轴数值,和角色所在Z轴保持一致 Vector3 screenPos = Input.mousePosition; screenPos.z = Mathf.Abs(Camera.main.transform.position.z - transform.position.z); mousePos = Camera.main.ScreenToWorldPoint(screenPos); Anim.SetBool("START", true); Anim.SetBool("END", false); } } // 再计算当前距离 distance = Vector3.Distance(transform.position, mousePos); // 把等值判断改成小于阈值的判断,阈值可以根据需求调整 if(distance <= 0.1f) { Anim.SetBool("END", true); Anim.SetBool("START", false); ready = false; permission = true; } else { if(ready) { // 换成Time.deltaTime适配Update帧率 transform.position = Vector2.MoveTowards(transform.position, mousePos, Time.deltaTime * 9); permission = false; } } } void StartMove() { ready = true; //Event ("START" end animation) } }
内容的提问来源于stack exchange,提问作者Саргис
相关产品推荐
相关产品推荐

