Menu
CoddyTech

击碎

Coddy Unity 游戏:打砖块 课程的第 6 课,共 19 课。

砖块没有 Rigidbody,但球有,而且在发生碰撞时,Unity 会向两个物体都发送 OnCollisionEnter。因此,砖块可以自行检测到撞击。在砖块的脚本中,gameObject 是砖块,而 collision.gameObject 是撞到它的物体。

分数由 GameManager 管理,而砖块是预制体的副本。预制体是场景之外的资源,因此它的字段无法在 Inspector 中指向场景里的 GameManager。GameManager 会在 Awake() 中将静态的 GameManager.Instance 设为自身,这样任何脚本都能访问它,预制体副本也可以。

玩家撞上时会碎裂的花瓶:

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Player")) Shatter();
}

public void Shatter()
{
    Destroy(gameObject);
}

Destroy(gameObject) 会移除花瓶。Destroy(collision.gameObject) 会移除玩家,而 Destroy(this) 只会移除脚本,花瓶仍会立在那里。把碎裂逻辑放在它自己的 public 方法中,其他代码也能让花瓶碎裂,比如炸弹或强化道具。

challenge icon

挑战

中等

球会击碎砖块,并获得相应的分数。

  1. 在 GameManager 中,添加 int score; 和 public void BrickBroken(Brick brick),让它把 brick.points 加到分数中。
  2. 在 Brick 中,编写 public void Hit():GameManager.Instance.BrickBroken(this);,然后执行 Destroy(gameObject);
  3. 在 Brick 的 OnCollisionEnter 中,当对象带有 Ball 标签时,调用 Hit()。

按下“开始”并发射球:球击中的每块砖都会消失。然后点击“检查”。

亲手试试

using UnityEngine;

public class Brick : MonoBehaviour
{
    public int points = 10;

    // 接下来:球击碎一块砖,并获得这块砖对应的分数。
}

Unity 游戏:打砖块中的所有课

自己练习: Unity 在线编辑器