Unity 社区

Unity下编辑模式和PlayMode模式变量的问题

,1 年前
发布于新手答疑
0

问题描述

我在编辑器模式下设置一个静态变量为true了,进入到PlayMode下又自动变回去false了。而在PlayMode下改变了变量的值,退出PlayMode的时候还能保留这个值。这和正常的情况是相反的吧,为什么会出现这种情况呢?
Unity版本 2021.3.26 平台 VS2022 Windows 相关代码 using System; using UnityEditor; using UnityEngine;
public class Test2 : MonoBehaviour {
#if UNITY_EDITOR
[NonSerialized] private static bool GlobalEnable = false;
[MenuItem("Tools/编辑器下分级脚本不生效")] public static void Change() {
GlobalEnable = !GlobalEnable;
Debug.Log("GlobalEnable现在的值为" + GlobalEnable);
Menu.SetChecked("Tools/编辑器下分级脚本不生效", !GlobalEnable);
}
#endif
private void OnEnable() {
Debug.Log("进入OnEnable的范围");
#if UNITY_EDITOR
if (!GlobalEnable) { Debug.Log("GlobalEnable现在的值为" + GlobalEnable);
Debug.Log("现在已经不再分级了");
return;
}
#endif
Debug.Log("OnEnable现在还在继续执行"); }
private void OnDisable() {
#if UNITY_EDITOR
Debug.Log("退出OnDisable的范围");
#endif
}
}
306 次浏览
评论 0
1个回答
0
本回答由团结MuseChat(Beta)生成,请酌情参考。

问题分析

在Unity中,静态变量在编辑器模式和PlayMode模式下的表现是有区别的。在编辑器模式下,静态变量的值会在每次编译或重新启动Unity时重置为初始值,而在PlayMode模式下,静态变量的值会被保留,直到Unity被关闭或重新启动。

解决方案

根据你的描述,静态变量GlobalEnable在编辑器模式下设置为true后,在进入PlayMode模式时又自动变回false,这是因为编辑器模式下的静态变量在重新编译或重新启动Unity时会被重置为初始值。而在PlayMode模式下改变了变量的值,退出PlayMode模式时能保留这个值,这是正常的行为。
如果你希望在编辑器模式下保留静态变量的值,可以考虑使用EditorPrefs来保存和读取变量的值,这样可以在Unity重新启动时保留变量的值。示例代码如下:
using UnityEditor; using UnityEngine; public class Test2 : MonoBehaviour { private const string GlobalEnableKey = "GlobalEnable"; private static bool GlobalEnable { get { return EditorPrefs.GetBool(GlobalEnableKey, false); } set { EditorPrefs.SetBool(GlobalEnableKey, value); } } [MenuItem("Tools/编辑器下分级脚本不生效")] public static void Change() { GlobalEnable = !GlobalEnable; Debug.Log("GlobalEnable现在的值为" + GlobalEnable); Menu.SetChecked("Tools/编辑器下分级脚本不生效", !GlobalEnable); } private void OnEnable() { Debug.Log("进入OnEnable的范围"); if (!GlobalEnable) { Debug.Log("GlobalEnable现在的值为" + GlobalEnable); Debug.Log("现在已经不再分级了"); return; } Debug.Log("OnEnable现在还在继续执行"); } private void OnDisable() { Debug.Log("退出OnDisable的范围"); } }
通过使用EditorPrefs来保存静态变量的值,可以在编辑器模式下保留变量的值,而不会在重新编译或重新启动Unity时被重置。希望这个解决方案能帮助到你。如果有任何疑问,请随时提出。
[1] 团结引擎 - 手册: 静态游戏对象 https://docs.unity.cn/cn/tuanjiemanual/Manual/StaticObjects.html
[2] 团结引擎 - 手册: 域重新加载 https://docs.unity.cn/cn/tuanjiemanual/Manual/DomainReloading.html
[3] 团结引擎 - 手册: 变量和 Inspector https://docs.unity.cn/cn/tuanjiemanual/Manual/VariablesAndTheInspector.html
[4] 团结引擎 - 手册: 选择和配置渲染管线和光照解决方案 https://docs.unity.cn/cn/tuanjiemanual/Manual/BestPracticeLightingPipelines.html
[5] 团结引擎 - 手册: 全景视频 https://docs.unity.cn/cn/tuanjiemanual/Manual/VideoPanoramic.html
[6] 团结引擎 - 手册: 立方体贴图 https://docs.unity.cn/cn/tuanjiemanual/Manual/class-Cubemap.html
[7] 团结引擎 - 手册: 导入纹理 https://docs.unity.cn/cn/tuanjiemanual/Manual/ImportingTextures.html
[8] 团结引擎 - 手册: 可配置的进入运行模式 https://docs.unity.cn/cn/tuanjiemanual/Manual/ConfigurableEnterPlayMode.html
[9] 团结引擎 - 手册: 场景重新加载 https://docs.unity.cn/cn/tuanjiemanual/Manual/SceneReloading.html
[10] 团结引擎 - 手册: 启动时运行 Editor 脚本代码 https://docs.unity.cn/cn/tuanjiemanual/Manual/RunningEditorCodeOnLaunch.html
[11] 团结引擎 - 手册: 选择和配置渲染管线和光照解决方案 https://docs.unity.cn/cn/tuanjiemanual/Manual/BestPracticeLightingPipelines.html
[12] 团结引擎 - 手册: 基于可编程渲染管线创建自定义渲染管线 https://docs.unity.cn/cn/tuanjiemanual/Manual/srp-custom-getting-started.html
[13] 团结引擎 - 手册: Post-processing and full-screen effects https://docs.unity.cn/cn/tuanjiemanual/Manual/PostProcessingOverview.html
[14] 团结引擎 - 手册: Universal RP https://docs.unity.cn/cn/tuanjiemanual/Manual/com.unity.render-pipelines.universal.html
1 年前回答
评论 1
本答案由团结MuseChat(Beta)自动生成,申请使用,反馈渠道

AI

全新AI功能上线

1. 基于Unity微调:专为Unity优化,提供精准高效的支持。

2. 深度集成:内置于团结引擎,随时查阅与学习。

3. 多功能支持:全面解决技术问题与学习需求。

AI