首頁 > 後端開發 > C++ > 為什麼我的 Unity 遊戲管理器腳本只運行一次,以及如何使其在場景中持久存在?

為什麼我的 Unity 遊戲管理器腳本只運行一次,以及如何使其在場景中持久存在?

Barbara Streisand
發布: 2025-01-14 08:06:43
原創
818 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板