Unity初心者講座:ライフサイクルを正しく覚える

前回は、慣れる意味もあって、スクリプトを追加して動かしてみました。しかし、Start関数が呼ばれるのはどういったタイミングなのかなどを勉強したいと思います。また、Start関数以外にも、同等の関数があるので合わせて覚えて下さい

Unityのライフサイクルとは?

ライフサイクルというのは、簡単に説明すると、Unityの処理がどういった順番で行われているかというものです。

ライフサイクルの概要をつかむ

こちらはかなり簡略化していますが、初期化系の関数を通って、実行系の処理がしばらく行われます。そして、オブジェクトが停止したり削除されたりすると停止・終了系を介して役目を終えます。

初期化系の赤文字は停止から再始動する際には呼ばれないものです。

FixedUpdateとUpdateも同じ回数呼ばれるように見えますが厳密には違いますが、今回は実行系の位置を覚える程度にとどめてください。

ライフサイクルをスクリプトで掴む

では、実際にスクリプトではどのように呼ばれるか確認してみたいと思います。

public class TestScript : MonoBehaviour
{
    void Start()
    {
		Debug.Log("Start");
    }
	void Awake()
	{
		Debug.Log("Awake");
	}
	void OnEnable()
	{
		Debug.Log("OnEnable");
	}
	void Update()
    {
		Debug.Log("Update");        
    }
	void OnDisable()
	{
		Debug.Log("OnDisable");
	}
	void OnDestroy()
	{
		Debug.Log("OnDestroy");
	}
}

前回から使っているTestScriptを使います。新たにAwake,OnEnable,OnDisable,OnDestroyの4つの関数を追加しました。

この関数名は名前が正確に一致している必要がありますので、タイプミスをしないように注意して下さい。

初期化系と実行部分を確認する

この状態で一度ゲームを実行してみて下さい。下図のようなログが確認できれば成功です。

初期化系のものが3つ並んで表示された後に、Updateのログがダーーーーーーっと表示されていると思います。これは初期化系が終わって、実行系に滞在しているからこのようになって正解です。

オブジェクト(スクリプト)の停止・再開

次にOnDisableの確認をしたいのですが、オブジェクト(スクリプト)の停止と再開の手順を覚える必要があります。今回のチェックをする分には、オブジェクトを止める方法とスクリプトを止める方法の2種類があります。

ヒエラルキーにあるCubeを選択して、インスペクターのCubeと書いてある左側のチェックボックスのチェックを外すとオブジェクトの停止をすることが出来ます。

よく使う方法としては、オブジェクトごと停止させるほうが利用回数が多いので、今回はCubeの左隣のチェックボックスのOn/Off方法を覚えて下さい。

停止時のログ

ではオブジェクトを停止させてみましょう。Cubeの左側のチェックボックをはずすと、GameウィンドウからCubeが消えます。そのタイミングで、コンソールのログにOnDisableが表示されてピタリと停止します。

これは、今まで実行中だったものが、停止処理を行ってから、動かなくなっている証拠です。

再開時のログ

停止させた状態で、再度チェックボックスにチェックを入れるとオブジェクトが再開されて、再び表示されるようになります。注意点として、再開前にコンソールウィンドウのClearボタンでログをきれいにしておくとこの後の再開後のログが見やすくなります。

再開すると再びCubeが表示されます。

この時のログは、初期化部分を通るのですが、実行されるのはOnEnableだけで、その後は再びUpdateが呼ばれます。

削除時の確認

最後にOnDestroyを確認するため、オブジェクトの削除を行います。削除するにはヒエラルキーのCubeを右クリックして、Deleteを選択するだけです。

うまく削除ができると、画面からCubeが消えます。ログには停止>終了という形で、OnDisable>OnDestroyという順番で呼ばれているのを確認出来ます。

まとめ

以上で簡単なライフサイクルの呼び出しとその確認を行いました。

あまりこの特性を理解しないで作っている人が多いので、これを機会にしっかりと覚えておいて下さい。

プログラムっぽいことをすると言っていたんですが、次回からですね。申し訳ない