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 * speed);
}
物理エンジンもフレーム レンダリングと同様に,離散的な時間間隔で更新を行ないます。物理挙動の更新の直前に別のイベント関数である 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);
}
}