2016-11-01 7 views
1

ユニティのマニュアルは、このラインを持っている:デフォルトではユニティスクリプトの実行順序とスタート()

、異なるスクリプトの目覚め、OnEnableおよび更新機能は(任意である)スクリプトがロードされている順序で呼び出されます。

だから私はここに二つの質問している: "任意" は、この文脈で何を

  1. を意味するのでしょうか?ランダムですか?
  2. これには、Awake()の横にStart()が含まれていますか?Start()には、プロジェクトの設定でその順序が変更されていても、

私はUnityは、それが実行されるとき、それは何かが時間の一部を動作しますが、残りの時間は、それがクラッシュか何かでの原因のようにそれはそう、特に以来、どのように動作するかを「決定」する方法しばらくの間、不思議に思っていました説明はほとんどありませんが、ドキュメンテーションはそれほど多くのことを言及しておらず、私は他の場所で多くの情報を見つけることができません。

+1

これらの方法でいくつかのデバッグ出力を設定してゲームスクリプトを実行すると、 'Awake'が何かを出力し、' Start'が何か他のものを表示し、最初 – Martin

+0

http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html – Everts

+0

4年半前のバグがこの質問に関連するかどうかわからない – DisturbedNeo

答えて

2

この文は何らかの形で混乱します。

awake、OnEnableおよびUpdate は常にと呼ばれます。

1.この文脈で「任意」とは何ですか?ランダムですか?

はい、そのランダム。ただし、ではなく、で、Awake、OnEnable、Updateの各機能について説明しています。スクリプトについて話しています。スクリプトはランダムに選択して実行します。

2.Doesが、これもアウェイク()と一緒にスタートを()が含まれ、または[スタート]()はその順序がに変更された場合でも、スクリプト 実行順序に従わない独自の特別な行動を持っていませんプロジェクト を設定しますか?

回答#1は質問#2にも回答する必要があります。 これは、Start()Awake()やOnEnable()などのコールバック関数には影響しません。

私はUnityがそれ 実行は、それが何かのように思える、特に以来 時間が、それはクラッシュを引き起こしたり、時間の残りの一部を動作するとき、それがどのように動作するかを「決定」する方法しばらくの間、不思議に思っていました 少しでもない説明

はい、これは該当します。これは私にも過去に起こったことです。これは、多くのスクリプトを含む大規模なプロジェクトがある場合に起こりがちです。スクリプトはランダムに呼び出されます。 GetComponentが機能しなくなったため、null例外エラーが発生することがあります。このため、Script Execution Order Settingsが作成され、スクリプトの実行順序をいつでも設定できるようになります。

このような問題を解決するには、GetComponentをコルーチン関数で実行する必要があります。その後、nullかどうかをチェックします。 nullの場合は、1フレーム待ってからGetComponentをもう一度試してください。

これもまた、コールバック関数が呼び出され/呼び出される順序ではなく、スクリプトが実行される順序に適用されます。

+1

明確にする:実行順序は、例えば異なるスクリプトのすべての 'Start'関数は、デフォルトでランダムです。時には、 'スクリプトA'から'スタート 'が最初に実行され、'スクリプトB 'から 'スタート'が実行されることもありますが、 'Awake'関数はすべて最初の'開始 '関数の前に実行されます。 –

+0

私はイベント関数の順番、つまりAwake - > Start - > OnEnable - > Updateについて知っています。すべてのStart関数が呼び出される前にすべてのスクリプトのAwake関数が呼び出されます。私が知りたいのは、ユニティがどのように「目覚め」機能の順番を決めるかということでした。そして、あなたは答えました、それは無作為です、率直に言って私はかなりばかだと思いますが、それは私が想像するUnityです。ありがとう。 – DisturbedNeo

+0

はい、そのランダムです。乱数イベントは、ランダムスクリプトが選択されたときに開始されます。選択したランダムスクリプトは、Awake関数を呼び出します。あなたを訂正するためには、目覚め - > OnEnable-> Start-> Updateの順です。 @ GunnarB私はそれが正しいと思うし、実行するように選択されているスクリプトに依存します。 – Programmer

0

質問1

https://docs.unity3d.com/Manual/class-ScriptExecution.htmlによると、手動でオーダースクリプトの負荷を設定することができます。あなたが順序を設定しない場合、私の推測では、Unityが)(ランダム、アルファベット順か何か)

質問2

アウェイク()オールウェイズ・スタート(前に実行し、いくつかの事前定義された順序を使用してときに呼び出されるということですスクリプトがロードされましたhttps://docs.unity3d.com/ScriptReference/MonoBehaviour.Awake.html

スクリプトを特定の順序でロードするには、スクリプトの実行順序を使用する必要があります。特定の順序で各オブジェクトのStart()関数を実行するには、必要な順序でオブジェクトをインスタンス化する「Manager」オブジェクトを作成する必要があります。

+0

何も設定していない場合、順序はランダムです。私はAwake()がStart()の前に実行されていることを知っています。これは、ドキュメンテーションがそうではないことを暗示しているためです。 – DisturbedNeo

+0

私はこの質問をよく理解していません。 Start()は、オブジェクトがスクリプトを有効にするとすぐにUpdate()が実行される直前に実行されます。そのため、異なるStart()が実行される順序は、スクリプトを有効にする順序によって決まります。 – Aidin

+0

まあまあ、混乱します。ドキュメンテーションでは、スクリプトの実行順序で "Awake、OnEnable、Update Functions"が呼び出されますが、Start()は記述されていないので、シーンが最初に起動したとき、Awake関数がすべて呼び出された後にStart機能。彼らは同じ順序で呼び出されますか、とにかくその順序は任意です。それは目覚めた機能とは異なる順序になりますか? – DisturbedNeo