Unity:使用Input.GetMouseButtonDown时如何单次修改单个GameObject位置
解决Unity点击多个物体后位置同时修改的问题
问题根源是每次点击物体时都给按钮叠加添加了点击监听,没有移除之前的监听,导致按钮被点击时会执行所有曾经添加过的回调,进而修改所有被点击过的物体位置。
修复步骤:
- 新增变量存储当前选中的物体
在脚本类中添加一个私有变量,专门记录当前要修改的目标物体:
private GameObject _currentSelectedTile;
- 优化射线检测逻辑(更高效且可靠)
原代码中遍历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); } } } }
- 修改
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
相关产品推荐
相关产品推荐

