Unity C#:如何用GetMouseButtonDown捕获对象名并保持其不变?
解决方法
核心问题有两个:一是你当前代码里的gameObject.name取的是挂载这个脚本的对象的名称,不是你点击的目标对象;二是OnMouseOver里的逻辑没做判断,不管锚定状态都会覆盖tilehome。按下面的步骤改:
1. 修正点击获取目标对象的逻辑
用射线检测代替直接取gameObject.name,这样才能拿到你点击的那个网格对象的名称:
private string tilehome; private bool tileanchor = false; void Update() { if (Input.GetMouseButtonDown(0)) { if (!tileanchor) { // 从相机向鼠标位置发射射线 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) { // 拿到点击对象的名称并存储 tilehome = hit.collider.gameObject.name; tileanchor = true; } } } if (Input.GetMouseButtonDown(1)) { tileanchor = false; // 可选:右键取消锚定时清空存储的名称 // tilehome = ""; } }
2. 给OnMouseOver加状态判断
如果你的OnMouseOver里有修改tilehome的代码,必须加判断,只有未锚定时才允许更新,锚定后保留点击时的结果:
void OnMouseOver() { // 只有未锚定状态,才把当前悬停对象的名称赋值给tilehome if (!tileanchor) { tilehome = gameObject.name; } // 这里写你需要使用tilehome的逻辑,比如坐标计算、显示提示等 // 锚定状态下,tilehome会一直是你点击时的对象名称,不会被悬停对象覆盖 }
注意事项
- 确保所有需要被点击/悬停的网格对象都添加了Collider组件(比如Mesh Collider),射线检测和
OnMouseOver都依赖这个组件才能生效。 - 如果是2D网格,把
Physics.Raycast换成Physics2D.Raycast,对应使用2D Collider。
内容的提问来源于stack exchange,提问作者NovaLightAngel
相关产品推荐
相关产品推荐

