Unityゲームマネージャー。スクリプトは1回だけ動作します。質問する

Unityゲームマネージャー。スクリプトは1回だけ動作します。質問する

シンプルなゲーム マネージャーを作成しています。ゲーム内のすべてのシーンからアクセスできるスクリプトがあります。新しいシーンをロードした後、その変数の値を確認する必要があります。ただし、このスクリプトを含むオブジェクトがすべてのシーンに存在するにもかかわらず、コードはシミュレーションを開始した後に 1 回しか実行されません。何が問題なのでしょうか。新しいシーンをロードした後、なぜ機能しないのでしょうか。

ベストアンサー1

すべての Unity プロジェクトには、PRELOAD SCENE が必要です。

Unity にプリロード シーンが「組み込まれて」いないのは非常に混乱を招きます。

将来的にはこのコンセプトが追加される予定です。

今では、プリロード シーンを自分でクリックして追加する必要があります。

これは、Unity を試用する新しいプログラマーにとって最大の誤解です。


幸いなことに、プリロードシーンを作成するのは非常に簡単です。

ステップ1。

「preload」という名前のシーンを作成します。シーン0ビルド マネージャーで。

ここに画像の説明を入力してください

ステップ2。

「preload」シーンで、「__app」という空の GameObject を作成します。

単にDontDestroyOnLoad「__app」をインストールするだけです。

注記:

これはプロジェクト全体で唯一の場所あなたが使うDontDestroyOnLoad

とても簡単です。

ここに画像の説明を入力してください

この例では、開発者は 1 行の DDOL スクリプトを作成しました。

そのスクリプトを「__app」オブジェクトに配置します。

もうDDOLについて考える必要はありません。

ステップ3

アプリには (多くの)「一般的な動作」があります。つまり、データベース接続、サウンド効果、スコアリングなどです。

一般的な動作は「_app」にのみ記載する必要があります。

本当にそれだけです。

一般的な行動は、もちろん、プロジェクトのあらゆる場所、いつでも、あらゆるシーンで利用可能

他にどうやってできるでしょうか?

上記の画像の例では、「Iap」(「アプリ内購入」)などに注目してください。

サウンド効果やスコアリングなど、一般的に必要な動作はすべてそのオブジェクト上にあります。

重要...

これは、当然のことですが、

...一般的な動作には、Unity の他の部分と同様に、通常のインスペクターが存在します。

他のすべてのゲーム オブジェクトで使用する Unity の通常の機能をすべて使用できます。インスペクター変数、ドラッグして接続、設定など。

(実際、既存のプロジェクトに携わるために雇われたとしましょう。まず最初に、プリロードシーンをチラッと見るでしょう。プリロードシーンの「一般的な動作」、つまりサウンドエフェクト、スコアリング、AIなどがすべて表示されます。設定インスペクター変数として、音声音量、プレイストア ID などを使用します。

「サウンド効果」の一般的な動作の例を次に示します。

ここに画像の説明を入力してください

「ボイスオーバー」の一般的な動作や「音楽」の一般的な動作もあるようです。

繰り返しますが、あなたの「一般的な行動」についてです。(効果音、スコアリング、ソーシャルなどなど)これらは行けるだけプリロードシーンのゲームオブジェクト上。

これはオプションではありません。代替手段はありません。

とても簡単です。

他の環境から来たエンジニアは、「そんなに簡単なはずがない」と思われるため、これにとらわれてしまうことがあります。

繰り返しますが、Unity はプリロード シーンを「組み込む」ことを単に忘れています。したがって、プリロード シーンを追加するには、クリックするだけです。DDOL を追加することを忘れないでください。

したがって、開発中は次のようになります。

常にプリロードシーンからゲームを開始してください。

とても簡単です。

重要: アプリには必ず「初期」シーンが含まれます。例:

  • 「スプラッシュスクリーン」
  • "メニュー"

注記。できないスプラッシュやメニューをプリロードシーンとして使用します。個別のプリロードシーン

プリロードシーンその後ロードされますスプラッシュやメニュー、その他の初期シーン。


中心的な問題: 他のスクリプトからそれらを「見つける」こと:

つまり、プリロードシーンが存在します。

すべての「一般的な動作」は、単にプリロード シーンにあります。

次に、単純に「SoundEffects」を検索するという問題が発生します。

あらゆるスクリプト、あらゆるゲーム オブジェクト、あらゆるシーンから簡単に見つけられる必要があります。

幸いなことにとても簡単、これは 1 行のコードです。

Sound sound = Object.FindObjectOfType<Sound>();
Game game = Object.FindObjectOfType<Game>();

Awake必要なスクリプトの場合は、でそれを実行します。

正直言って、とても簡単です。それだけです。

Sound sound = Object.FindObjectOfType<Sound>();

100以上の絶対に間違っているオンラインで見られるコード例。

本当に簡単ですよ - 正直に言うと!

Unity が、SoundEffects、GameManager などのシステムをアタッチする場所である組み込みの「プリロード シーン」を追加するのを忘れているのは奇妙です。これは、Unity の奇妙な点の 1 つです。したがって、Unity プロジェクトで最初に行うことは、1 回クリックしてプリロード シーンを作成することです。

それでおしまい!


詳細...

もし本当にもっと少ないコード行を入力したいのであれば、それは驚くほど簡単です。グローバルを使用するだけですこれらすべてについて!

これについては詳しく説明しますここ今では多くの人が Grid.cs スクリプトのようなものを使用しています...

 using Assets.scripts.network;
 using UnityEngine;
 
 static class Grid
 {
     public static Comms comms;
     public static State state;
     public static Launch launch;
     public static INetworkCommunicator iNetworkCommunicator;
     public static Sfx sfx;
 
     static Grid()
     {
         GameObject g = GameObject.Find("_app");
 
         comms = g.GetComponent<Comms>();
         state = g.GetComponent<State>();
         launch = g.GetComponent<Launch>();
         iNetworkCommunicator = g.GetComponent<INetworkCommunicator>();
         sfx = g.GetComponent<Sfx>();
     }
 }

そして、プロジェクトのどこでも

Grid.sfx.Explosions();

それはとても簡単です。それがすべてです。

これらの「一般的なシステム」はそれぞれ、プリロード シーンの DDOL ゲーム オブジェクト上に存在し、その上にのみ存在できることを忘れないでください。


DylanB はこう尋ねます: "開発中「再生」をクリックする前に毎回プリロードシーンをクリックする必要があるのは非常に面倒です。これを自動化できますか?」

もちろん、チームごとにやり方は異なります。簡単な例を挙げてみましょう。

// this should run absolutely first; use script-execution-order to do so.
// (of course, normally never use the script-execution-order feature,
// this is an unusual case, just for development.)
...
public class DevPreload:MonoBehaviour
 {
 void Awake()
  {
  GameObject check = GameObject.Find("__app");
  if (check==null)
   { UnityEngine.SceneManagement.SceneManager.LoadScene("_preload"); }
  }
 }

しかし、忘れないでください。他に何ができるでしょうか?ゲームはプリロードシーンから開始する必要があります。ゲームを開始するために、クリックしてプリロード シーンに移動すること以外に何ができるでしょうか? 「Unity を実行するために Unity を起動するのは面倒です。Unity を起動しないようにするにはどうすればいいですか?」と尋ねるのと同じことです。もちろん、ゲームはプリロード シーンから開始する必要があります。他に方法はありません。したがって、Unity で作業しているときは、「[再生] をクリックする前にプリロード シーンをクリックする」必要があります。他に方法はありません。

おすすめ記事