何にぶつかった?
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 9/63。
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) はぶつかった相手を削除します。
チャレンジ
簡単矢印キーで除雪車を動かし(すでに記述されています)、仕事をさせましょう。2つの白いブロックには Snow というタグが付いています。
- 除雪車が
Snowタグの付いたオブジェクトにぶつかったら、そのブロックを破壊し、カウントに1を加えてログに出力します:Cleared 1、Cleared 2。 - 地面や壁も含め、除雪車が触れたそれ以外のものは、そのままの場所に残ります。
Play を押して道路を除雪し、それから Check を押します。
自分で試してみよう
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);
}
// 除雪車がぶつかった雪を破壊し、数を数えて、その数をログに記録する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。