ホームページ >バックエンド開発 >C++ >Unity ゲーム マネージャー スクリプトが 1 回しか実行されないのはなぜですか?

Unity ゲーム マネージャー スクリプトが 1 回しか実行されないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-14 07:01:47926ブラウズ

Why Does My Unity Game Manager Script Only Run Once?

Unity Game Manager のトラブルシューティング: 単一実行の問題

問題の概要

Unity ゲーム開発では、シーン全体にわたる永続的なゲーム マネージャーが非常に重要です。 ただし、よくある問題は、スクリプトがすべてのシーンに存在するにもかかわらず、最初に 1 回だけ実行されることです。

根本原因: プリロード シーンが欠落している

Unity には自動プリロード メカニズムがありません。 専用のプリロード シーンがないと、ゲーム マネージャーの初期化と重要なコンポーネントはシーンの遷移に耐えることができません。

解決策: プリロード シーンの実装

これを修正する方法は次のとおりです:

  1. プリロード シーンの作成: 新しいシーン (例:「プリロード」) を追加し、ビルド設定でシーン 0 にします。
  2. ゲーム オブジェクトの追加: 「Preload」シーンで、「_app」という名前の空のゲームオブジェクトを作成します。
  3. 「読み込み時に破壊しない」を有効にする: 「_app」のインスペクターで、「読み込み時に破壊しない」ボックスをオンにします。

ゲームマネージャーコンポーネントのアタッチ

すべてのコア ゲーム マネージャー機能 (データベース接続、サウンド管理、スコア追跡など) は、プリロード シーンの「_app」ゲームオブジェクトにコンポーネントとしてアタッチされる必要があります。 これにより、後続のすべてのシーンでの永続性が保証されます。

他のスクリプトからゲーム オブジェクトにアクセスする

他のスクリプトからゲーム オブジェクトにアクセスするには、2 つのメソッドが存在します。

方法 1: FindObjectOfType

これをスクリプトの Awake() メソッドで使用します:

<code class="language-C#">Sound sound = Object.FindObjectOfType<Sound>();
Game game = Object.FindObjectOfType<Game>();</code>

方法 2: 静的グローバル変数 (より効率的)

より合理化されたアプローチでは、静的グローバル変数を使用します。

<code class="language-C#">public static class GameManager
{
    public static Sound sound;
    public static Game game;

    static GameManager()
    {
        GameObject app = GameObject.Find("_app");

        sound = app.GetComponent<Sound>();
        game = app.GetComponent<Game>();
    }
}</code>

概要

プリロード シーンを作成し、ゲーム マネージャー コンポーネントを永続的なゲームオブジェクトにアタッチすることで、すべての Unity シーンで一貫した実行が保証されます。 コーディング スタイルに最適なオブジェクト アクセス方法を選択してください。

以上がUnity ゲーム マネージャー スクリプトが 1 回しか実行されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。