【问题标题】:Display name of object on GUI box在 GUI 框中显示对象的名称
【发布时间】:2014-06-17 10:48:37
【问题描述】:

我创建了 2 个立方体(立方体 1、立方体 2)。当我将鼠标悬停在多维数据集 1 或多维数据集 2 上时,我想在 GUI 框中显示其名称。名称显示在控制台中,但不在我的 GUI 框中,使用以下代码:

Public class Label : MonoBehaviour 
{
    public string collidedmesh;

    // Use this for initialization
    void Start () 
    {
        collidedmesh=transform.name;
        Debug.Log("........"+collidedmesh);
    }

    void OnGUI()
    {
        GUI.Box(new Rect(300, 100, 100, 20),""+collidedmesh);   
    }

    void OnMouseDown()
    {
        OnGUI();
    }
}

输出是

【问题讨论】:

  • 究竟是什么不起作用
  • 您看到屏幕上的方框了吗?为什么要将名称添加到空字符串?
  • 是的,但是立方体 1 和立方体 2 打印在同一个盒子上......你能给出这个想法......
  • 可能是布局文件有问题。也许他们在彼此之上。

标签: c# unity3d collision-detection mouseover


【解决方案1】:

您将在同一位置渲染所有框。通过引用transform.position 并通过Camera.WorldToScreenPoint() 将其传递给screen-space 来使用相对位置。

void OnGUI()
{
    Vector3 screenCoord = Camera.main.WorldToScreenPoint(transform.position);
    GUI.Box(new Rect(screenCoord.x, screenCoord.y, 100, 20),collidedmesh);
}

另外做"" + collidedmesh是一种浪费的操作,用collidedmesh代替。

【讨论】:

  • 公共类 Raycast : MonoBehaviour { public string collidedmesh;无效 OnGUI() { Vector3 screenCoord = Camera.WorldToScreenPoint(transform.position); GUI.Box(new Rect(screenCoord.x, screenCoord.y, 100, 20),collidedmesh);当我将此代码拖入 cube1 和 cube 2 时,出现类似“访问非静态成员 `UnityEngine.Camera.WorldToScreenPoint(UnityEngine.Vector3)' 需要对象引用”的错误
  • 当我将鼠标悬停在立方体 1 或立方体 2 上时,我想在 GUI 框中显示其名称。但是在这段代码中,你在条件/功能上使用鼠标。
  • 此代码将被添加到您的代码中。只需将 ONGUI 功能替换为我的版本即可。
  • 您在开始时设置了 collidedmesh,它针对您附加标签组件的每个对象运行。相反,您应该在 OnMouseDown 中设置它,并且仅在 collidedmesh 不是空字符串时才渲染框。当鼠标不再在它上面时,您还应该清除碰撞网格。
  • 对不起,我来不及了。
【解决方案2】:

您希望在鼠标悬停或单击时显示框的名称?

您的问题是双重的:
-OnGUI是自动调用的,不能这样调用;不管它正在发生
-您正在使用 OnMouseDown,它仅在您有效单击对象时才会被调用

所以修复它们,删除 OnMouseDown() 函数。 在代码顶部添加一个布尔值,例如

bools isHovering = false;

然后,在您的 OnGUI() 函数中,在 GUI.Box 之前添加一条 if 语句,如下所示:

if(isHovering)
{
    GUI.Box(new Rect(300, 100, 100, 20),""+collidedmesh);
}

最后,添加一个 OnMouseEnter() 和一个 OnMouseExit(),这将根据鼠标是否悬停在您的对象上来设置布尔值,如下所示:

void OnMouseEnter()
{
    isHovering = true;
}

void OnMouseExit()
{
    isHovering = false;
}

这样,当您将鼠标悬停在某物上时,布尔值设置为 true,从而激活显示对象名称的 GUI.Box。当您停止将鼠标悬停在它上面时,布尔值设置为 false,从而停用 GUI.Box。祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2016-07-21
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多