我撞到了什么?
本课属于 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。
按“开始”,然后驾驶扫雪车撞向积雪:每个方块都会消失,控制台会统计数量。然后按“检查”。
亲手试试
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 在线编辑器