この記事はUnityの基本的な使い方を解説するシリーズの一つで、今回はC#スクリプトの特殊な関数(イベント関数)について詳しくご説明します。
UnityでC#スクリプトを新しく作ると、最初からStart関数やUpdate関数が書かれています。ここではそのような特殊な関数の役割等について説明します。
イベント関数について
まずはじめに、Untiy特有の特殊な関数(イベント関数)について簡潔にご説明します。
UnityのC#スクリプトでは、特定のタイミングでUnityが実行する「イベント関数」というものがあります。イベント関数にはいくつか種類があるのですが、主なものとしてはC#スクリプトを新規作成したときに最初から書かれている
- Start関数
- Update関数
などがあります。これらの関数は書いておくだけでUnity側が特定のタイミングで自動的に呼び出してくれるので、うまく使いこなせるようになると便利です。
主なイベント関数
ではここから主なイベント関数について一つ一つ丁寧に解説していきます。ここでご紹介するイベント関数は次のとおりです(※下記以外にも色々なイベント関数があるので、興味のある方は別途ググって頂けると理解が深まると思います)。
- Start関数
- Update関数
- Awake関数
- FixedUpdate関数
- LateUpdate関数
- OnEnable関数
- OnDisable関数
- OnDestroy関数
それぞれ詳しく見ていきましょう。
Start関数
まずはStart関数です。Start関数は主にゲームオブジェクトの初期化に使われるイベント関数で、後述するAwake関数のあと・Update関数の前のタイミングで1回だけ実行されます(つまりAwake→Start→Updateの順)。
Start関数はシーンが始まった時に変数を初期化したり、他のゲームオブジェクトやスクリプトをキャッシュ(=参照を取得して変数に入れておくこと)したりするときに活躍します。
Update関数
お次はUpdate関数です。こちらは1フレームに1回の頻度で呼び出される関数で、毎フレーム実行する処理(例えばキー入力等の受付)を行うのに使われます。頻繁に呼び出されるので、当たり前ですが重い処理はなるべく行わないようにする必要があります。
また、「1フレームにかかる時間」はゲームの重さや端末の処理速度等によって毎回少しずつ変わるので、物理演算など一定間隔で処理を行うことを前提とした処理にはUpdate関数は適していません。
Awake関数
Awake関数はStart関数と同じくゲームオブジェクトの初期化に使える関数ですが、こちらはスクリプトが読み込まれたタイミングで1回だけ呼び出されます。つまり、呼び出されるタイミングは必ずStart関数よりも前となります。
Start関数はすべてのスクリプトのAwake関数が実行された後に実行されるため、Awake関数ではStart関数よりも前に実行したい処理を行うとよいでしょう。
FixedUpdate関数
FixedUpdate関数はUpdate関数と似ていますが、こちらは一定間隔で呼び出されるのが特徴のインベント関数となっています。一定間隔で呼び出されるので原則として物理演算などはこの関数内で実行する必要があります(※例外もありますが…)。こちらも頻繁に呼び出されるので重い処理を詰め込まないようにした方が得策でしょう。
なおFixedUpdateの呼び出し頻度は、プロジェクト設定ウィンドウの「時間」タブ内にある「固定時間ステップ」の項目から設定することができます。
例えば、上の画像であればFixedUpdateは「0.02秒に一回」の頻度で実行されます。
LateUpdate関数
さてLateUpdate関数はUpdate関数と同じで1フレームに1回の頻度で呼び出される関数ですが、必ずUpdate関数の後に実行されるのが特徴となっています。
これは例えばプレイヤーキャラクターに追従するカメラの移動処理を行うときに便利です。というのは、追従カメラを普通にUpdate関数で動かすと画面の描画がガタガタしたような感じになってしまうことがあるからです。この原因は、プレイヤーとカメラの移動処理をそれぞれ別のスクリプトのUpdate関数内に書いた場合、Update同士の実行順はランダムなので
- プレイヤーの移動→カメラの移動(=正常)
- カメラの移動→プレイヤーの移動(=ガタつく)
という2パターンが考えられ、後者の場合は画面がガタガタになってしまうという点にあります。
したがって、このようなときは追従カメラの移動処理をLateUpdate関数内に書けば、プレイヤーの座標が確定した後にカメラが動くことになりガタつきを防ぐことができます。
OnEnable関数
OnEnable関数はゲームオブジェクトがアクティブ状態になったときに呼ばれるイベント関数です。
これはC#スクリプト等でゲームオブジェクトを直接アクティブにした場合のほか、シーンのロード時にゲームオブジェクトがアクティブであった場合にも呼び出されます。その場合の呼び出し順はAwake関数のあと・Start関数の前となります。
OnDisable関数
OnDisable関数は、OnEnable関数とは逆でゲームオブジェクトが非アクティブ状態になったときに呼ばれるイベント関数となっています。
こちらはゲームオブジェクトを直接非アクティブにした場合のほか、ゲームオブジェクトを破棄したりシーンをアンロードした場合にも呼び出されます。
OnDestroy関数
最後にOnDestroy関数はゲームオブジェクトが破棄されるときに実行されるイベント関数です。
C#スクリプトでDestroy関数呼ばれ、OnDestroy関数が書かれているC#スクリプトをもつゲームオブジェクトが破棄された機や、シーンがアンロードされた場合に呼び出されます。ちなみに呼び出し順序はOnDisableの後となっています。
イベント関数の注意点
さて最後にイベント関数を使う際の注意点を2つご紹介しておこうと思います。
イベント関数は空の状態でも書いてあるだけで負荷になる場合がある
まず一つ目の注意点とは、イベント関数はC#スクリプトに書いてあるだけでゲーム実行時にわずかな負荷になる可能性があるということです。
例えばUpdate関数はC#スクリプトに最初から書いてあるので、Update関数内に何の処理も書いていなくてもそのまま残している、という方も多いと思います。しかしUpdate関数等は(たとえ何の処理も行っていなくても)スクリプトに書いてあるだけで実行時にわずかな負荷になるようです。
まあ残しておいてもそこまで大きな負荷にはならないらしいのですが、塵も積もれば…ということで気になる方は使わないイベント関数は消しておくのがよいかと思います。
イベント関数の実行順序に注意!
次に二つ目の注意点は、上の方でもたびたび出てきたようにイベント関数には実行順序があるのでそれに気を付けたほうがいいです。実行順序について知らないとC#スクリプトが思わぬ挙動をする可能性があります。
イベント関数の実行順序については公式リファレンスが詳しいので、気になる方はそちらも併せてご覧ください。
おわりに
以上、UnityのC#スクリプトでよく使うイベント関数についてご説明しました。
イベント関数はUnity独自のものなので最初は少し取っつきにくいかもしれませんが、使いこなせるようになるとゲームを作る際にとても役立ちます。ぜひ上記の内容を参考にしていただければと思います。