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。

按“开始”,然后驾驶扫雪车撞向积雪:每个方块都会消失,控制台会统计数量。然后按“检查”。

亲手试试

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 在线编辑器