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

Unity:使用Input.GetMouseButtonDown时如何单次修改单个GameObject位置

解决Unity点击多个物体后位置同时修改的问题

问题根源是每次点击物体时都给按钮叠加添加了点击监听,没有移除之前的监听,导致按钮被点击时会执行所有曾经添加过的回调,进而修改所有被点击过的物体位置。

修复步骤:

  1. 新增变量存储当前选中的物体
    在脚本类中添加一个私有变量,专门记录当前要修改的目标物体:
private GameObject _currentSelectedTile;
  1. 优化射线检测逻辑(更高效且可靠)
    原代码中遍历floorTiles对比名字的方式冗余且易出错(比如存在重名物体),直接通过父物体引用判断更准确:
void Update() 
{
    if (Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out RaycastHit hit))
        {
            GameObject hitParent = hit.transform.parent.gameObject;
            // 检查命中物体的父物体是否在目标数组中
            if (System.Array.IndexOf(floorTiles, hitParent) != -1)
            {
                handleOnMouseDown(hit.collider);
            }
        }
    }
}
  1. 修改handleOnMouseDown方法,先清旧监听再绑新逻辑
    每次选中新物体时,先清空按钮上所有已有的监听,再绑定当前选中物体的修改逻辑:
void handleOnMouseDown(Collider box) 
{
    // 更新当前选中的物体
    _currentSelectedTile = box.transform.parent.gameObject;
    Vector3 position = _currentSelectedTile.transform.position;
    
    positionX.GetComponent<TextMeshProUGUI>().text = position.x.ToString();
    
    // 移除按钮上所有旧监听,避免叠加执行
    posXButtonPlus.GetComponent<Button>().onClick.RemoveAllListeners();
    // 绑定当前选中物体的位置修改逻辑
    posXButtonPlus.GetComponent<Button>().onClick.AddListener(() => handleOnChangePosition("posx", _currentSelectedTile));
}

核心逻辑说明:

  • 通过_currentSelectedTile变量唯一记录当前操作目标,确保每次只有一个物体被修改。
  • 使用RemoveAllListeners()清除按钮旧监听,彻底避免多次点击后按钮触发多个回调的问题。

内容的提问来源于stack exchange,提问作者Pablo Darde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:25:21