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

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,提问作者Саргис

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:15:03