首页 >后端开发 >C++ >为什么我的 Unity 游戏管理器脚本仅运行一次,以及如何使其在场景中持久存在?

为什么我的 Unity 游戏管理器脚本仅运行一次,以及如何使其在场景中持久存在?

Barbara Streisand
Barbara Streisand原创
2025-01-14 08:06:43816浏览

Why Does My Unity Game Manager Script Only Run Once, and How Can I Make It Persistent Across Scenes?

Unity游戏管理器:跨场景持久化问题及解决方案

问题:

旨在跨场景持久化的游戏管理器脚本,即使存在于所有场景中,也只在项目初始化时执行一次。

原因:

每个Unity项目都需要一个“预加载场景”(preload scene),作为持久化对象和系统的中心枢纽。此场景必须在构建设置中指定为场景0。

解决方案:

  1. 创建预加载场景:

    • 在构建设置中,添加一个名为“preload”的新场景,并将其指定为场景0。
  2. 添加预加载游戏对象:

    • 在预加载场景中,创建一个名为“__app”的空游戏对象。
  3. 应用DontDestroyOnLoad:

    • 向“__app”游戏对象添加“DontDestroyOnLoad”脚本(或组件)。此脚本确保对象及其组件在场景切换时保持持久化。
  4. 在预加载场景中放置通用行为:

    • 所有共享的游戏逻辑,例如数据库连接、音效和计分,都应放置在预加载场景中的“__app”游戏对象上。

在其他场景中查找组件:

要从其他场景访问这些持久化组件,可以使用静态方法“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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn