シンプルなゲーム マネージャーを作成しています。ゲーム内のすべてのシーンからアクセスできるスクリプトがあります。新しいシーンをロードした後、その変数の値を確認する必要があります。ただし、このスクリプトを含むオブジェクトがすべてのシーンに存在するにもかかわらず、コードはシミュレーションを開始した後に 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 で作業しているときは、「[再生] をクリックする前にプリロード シーンをクリックする」必要があります。他に方法はありません。