Unity游戏管理器:跨场景持久化问题及解决方案
问题:
旨在跨场景持久化的游戏管理器脚本,即使存在于所有场景中,也只在项目初始化时执行一次。
原因:
每个Unity项目都需要一个“预加载场景”(preload scene),作为持久化对象和系统的中心枢纽。此场景必须在构建设置中指定为场景0。
解决方案:
创建预加载场景:
添加预加载游戏对象:
应用DontDestroyOnLoad:
在预加载场景中放置通用行为:
在其他场景中查找组件:
要从其他场景访问这些持久化组件,可以使用静态方法“Object.FindObjectOfType
<code class="language-C#">SoundEffects sound = Object.FindObjectOfType<SoundEffects>(); GameState state = Object.FindObjectOfType<GameState>();</code>
可选优化:
为了减少代码重复,可以考虑使用以下全局脚本:
<code class="language-C#">public static class App { public static SoundEffects SoundEffects { get; private set; } public static GameState GameState { get; private set; } static App() { GameObject appObject = GameObject.Find("__app"); SoundEffects = appObject.GetComponent<SoundEffects>(); GameState = appObject.GetComponent<GameState>(); } }</code>
使用此脚本,您可以使用简化的语法访问这些组件:
<code class="language-C#">App.SoundEffects.PlayExplosion(); App.GameState.CurrentLevel = 5;</code>
开发便利性:
为了提高开发效率,可以考虑向“preload”场景添加一个脚本,如果不存在“__app”对象,则在项目初始化时自动加载“preload”场景。这确保了每次单击“Play”时游戏都从“preload”场景启动。
以上是为什么我的 Unity 游戏管理器脚本仅运行一次,以及如何使其在场景中持久存在?的详细内容。更多信息请关注PHP中文网其他相关文章!