Unity C#如何实现Toggle切换功能 修复Label状态无法稳定保持的问题
问题原因分析
代码2状态回弹问题
Unity的OnGUI方法每帧会被多次调用,你将isActive定义为OnGUI内的局部变量,每次方法执行时都会被重置为false。只有Insert键按下的那一次调用中isActive会被临时改为true,后续执行立刻恢复默认值,因此会出现变化后瞬间回弹的效果。
代码1无响应问题
你已经将isActive定义为类成员变量可以持久存储状态,但Input.GetKeyDown在OnGUI中调用稳定性差:Input.GetKeyDown仅在物理帧更新的第一帧返回true,而OnGUI每帧会触发多次,很容易错过按键事件,导致状态切换没有触发。
正确实现方案
推荐将按键检测逻辑放到Update方法中(Unity每帧仅调用一次Update,输入检测准确率更高),用类成员变量存储状态,OnGUI仅负责UI绘制,示例代码如下:
// 类成员变量,持久存储开关状态 private bool isActive = false; private void Update() { // Update中检测按键不会丢失事件 if (Input.GetKeyDown(KeyCode.Insert)) { isActive = !isActive; } } private void OnGUI() { // 仅根据当前状态绘制Label GUI.Label(new Rect(0, 0, 500, 500), isActive ? "on" : "off"); }
如果你需要在OnGUI中直接处理输入,也可以通过GUI原生事件检测实现:
private bool isActive = false; private void OnGUI() { // 检测GUI按键按下事件 if (Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Insert) { isActive = !isActive; Event.current.Use(); // 标记事件已处理,避免重复触发 } GUI.Label(new Rect(0, 0, 500, 500), isActive ? "on" : "off"); }
内容的提问来源于stack exchange,提问作者csgoteeqo
相关产品推荐
相关产品推荐

