一般信息
为游戏模组开发一个简单的 2D Gui,以通过按钮启用/禁用模组功能。
问题
当用户单击按钮时,文本从“功能:关闭”更改为“功能:打开”,反之亦然。它使用一个简单的 bool 值来完成此操作。为了让用户更清楚哪些功能已启用/禁用,我也尝试更改文本颜色。
我为实现这一目标所做的努力
我自己做了一些研究,我清楚按钮上文本的颜色可以更改如下:
private static GUIStyle enabledText;
private static GUIStyle disabledText;
public static void Start()
{
enabledText = new GUIStyle(GUI.skin.button);
enabledText.normal.textColor = Color.green;
disabledText = new GUIStyle(GUI.skin.button);
disabledText.normal.textColor = Color.red;
}
然后在需要的地方:
GUILayout.Button("Label", style);
以下是我如何实现按钮的示例:
if (GUILayout.Button("God Mode: " + (s_isGodMode ? "On" : "Off")))
{
s_isGodMode = !s_isGodMode;
}
因此,将其与之前完成的研究放在一起,结果将是:
if (GUILayout.Button("God Mode: " + (s_isGodMode ? "On" : "Off"), (s_isGodMode ? enabledText : disabledText)))
{
s_isGodMode = !s_isGodMode;
}
编译良好,没有任何错误或警告。但是,当尝试加载它时,我会看到:
[Error : Unity Log] NullReferenceException: Object reference not set to an instance of an object
Stack trace:
UnityEngine.GUILayoutUtility.DoGetRect (UnityEngine.GUIContent content, UnityEngine.GUIStyle style, UnityEngine.GUILayoutOption[] options) (at :0)
UnityEngine.GUILayoutUtility.GetRect (UnityEngine.GUIContent content, UnityEngine.GUIStyle style, UnityEngine.GUILayoutOption[] options) (at :0)
UnityEngine.GUILayout.DoButton (UnityEngine.GUIContent content, UnityEngine.GUIStyle style, UnityEngine.GUILayoutOption[] options) (at :0)
UnityEngine.GUILayout.Button (System.String text, UnityEngine.GUIStyle style, UnityEngine.GUILayoutOption[] options) (at :0)
QualityOfLife.QOL.Core.Cheats.DisplayGUI () (at <98e4be18d16b445790f620c81671da54>:0)
QualityOfLife.QOL.EntryPoint.ValheimToolerWindow (System.Int32 windowID) (at <98e4be18d16b445790f620c81671da54>:0)
UnityEngine.GUILayout+LayoutedWindow.DoWindow (System.Int32 windowID) (at :0)
UnityEngine.GUI.CallWindowDelegate (UnityEngine.GUI+WindowFunction func, System.Int32 id, System.Int32 instanceID, UnityEngine.GUISkin _skin, System.Int32 forceRect, System.Single width, System.Single height, UnityEngine.GUIStyle style) (at :0)
生成的菜单只是一个空白矩形。删除第二个参数来更改 GUI 按钮文本颜色可以解决问题并使其再次完美运行。我究竟做错了什么?我应该如何解决这个问题?
最佳答案
你有:
public static void Start()
为什么是静态的?你的类是 MonoBehaviour 类吗?不应该是静态的,以便 Unity 查找/调用此函数(我认为*)。以防万一永远不会被调用,您的 enabledText
和 disabledText
变量将不会被初始化,这将导致空引用异常。
* 你可以使 Start()
异步或使其返回 IEnumerator,但我不认为 static
有效,因为它应该被每个对象调用,而不是全局调用。 https://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html
关于c# - 根据 bool 值更改单击时的按钮文本颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75074287/