Unity Game Manager: クロスシナリオ永続性の問題と解決策
質問:
シーン間で持続するように設計されたゲーム マネージャー スクリプトは、すべてのシーンに存在する場合でも、プロジェクトの初期化時に 1 回だけ実行されます。
理由:
すべての Unity プロジェクトには、永続オブジェクトとシステムの中心ハブとして「プリロード シーン」が必要です。このシナリオは、ビルド設定でシナリオ 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>
開発上の利便性:
開発効率を向上させるために、「__app」オブジェクトが存在しない場合、プロジェクトの初期化中に「preload」シーンが自動的にロードされるように、「preload」シーンにスクリプトを追加することを検討できます。これにより、「Play」をクリックするたびにゲームが「プリロード」シーンから開始されるようになります。
以上がUnity ゲーム マネージャー スクリプトが 1 回しか実行されないのはなぜですか? シーン間で永続的にするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。