我想在单击按钮时,会在其上显示一些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()的按钮时,它不会运行该函数。
我该如何解决这个问题?
谢谢。
你的回答非常感谢!
答案 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()
。