前回は文字を出力して、オブジェクトを移動させるところまでいきました。今回はUnityでのスクリプトの実行順について解説したいと思います。
↑の動画でも解説していますので、こちらも是非ご活用ください。
この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。
<プログラムの流れ>
さて、プログラムを書き始めるにあたって、どういう流れで命令が実行されていくのかを理解しておかないと処理がぐちゃぐちゃになってしまいます。
というわけで、プログラムがどのような順番で処理されていくのかを解説していきます。
StartとUpdate
前回、スクリプトを作成した時デフォルトで書かれているStartとUpdateは特別な機能を持っていると解説しました。
・Startはこの設計図がゲーム内で実体化+有効の両方を満たす時Unity側から1回だけ呼ばれます。
・Updateは有効な時にゲーム中毎フレームUnity側から呼ばれます。
まぁ、何言っているかわからないと思うので、とりあえずやってみましょうか。
↑Startでスタートと表示、Updateでアップデートと表示するようにしています。
このスクリプトを適当なゲームオブジェクトにアタッチして再生すると↓のようになります。
1回だけスタートが実行されて、その後アップデートが何回も実行されている事がわかります。
スタートはスクリプトが有効になってから最初に1回呼ばれるので「スタート」が1回だけ表示されています。
現在スクリプトは再生すると有効な状態になっています。
その後、アップデートは毎フレーム呼ばれるので何回も呼ばれている感じです。
「呼ばれる」というのはUnityがこのメソッドを呼び出している事です。(これはMonoBehaviourを継承しているからです)
フレームが何かというのは↓の記事で解説していますので、興味がある方は見てみてください。
メソッドの中の処理の順番
プログラムの世界では処理の順番というものがあり、基本的に上から下へ流れていきます。
例えば↓のように書くと
↓このように表示されます
上から順番に処理されていることがわかります。
このようにプログラミングでメソッドの中に命令を書くと上から下に流れていくのが基本となります。
メソッドの位置による実行順
さて、メソッド内では上から下に流れる感じで実行されました。
では各種メソッドはどのような順で呼ばれるのでしょう?StartとUpdateを逆に書いてやってみましょう。
↑のような感じにして再生してみます。
するとスタートとアップデートの表示は変わりませんでした。
このようにメソッドの中では上から下へ流れる順序で処理されますが、これはメソッドの中だけの話なのでStartとUpdateを反対にしてもStartから処理されます。
メソッドはどこかから呼び出されたら処理されます。Unity側がStartの方を先に呼び出しているわけです。
そのためメソッドを書いた順序は処理順に関係ありません。
スクリプトが複数ある時のStartとUpdate
さて、StartとUpdateの呼ばれる順はわかったかなと思います。
ところでスクリプトが2つあるとどうなるのでしょうか。ちょっとやってみましょう。
同じゲームオブジェクトに2種類の違うスクリプトをアタッチします。
↑1個のゲームオブジェクトに新しくスクリプトを作って更にアタッチしてみました。
片方を0として、もう片方を1とします(適当です)
Debug.Logで0と1がわかるようにしてログを出すようにしています。
この状態で再生すると↓のようになります。
1のStart→0のStart→1のUpdate→0のUpdate→1のUpdate→・・・・
ってなっています。
Unityはファイル毎にStart→Updateと呼んでいるわけではなく、全部のスクリプトのStartを呼んで、その後全部のスクリプトのUpdateを呼んでいます。
ちなみに1と0が逆になっているように見えますが、どのスクリプトの関数から呼び出すかはランダムです。ランダムといっても常に変動するわけではなく端末ごとに変わります。自分のPCでは1→0でしたが、他の人のPCでやると0→1になる可能性があります。
また、再起動したり、Unityを立ち上げ直したり、ゲームオブジェクトを作り直したりすると逆になったりする事があります。
このようにプログラムには処理をする順番があるということを覚えておいてください。
他のプログラムが動いている事を前提にプログラムを組んでしまうと、自分の環境では動くけど、他の人の環境では動かないといった自体になります。スクリプトの実行順に依存しないようなプログラムの設計をしましょう。
でないとデバッグの際に痛い目を見てしまいます。
<スクリプトの有効化・無効化>
MonoBehaviourを継承している場合、スクリプトには有効な状態と無効な状態があります。
有効な状態だとスクリプトがUnity側から呼ばれて、無効な状態だとUnity側から呼ばれません。
有効かどうかというのはインスペクターウィンドウでチェックがついているかどうかになります。
ゲームオブジェクト側の赤丸はゲームオブジェクト自体が有効かどうかです。
スクリプト側の赤丸はコンポーネントが有効かどうかです。スクリプトをゲームオブジェクトにアタッチするとコンポーネントになります。
チェックがついていると有効で、ついてないと無効です。この有効な状態をアクティブ、無効の状態を非アクティブと言います。
無効な状態にしているとその機能は動きません。
動きませんが、インスタンス化はされています。無効ではあるものの実体化はしているのでご注意ください。
ちなみに、チェックする場所がないコンポーネントもいます。これはそれ単体では動かず、何かから呼ばれないと動かないものです。有効か無効かではなく、呼ばれるか呼ばれないかですので、自分がプログラムで意図的に呼ばないと動かないものになります。
スクリプトが無効になっている場合はStartとUpdateは呼ばれません。
ゲームオブジェクトが無効になっている場合、スクリプトが有効になっていても呼ばれません。
ちなみに、無効になっている状態で再生ボタンを押し
途中から有効化すると、有効にした瞬間からStartが呼ばれます。
再生状態でチェックボックスをクリックすれば再生中でも有効化無効化できます。
何回も有効化無効化を繰り返してもStartは1回しか呼ばれません。
このことからStartで初期化の処理を書くことも多いです。
さて、まだまださわり部分しかしてませんが、こういったことを覚えておかないと後で痛い目にあったりするのでちゃんと解説していきたいと思います。