物理エンジンと衝突判定 (4/4)
作成:2014-05-31 10:02
更新:2014-05-31 10:02
更新:2014-05-31 10:02
■トリガーを利用しよう!
ゲームオブジェクトどうしの衝突は、常に「ぶつかる」形になります。相手も「物」ですから、ぶつかればとまるし、跳ね返ります。
けれど、「ぶつからないで欲しい」という時もありますね。それは、「物」として扱わないオブジェクトと接触する時です。例えば、ゲームのアイテムを表すアイコンなどを想像してみましょう。キャラクタを動かして、アイテムのアイコンにぶつかったら跳ね返された、なんて逆にしかなりません。普通はす~っとそのまま通過するなりアイテムを取って消えるなりするはずですね。
こうした「衝突しないオブジェクト」というのを作る場合、「トリガー」という機能を利用します。トリガーは、接触をチェックするためのオブジェクトとしてりようするためのものです。ゲームオブジェクトをトリガーに設定すると、そのオブジェクトと接触してもぶつかったり跳ね返ったりすることなく、そのままオブジェクトと重なり合って通過するようになります。つまり、さわれない、お化けのような状態になるわけですね。
このトリガーは、コライダーにある「Is Trigger」というチェックボックスをONにすることで設定できます。
トリガーに設定すると、通常の衝突イベント(OnColliderEnterなど)は発生しなくなり、代りに以下のようなトリガー専用の衝突イベントが発生するようになります。
OnTriggerEnter――別のオブジェクトと接触した瞬間に発生します。
OnTriggerStay――別のオブジェクトと接触している間中、常に発生し続けます。
OnTriggerExit――接触していたオブジェクトと離れた瞬間に発生します。
これらのイベント用関数では、引数に(Collisionではなく)Colliderオブジェクトが渡されます。このColliderから必要な情報を取り出して処理をします。
では、下に簡単な利用例を挙げておきましょう。シーンに配置したゲームオブジェクトの「Is Trigger」をONにして試してみてください。Sphereを操作してトリガー設定したオブジェクトに接触すると、そのオブジェクトが消え、通り過ぎると再び現れるようになります。
けれど、「ぶつからないで欲しい」という時もありますね。それは、「物」として扱わないオブジェクトと接触する時です。例えば、ゲームのアイテムを表すアイコンなどを想像してみましょう。キャラクタを動かして、アイテムのアイコンにぶつかったら跳ね返された、なんて逆にしかなりません。普通はす~っとそのまま通過するなりアイテムを取って消えるなりするはずですね。
こうした「衝突しないオブジェクト」というのを作る場合、「トリガー」という機能を利用します。トリガーは、接触をチェックするためのオブジェクトとしてりようするためのものです。ゲームオブジェクトをトリガーに設定すると、そのオブジェクトと接触してもぶつかったり跳ね返ったりすることなく、そのままオブジェクトと重なり合って通過するようになります。つまり、さわれない、お化けのような状態になるわけですね。
このトリガーは、コライダーにある「Is Trigger」というチェックボックスをONにすることで設定できます。
トリガーに設定すると、通常の衝突イベント(OnColliderEnterなど)は発生しなくなり、代りに以下のようなトリガー専用の衝突イベントが発生するようになります。
OnTriggerEnter――別のオブジェクトと接触した瞬間に発生します。
OnTriggerStay――別のオブジェクトと接触している間中、常に発生し続けます。
OnTriggerExit――接触していたオブジェクトと離れた瞬間に発生します。
これらのイベント用関数では、引数に(Collisionではなく)Colliderオブジェクトが渡されます。このColliderから必要な情報を取り出して処理をします。
では、下に簡単な利用例を挙げておきましょう。シーンに配置したゲームオブジェクトの「Is Trigger」をONにして試してみてください。Sphereを操作してトリガー設定したオブジェクトに接触すると、そのオブジェクトが消え、通り過ぎると再び現れるようになります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
#pragma strict function FixedUpdate () { var x:float = Input.GetAxis("Horizontal"); var y:float = Input.GetAxis("Vertical"); rigidbody.AddForce(new Vector3(x, 0, y)); } function OnTriggerEnter (collider:Collider) { if (collider.gameObject.name == "Plane") return; collider.renderer.enabled = false; } function OnTriggerExit (collider:Collider) { if (collider.gameObject.name == "Plane") return; collider.renderer.enabled = true; }
※関連コンテンツ
「JavaScriptではじめるUnityプログラミング入門」に戻る