連携するコンポーネント
CoddyのUnityジャーニー「Unityにおけるゲームアーキテクチャ」セクションの一部。レッスン 4/50。
小さなコンポーネント同士でも、互いに必要とします。ジェットパックは同じオブジェクト上の Fuel を必要とするため、Awake で一度だけ Fuel を見つけてフィールドに保持し、2つの小さな public メソッドを通じてやり取りします。
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 を追加すると、Editor 上でも AddComponent を使った場合でも、Unity が Fuel を追加します。また、Jetpack がある間は Fuel の削除を拒否します。Unity がこれを確認するのは Jetpack を追加した時点だけなので、この属性を書く前からオブジェクトに付いていた Jetpack は、以前の構成のままです。取得する場所は Awake です。Awake は一度だけ実行され、その時点でオブジェクト自身のコンポーネントはすべて揃っています。
Jetpack は amount 自体を変更しません。たとえば値が 0 未満にならないようにするなど、燃焼が何を意味するかは Fuel が決め、Jetpack は要求するだけです。後で Fuel にゲージを表示する機能や、アイテムを拾って燃料を補給する機能を追加しても、Jetpack に変更は必要ありません。
チャレンジ
簡単スケーターのダッシュは無料です。Spaceを押すたびに、彼女を前方(+z)へ3ユニット移動させます。これにスタミナ消費を追加しましょう。矢印キーで彼女を滑らせる処理(Mover.cs)は準備済みで、Stamina.csではすでに、currentを毎秒regenずつ、max(100)まで回復させています。
- Staminaに、publicメソッド
bool TrySpend(float cost)を追加します。currentがcost以上なら、currentからcostを差し引いてtrueを返します。そうでなければ、currentはそのままにしてfalseを返します。 - DashがアタッチされたオブジェクトにStaminaが必要となるようにし、Dashを追加するたびにUnityがStaminaも追加するようにします。Awakeで一度だけ取得し、フィールドに格納します。
- ダッシュには
cost(Inspectorで40に設定)を消費します。TrySpendが成功した場合のみSpaceでダッシュし、そうでなければToo tiredをログに出力します。
Playを押し、彼女が疲れ切るまでダッシュしてから、Checkを押します。
自分で試してみよう
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;
}
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。