何にぶつかった?
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 9/71。
Unity が OnCollisionEnter に渡す Collision は、接触した相手側を表します。collision.gameObject はぶつかったオブジェクトなので、collision.gameObject.name はその名前であり、collision.gameObject.CompareTag("Hazard") はそのタグを確認します。(オブジェクトに複数のコライダーがある場合、collision.collider は実際に接触したコライダーです。)
このバンパーカーは、ぶつかったものすべてをログに記録し、危険物に対して文句を言います。
void OnCollisionEnter(Collision collision)
{
Debug.Log("Bumped into " + collision.gameObject.name);
if (collision.gameObject.CompareTag("Hazard"))
{
Debug.Log("Ouch!");
}
}ゲームが始まった瞬間に最初に記録されるのは Bumped into Floor です。立っている床も衝突対象だからです。そのため、衝突に反応するスクリプトでは、まず何にぶつかったのかを必ず確認します。どのオブジェクトの名前を指定するかに注意してください。CompareTag("Hazard") だけでは自分自身のオブジェクトのタグを確認し、Destroy(gameObject) は自分自身のオブジェクトを破棄します。一方、Destroy(collision.gameObject) はぶつかった相手を削除します。
チャレンジ
簡単除雪車に役目を与えましょう。Snowタグが付いたブロックを取り除きます。
Plowにvoid OnCollisionEnter(Collision collision)を追加し、collision.gameObject.CompareTag("Snow")の場合にのみ処理するようにします。- その中で
Destroy(collision.gameObject);を実行し、clearedフィールドに1を加えて、"Cleared " + clearedをログに出力します。
「プレイ」を押して雪に向かって運転しましょう。ブロックが1つずつ消え、Consoleにその数が表示されます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Plow : MonoBehaviour
{
public float speed = 3f;
private Rigidbody rb;
private int cleared;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
}
// 除雪車がぶつかった雪は、破壊して数を数え、その数をログに記録する
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド