Unity のスクリプトは、伝統的なプログラムのようにタスクが完了するまでコードがループ実行を続けるプログラムとは概念が違います。Unity の場合はスクリプトに制御を特定の関数を呼び出すことで制御を渡します。関数の実行が完了すると Unity に制御が戻ります。これらの関数はイベント関数と呼ばれ、ゲーム中に発生するイベントに対応して Unity により起動されます。Unity のネーミングスキームにより特定のイベントで呼び出す関数を識別します。例えば Update 関数(フレーム更新前に呼び出し)および Start 関数(オブジェクトの最初のフレーム更新の直前に呼び出し)はすでにみてきました。さらに多くのイベント関数が Unity には用意されています。すべての一覧は MonoBehaviour クラスのスクリプトリファレンスページで使用方法の詳細とともに見つけることができます。次に挙げるのがもっとも良く使われて重要なイベントです。
ゲームはアニメーションに近く、アニメーションフレームは実行時に生成されます。ゲームプログラミングでの重要な概念はゲーム中の位置、状態、オブジェクトの動作を各フレームがレンダリングされる前に変更を加えることです。この種のコードを書くべき主な場所は Update 関数の中です。Update はフレームのレンダリング前、さらにはアニメーションが計算される前に呼び出されます。
void Update() {
float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * distance);
}
物理エンジンもフレームレンダリングと同様に、離散的な時間間隔で更新を行います。物理挙動の更新の直前に別のイベント関数である FixedUpdate が呼び出されます。物理挙動の更新やフレーム更新は同じ間隔では発生しないので物理挙動は Update 関数ではなく FixedUpdate 関数に配置することでより正確な結果が得られます。
void FixedUpdate() {
Vector3 force = transform.forward * driveForce * Input.GetAxis("Vertical");
rigidbody.AddForce(force);
}
さらに Update と FixedUpdate がシーン上のすべてのオブジェクトに対して呼び出されて、すべてのアニメーションが計算された後のタイミングで追加変更を加えると便利です。例えばカメラがターゲットオブジェクトにフォーカスを当て続ける場合など、カメラの向きはターゲットオブジェクトが移動された後に調整する必要があります。別の例としてはスクリプトのコードがアニメーション効果を上書きできる場合です(キャラクターがシーン上でターゲットオブジェクトへ向かせる、等)。これらの場面で LateUpdate が使用できます。
void LateUpdate() {
Camera.main.transform.LookAt(target.transform);
}
初期化コードをゲーム中の更新より前に呼び出しできると便利です。関数はオブジェクトの最初のフレームまたは物理挙動の更新の前に呼び出されます。Awake 関数はシーン上の各オブジェクトでシーンのロード時に呼び出されます。さまざまなオブジェクトの Start と Awake 関数は任意の順番で呼び出されますが、すべての Awake 関数は最初の Start 呼び出しより前には完了します。つまり Start 関数のコードは Awake フェーズで行なわれた初期化の結果を活用することが可能です。
Unity ではシーン上の主なアクションの上に GUI コントロールをレンダリングするシステムを持っていて、コントロールに対するクリックに反応します。このコードは通常のフレーム更新とは別にハンドリングされるため、定期的に呼び出される OnGUI 関数に配置されるべきです。
void OnGUI() {
GUI.Label(labelRect, "Game Over");
}
さらにシーン上でゲームオブジェクトに対して行なわれるマウスイベントを検知できます。これは武器で狙いを定めたりキャラクターに関する情報を現在のマウス位置の下に表示するのに使用できます。複数の OnMouseXXX イベント関数(例. OnMouseOver、OnMouseDown)によりスクリプトがユーザーのマウス操作に対して反応できます。例えば、特定オブジェクト上にあるときにもしマウスボタンが押下されるとオブジェクトのスクリプトで OnMouseDown イベントが記載されてれば呼び出されます。
物理エンジンはオブジェクトの衝突を検知してオブジェクトのスクリプト上のイベント関数を呼び出しします。OnCollisionEnter、OnCollisionStay、OnCollisionExit 関数は衝突の発生直後、衝突の途中、衝突が終了した後に呼び出されます。オブジェクトのコライダーがトリガーとして設定された(すなわちオブジェクトが物理的に衝突するのでなく、何かが圏内に入ったときに検知するコライダーである)場合に OnTriggerEnter、OnTriggerStay、OnTriggerExit が同様に、各々呼び出されます。これらの関数は物理挙動の際にひとつ以上の衝突が検知された場合、連続して複数回呼び出される場合があります。このため関数に対して衝突の詳細に関するパラメーターが渡されます(位置、衝突の他方のオブジェクトの情報、等)。
void OnCollisionEnter(otherObj: Collision) {
if (otherObj.tag == "Arrow") {
ApplyDamage(10);
}
}