GUI.tooltip对我来说很奇怪

时间:2014-11-07 18:24:06

标签: unity3d unityscript

如果我将鼠标光标悬停在UIContent上,它会显示按钮“+”。但是,按下它时代码不会执行。没有if(GUI.tooltip ==“1”)代码没问题。 那有什么不对?

GUI.Label(Rect(700, 200, 140, 20), GUIContent(
        "test1: " + space + Static.globalTest1[qwqw], "1"));

        if(GUI.tooltip == "1")
            if(GUI.Button(Rect(800, 205, 50, 50), "+"))
            {
                level.addExp(qwqw, 50);
                /// ...
            }

Unity不会吐出任何编译错误。

1 个答案:

答案 0 :(得分:1)

问题是工具提示系统有点奇怪。 GUI.tooltip实际上是在绘制控件时设置的。因此,负责设置当前工具提示的代码位于GUIStyle.Draw方法中。这意味着工具提示仅在重绘事件期间设置,并且仅在绘制控件之后设置。因此,您的按钮被绘制但未获得任何输入事件,因为在处理mousedown / mouse up事件时未设置工具提示。

您的下一个问题是您的按钮和标签重叠。这通常是一个问题,因为控件按照OnGUI中出现的顺序处理事件。第一个控件可能" eat"某些事件,以便以下控件不再处理它们。另一方面,可见性是相反的,因为最后绘制的控件将位于顶部。

另一个问题是,一旦您移过按钮(当您没有重叠时),自您离开标签区域后,工具提示将不再被设置。这可以通过向Button添加相同的工具提示来简单地解决。

要解决所有问题,您必须使用单独的变量来显示按钮。这应该是一个浮点数,所以你可以定义一点"超时"。这将确保按钮可见并在至少下一帧处理。只要您悬停标签或按钮,每帧都会重新触发超时变量并保持按钮可见。

var tooltipTimer = 0.0;

function OnGUI()
{
    GUI.Label(Rect(700, 200, 140, 20), GUIContent( "test1: " + space + Static.globalTest1[qwqw], "1"));
    if (tooltipTimer > 0 )
    {
        if (Event.current.type == EventType.Repaint)
            tooltipTimer -= Time.deltaTime;
        if(GUI.Button(Rect(800, 205, 50, 50), GUIContent("+", "1")))
        {
            level.addExp(qwqw, 50);
            /// ...
        }
    }
    if(GUI.tooltip == "1")
    {
        tooltipTimer = 1.0; // timeout 1 sec.
    }
}