Menu
CoddyTech

组件协同工作

本课属于 Coddy Unity 学习旅程的“Unity 游戏架构”单元。第 4 课,共 64 课。

小组件仍然需要彼此协作。Jetpack 需要同一个对象上的 Fuel,因此它会在 Awake 中查找一次 Fuel,将其保存在字段中,并通过两个简短的公共方法与它交互:

public class Fuel : MonoBehaviour
{
    public float amount = 10f;

    public bool IsEmpty()
    {
        return amount <= 0f;
    }

    public void Burn(float units)
    {
        amount = Mathf.Max(amount - units, 0f);
    }
}
[RequireComponent(typeof(Fuel))]
public class Jetpack : MonoBehaviour
{
    public float lift = 4f;
    private Fuel fuel;

    void Awake()
    {
        fuel = GetComponent<Fuel>();
    }

    void Update()
    {
        if (Keyboard.current.spaceKey.isPressed && !fuel.IsEmpty())
        {
            fuel.Burn(Time.deltaTime);
            transform.position += Vector3.up * lift * Time.deltaTime;
        }
    }
}

[RequireComponent(typeof(Fuel))] 会在添加 Jetpack 时让 Unity 自动添加 Fuel,无论是在编辑器中添加,还是使用 AddComponent 添加;只要 Jetpack 还在,就无法移除 Fuel。Unity 只会在添加 Jetpack 时检查这一点,因此,在你编写这个特性之前就已经添加到对象上的 Jetpack 会保留原有设置。Awake 是获取 Fuel 的好时机:它只运行一次,而且到那时对象自身的所有组件都已就绪。

Jetpack 不会自行修改 amount。Fuel 会决定燃烧的含义,例如数值不会低于 0,而 Jetpack 只会向它发出请求。如果 Fuel 之后显示计量条,或从拾取物中补充燃料,Jetpack 都不需要改动。

challenge icon

挑战

简单

让滑冰者冲刺时消耗体力。

  1. 在 Stamina 中,添加 public bool TrySpend(float cost):如果 current 大于或等于 cost,就扣除相应体力并返回 true,否则返回 false。
  2. 将 [RequireComponent(typeof(Stamina))] 放在 public class Dash 上方,并在 Awake() 中获取该组件并存入字段。
  3. 按下空格键时,仅当 TrySpend(cost) 返回 true 时才冲刺;否则记录 Too tired。

按“开始”:冲刺两次后,控制台会显示 Too tired。然后按“检查”。

亲手试试

using UnityEngine;
using UnityEngine.InputSystem;

public class Dash : MonoBehaviour
{
    public float distance = 3f;
    public float cost = 40f;

    void Update()
    {
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            transform.position += Vector3.forward * distance;
        }
    }
}

Unity 游戏架构中的所有课

自己练习: Unity 在线编辑器