Menu
CoddyTech

何にぶつかった?

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) はぶつかった相手を削除します。

challenge icon

チャレンジ

簡単

除雪車に役目を与えましょう。Snowタグが付いたブロックを取り除きます。

  1. Plowにvoid OnCollisionEnter(Collision collision)を追加し、collision.gameObject.CompareTag("Snow")の場合にのみ処理するようにします。
  2. その中で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プレイグラウンド