Menu
CoddyTech

何にぶつかった?

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

challenge icon

チャレンジ

簡単

矢印キーで除雪車を動かし(すでに記述されています)、仕事をさせましょう。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);
    }

    // 除雪車がぶつかった雪を破壊し、数を数えて、その数をログに記録する
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

物理演算とゲームプレイのすべてのレッスン