物理エンジンの利用 (4/4)
作成:2014-10-04 10:28
更新:2014-10-04 10:28
更新:2014-10-04 10:28
■トリガーを利用する
ぶつかれば跳ね返る。これは当たり前のことで、自分でそのための処理を書くことを考えれば、物理エンジンでずいぶんと楽になります。
が、すべてのものが「ぶつかって跳ね返る」ようにする必要があるわけではありません。例えばゲームでは、さまざまなアイテムを使ったりしますが、これらのアイテムに触れると跳ね返ってしまったらちょっと変ですね。そのままアイテムをすっと通過してゲットする、というのが普通でしょう。
こうした「ぶつからずに、接触したイベントだけを受け取り処理する」というオブジェクトが「トリガー」です。トリガーは、ゲームオブジェクトのインスペクターから、コライダーにある「Is Trigger」という設定をONにすることで利用できるようになります。
Is TriggerをONにすると、そのオブジェクトは他のものとはぶつからなくなります。衝突してもそのまま通過してしまうようになるのです。そしてその際、以下のようなイベントを発生させます。
基本的には普通の衝突イベントによるメソッドと扱い方は同じです。ただメソッド名と、引数に渡されるのがCollisionではなくColliderである、という点だけが異なります。
下に、先ほどのサンプルをトリガー利用の形に書き換えた例を挙げておきます。配置した(Sphere以外の)ゲームオブジェクトの「Is Trigger」のチェックをONにしてから実行してみてください。Sphereがそれらのオブジェクトに接触するとマテリアルが消えます。そしてそのままオブジェクトの中を通過していき、離れると元に戻りますよ。
が、すべてのものが「ぶつかって跳ね返る」ようにする必要があるわけではありません。例えばゲームでは、さまざまなアイテムを使ったりしますが、これらのアイテムに触れると跳ね返ってしまったらちょっと変ですね。そのままアイテムをすっと通過してゲットする、というのが普通でしょう。
こうした「ぶつからずに、接触したイベントだけを受け取り処理する」というオブジェクトが「トリガー」です。トリガーは、ゲームオブジェクトのインスペクターから、コライダーにある「Is Trigger」という設定をONにすることで利用できるようになります。
Is TriggerをONにすると、そのオブジェクトは他のものとはぶつからなくなります。衝突してもそのまま通過してしまうようになるのです。そしてその際、以下のようなイベントを発生させます。
void OnTriggerEnter (ollider collider)
他のオブジェクトに触れた瞬間に一度だけ発生するイベントにより呼び出されるものです。void OnTriggerStay (ollider collider)
他のオブジェクトと接触している間、常に発生し続けるイベントで呼び出されます。void OnTriggerExit (ollider collider)
接触しているオブジェクトと離れたとき、一度だけ発生するイベントで呼び出されます。基本的には普通の衝突イベントによるメソッドと扱い方は同じです。ただメソッド名と、引数に渡されるのがCollisionではなくColliderである、という点だけが異なります。
下に、先ほどのサンプルをトリガー利用の形に書き換えた例を挙げておきます。配置した(Sphere以外の)ゲームオブジェクトの「Is Trigger」のチェックをONにしてから実行してみてください。Sphereがそれらのオブジェクトに接触するとマテリアルが消えます。そしてそのままオブジェクトの中を通過していき、離れると元に戻りますよ。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
using UnityEngine; using System.Collections; public class PhysicsObj : MonoBehaviour { Material backup; void Start () { } void Update () { } void FixedUpdate () { float x = Input.GetAxis("Horizontal"); float y = Input.GetAxis("Vertical"); rigidbody.AddForce(new Vector3(x, 0, y)); } void OnTriggerEnter (Collider collider) { if (collider.name == "base") return; backup = collider.gameObject.renderer.material; collider.renderer.material = null; } void OnTriggerExit (Collider collider) { if (collider.name == "base") return; collider.renderer.material = backup; } }
※関連コンテンツ