libro
www.tuyano.com
JavaScriptではじめるUnityプログラミング入門

物理エンジンと衝突判定 (3/4)

作成:2014-05-31 10:00
更新:2014-05-31 10:07

■衝突判定イベントについて

物理空間でオブジェクトを動かすとき、考えないといけないのが「衝突時の処理」でしょう。

オブジェクトどうしがぶつかったりした時の処理は、衝突に関するイベントを利用して実装します。衝突のイベントが発生すると、そのイベントによって関数が呼び出されるようになっているのです。この関数に、衝突時の処理を記述しておけばいいのですね。

この衝突イベントのための関数には以下の3種類が用意されています。

OnCollisionEnter――別のオブジェクトと接触した瞬間に発生します。

OnCollisionStay――別のオブジェクトと接触している間中、常に発生し続けます。

OnCollisionExit――接触していたオブジェクトと離れた瞬間に発生します。

これらの関数は、いずれも「Collision」というオブジェクトが引数に渡されます。このCollisionは、衝突に関する情報を管理するオブジェクトです。ここから、衝突した相手がどんなものかわかるようになっています。とりあえず、Collisionに用意されている以下のプロパティだけ覚えておくとよいでしょう。

gameObject――衝突した相手のGameObjectオブジェクトが保管されています。
collider――衝突相手のColliderオブジェクトが保管されます。
rigidbody――衝突相手のRigidbodyオブジェクトが保管されています。

まぁ、GameObjectが得られればそこからColliderRigidbodyも得られますから、gameObjectだけ覚えておけば十分かもしれませんね。他のcolliderrigidbodyは、「いちいちcollision.gameObject.collider……とか書くのが面倒なので用意したショートカットだ」と考えておくとよいでしょう。

では、実際の利用例を下に挙げておきましょう。これは、衝突した相手を「消す」サンプルです。ゲームシーンに適当にゲームオブジェクトを配置して、Sphereを動かしてぶつけてみましょう。ぶつかった瞬間、その相手が「ふっ」と消えます。

ここでは、衝突相手のrenderercolliderenabledをそれぞれfalseにして、レンダラーとコライダーをOFFにしています。こうしてオブジェクトの存在を消してたんですね。

※プログラムリストが表示されない場合

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 OnCollisionEnter (collision:Collision) {
    if (collision.gameObject.name == "Plane") return;
    collision.gameObject.renderer.enabled = false;
    collision.collider.enabled = false;
}

※関連コンテンツ

「JavaScriptではじめるUnityプログラミング入門」に戻る