统一代表活动

时间:2014-05-11 10:43:51

标签: c# events delegates unity3d

我想在单击按钮时,会在其上显示一些GUI按钮。我已经尝试了委托,但事件没有被触发(我的意思是没有显示GUI按钮)。

以下是我正在使用的代码:

下面的代码是在我运行游戏时显示GUI按钮。

public class IItemDatabase : MonoBehaviour
{
    public delegate void Action(); // Set the event for the button

    public static event Action onClicked; // The event for when the button has been clicked

    protected virtual void OnGUI()
    {
        // Call the SetStyle method
        SetStyle();

        // Set the GUIContent as the tooltip
        GUIContent buttonText = new GUIContent("Open Shop");

        // Set the GUIContent as the tooltip
        GUIContent buttonTexts = new GUIContent("Open Inventory");

        // This GUILayoutUtility is useful because it is to fit the content
        Rect buttonGUI = GUILayoutUtility.GetRect(buttonText, "Button");

        // This GUILayoutUtility is useful because it is to fit the content
        Rect buttonGUIs = GUILayoutUtility.GetRect(buttonTexts, "Button");

        // Set where have to the Rect displayed
        buttonGUI.x = 5;
        buttonGUI.y = Screen.height - 25;

        // Set where have to the Rect displayed
        buttonGUIs.x = 125;
        buttonGUIs.y = Screen.height - 25;

        // If the button has been clicked

        if (GUI.Button(buttonGUI, buttonText, style))
        {
            if (onClicked != null)
            {
                onClicked();
            }
        }

        if (GUI.Button(buttonGUIs, buttonTexts, style))
        {
            if (onClicked != null)
            {
                onClicked();
            }
        }

        // End of the clicked button event
    }
}

以下是我希望单击按钮时显示的内容:

public class IInventory : MonoBehaviour 
{

    protected virtual void OnEnable()
    {
        IItemDatabase.onClicked += DoGUI;
    }

    protected virtual void OnDisable()
    {
        IItemDatabase.onClicked -= DoGUI;
    }

    protected virtual void DoGUI()
    {
       Rect slotRect = new Rect(x * 35 + (Screen.width / 3) + 50, y * 35 + (Screen.height / 3) - 10, 30, 30);
                GUI.Box(slotRect, GUIContent.none);
    }
}

但是当我点击它想要在IInventory类中触发DoGUI()的按钮时,它不会运行该函数。

我该如何解决这个问题?

谢谢。

你的回答非常感谢!

1 个答案:

答案 0 :(得分:2)

您的问题不是活动或代表,而是对OnGUI()工作原理的误解。

每个框架可能会多次调用OnGUI()方法,但只有在您单击按钮后才会调用onClicked个事件。因此,您的库存仅在几毫秒内可见。

有几种方法可以解决这个问题。您的目标是在每次DoGUI()来电期间致电OnGUI(),只要您希望显示广告资源。您可以引入一个布尔值来保存库存菜单的状态,并决定菜单是否可见。如果您希望Open Inventory按钮切换菜单,可以尝试类似

的内容
public class IItemDatabase : MonoBehaviour
{
    public static event Action onClicked; // The event for when the button has been clicked

    private bool showInventory = false;

    protected virtual void OnGUI()
    {
        // I removed your other code to simplify the example

        if (GUI.Button("Open Inventory"))
        {
            // toggle the status
            showInventory = !showInventory
        }

        if (showInventory && onClicked != null)
        {
            onClicked();
        }

    }
}

如果您想保留事件取决于您的应用程序。如果你保留它,我会将其重命名为showInventoryGUI或类似的东西,以更好地反映其意图。另一方面,您可以简单地删除事件,直接调用方法IInventory.DoGUI()