c# - 根据 bool 值更改单击时的按钮文本颜色

标签 c# unity-game-engine

一般信息
为游戏模组开发一个简单的 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 查找/调用此函数(我认为*)。以防万一永远不会被调用,您的 enabledTextdisabledText 变量将不会被初始化,这将导致空引用异常。

* 你可以使 Start() 异步或使其返回 IEnumerator,但我不认为 static 有效,因为它应该被每个对象调用,而不是全局调用。 https://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html

关于c# - 根据 bool 值更改单击时的按钮文本颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75074287/

相关文章:

c# - 在Unity中正确管理共享dll

c# - 为什么这段代码在 Unity 中不能用于双跳?

c# - fastJSON 反序列化列表

c# - C# 中的匹配标签

c# - Unity PUN RPC 来自另一个类的调用

c# - 在没有 yield 关键字的情况下实现 Linqs Select。无法遵循控制流程

c# - 使用来自 $http post 服务的模型重定向到 MVC View

c# - 将未知的 JSON 字符串转换为正确的对象

c# - 在 VS2015 的 C# 项目中查找引用程序集的用法

c# - 使用 JSON.NET 在 C# 中将部分 json 反序列化为数据表