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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 05:26:05