组件协同工作
本课属于 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 都不需要改动。
挑战
简单让滑冰者冲刺时消耗体力。
- 在
Stamina中,添加public bool TrySpend(float cost):如果current大于或等于cost,就扣除相应体力并返回true,否则返回false。 - 将
[RequireComponent(typeof(Stamina))]放在public class Dash上方,并在Awake()中获取该组件并存入字段。 - 按下空格键时,仅当
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 在线编辑器