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);
}
}
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.