物理エンジンの利用 (3/4)
作成:2014-10-04 10:25
更新:2014-10-04 10:30
更新:2014-10-04 10:30
■ゲームオブジェクトどうしの衝突イベント
物理エンジンを組み込んだゲームオブジェクトは、他のゲームオブジェクトと「衝突」をします。物理エンジンでは、物と物がぶつかれば、止まったり跳ね返ったりするようになるのです。
その際、衝突に関するイベントが発生し、そのゲームオブジェクトに組み込まれているスクリプトのメソッドを呼び出して必要な処理が行えるようになっています。
用意されているメソッドは以下のようになります。
これらのメソッドでは、「Collision」というクラスのインスタンスが引数として渡されます。これは、衝突した相手のゲームオブジェクトに関する情報を管理するクラスです。このCollisionには、以下のようなプロパティが用意されています。
gameObject――衝突した相手のGameObjectオブジェクトが保管されています。
collider――衝突相手のColliderオブジェクトが保管されます。
rigidbody――衝突相手のRigidbodyオブジェクトが保管されています。
これらから必要なオブジェクトを取り出して処理すれば、ぶつかった相手を操作することもできます。下のリスト欄に、簡単な例を挙げておきましょう。
シーンに適当にゲームオブジェクトを配置し、マテリアルを設定してから実行して下さい。それらのゲームオブジェクトにSphereが衝突すると、マテリアルがクリアされます。離れると元のマテリアル表示に戻ります。
ここでは、OnCollisionEnterとOnCollisionExitを使い、collision.gameObject.renderer.materialの値を操作しています。このように、collisionから必要なオブジェクトを取り出して操作すれば、ぶつかった相手の処理が行えるようになります。
その際、衝突に関するイベントが発生し、そのゲームオブジェクトに組み込まれているスクリプトのメソッドを呼び出して必要な処理が行えるようになっています。
用意されているメソッドは以下のようになります。
void OnCollisionEnter (Collision collision)
他のオブジェクトに衝突した瞬間に一度だけ発生するイベントにより呼び出されるものです。void OnCollisionStay (Collision collision)
他のオブジェクトと衝突している間、常に発生し続けるイベントで呼び出されます。void OnCollisionExit (Collision collision)
衝突しているオブジェクトと離れたとき、一度だけ発生するイベントで呼び出されます。これらのメソッドでは、「Collision」というクラスのインスタンスが引数として渡されます。これは、衝突した相手のゲームオブジェクトに関する情報を管理するクラスです。このCollisionには、以下のようなプロパティが用意されています。
gameObject――衝突した相手のGameObjectオブジェクトが保管されています。
collider――衝突相手のColliderオブジェクトが保管されます。
rigidbody――衝突相手のRigidbodyオブジェクトが保管されています。
これらから必要なオブジェクトを取り出して処理すれば、ぶつかった相手を操作することもできます。下のリスト欄に、簡単な例を挙げておきましょう。
シーンに適当にゲームオブジェクトを配置し、マテリアルを設定してから実行して下さい。それらのゲームオブジェクトにSphereが衝突すると、マテリアルがクリアされます。離れると元のマテリアル表示に戻ります。
ここでは、OnCollisionEnterとOnCollisionExitを使い、collision.gameObject.renderer.materialの値を操作しています。このように、collisionから必要なオブジェクトを取り出して操作すれば、ぶつかった相手の処理が行えるようになります。
(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 OnCollisionEnter (Collision collision) { if (collision.gameObject.name == "base") return; backup = collision.gameObject.renderer.material; collision.gameObject.renderer.material = null; } void OnCollisionExit (Collision collision) { if (collision.gameObject.name == "base") return; collision.gameObject.renderer.material = backup; } }
※関連コンテンツ