Version: 2019.3
言語: 日本語
コンポーネントを使ったゲームオブジェクトの制御
タイムとフレームレートの管理

イベント関数

Unity のスクリプトは、タスクが完了するまでコードがループ実行を続ける伝統的なプログラムとは違います。Unity の場合は、合間合間に特定の関数を呼び出すことでスクリプトに制御を渡します。関数の実行が完了すると Unity に制御が戻ります。これらの関数はイベント関数と呼ばれ、ゲーム中に発生するイベントに対応して Unity により起動されます。Unity はネーミングスキームを使い特定のイベントで呼び出す関数を識別します。例えば Update 関数(フレーム更新前に呼び出されます)および Start 関数(オブジェクトの最初のフレーム更新の直前に呼び出されます)はすでにご存知でしょう。さらに多くのイベント関数が Unity には用意されています。すべての一覧と詳しい使い方は MonoBehaviour クラスのスクリプトリファレンスを参照してください。以下に、もっとも良く使われて重要なイベントのいくつかを紹介します。

定期的な Update イベント

ゲームはアニメーションに近く、アニメーションフレームは実行時に生成されます。ゲームプログラミングでの重要な概念は、ゲーム中、オブジェクトの位置、状態、動作は各フレームがレンダリングされる直前に変更するということです。この種のコードは主に 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 関数はシーン上の各オブジェクトでシーンのロード時に呼び出されます。さまざまなオブジェクトの StartAwake 関数は任意の順番で呼び出されますが、すべての Awake 関数は最初の Start 呼び出しより前には完了します。つまり Start 関数のコードは Awake フェーズで行なわれた初期化の結果を活用することが可能です。

GUI イベント

Unity ではシーン上の主なアクションの上に GUI 制御をレンダリングするシステムを持っていて、制御に対するクリックに反応します。このコードは通常のフレーム更新とは別にハンドリングされるため、定期的に呼び出される OnGUI 関数に配置されるべきです。

void OnGUI() {
    GUI.Label(labelRect, "Game Over");
}

さらにシーン上でゲームオブジェクトに対して行なわれるマウスイベントを検知できます。これは武器で狙いを定めたり、現在マウスポインターの下にあるキャラクターに関する情報を表示するのに使用できます。複数の OnMouseXXX イベント関数(例. OnMouseOverOnMouseDown) によりスクリプトをユーザーのマウス操作に対して反応させることができます。例えば、マウスポインターが特定オブジェクト上にあるときにもしマウスボタンが押下されると、オブジェクトのスクリプトに OnMouseDown 関数が存在する場合は、それが呼び出されます。

物理挙動イベント

物理エンジンはオブジェクトの衝突を検知してオブジェクトのスクリプト上のイベント関数を呼び出しします。OnCollisionEnterOnCollisionStayOnCollisionExit 関数は衝突の発生直後、衝突の途中、衝突が終了した後に呼び出されます。オブジェクトのコライダーがトリガーとして設定された(すなわちオブジェクトが物理的に衝突するのでなく、何かが圏内に入ったときに検知するコライダーである)場合に OnTriggerEnterOnTriggerStayOnTriggerExit が同様に、各々呼び出されます。これらの関数は物理挙動の際にひとつ以上の衝突が検知された場合、連続して複数回呼び出される場合があります。このため関数に対して衝突の詳細に関するパラメーターが渡されます(位置、衝突の他方のオブジェクトの情報、等)。

void OnCollisionEnter(otherObj: Collision) {
    if (otherObj.tag == "Arrow") {
        ApplyDamage(10);
    }
}

コンポーネントを使ったゲームオブジェクトの制御
タイムとフレームレートの管理