連携するコンポーネント
CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 4/64。
小さなコンポーネント同士でも、互いに必要とすることがあります。Jetpack は同じオブジェクト上の Fuel を必要とするため、Awake で一度だけ取得してフィールドに保持し、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))] を指定すると、Editor 上または AddComponent を使って Jetpack を追加するたびに、Unity が Fuel も追加します。また、Jetpack が付いている間は Fuel を削除できません。Unity がこれを確認するのは Jetpack を追加したときだけです。そのため、この属性を書く前からオブジェクトに付いていた Jetpack は、以前の構成のままです。取得する場所は Awake です。Awake は一度だけ実行され、その時点までにオブジェクト自身のコンポーネントがすべてそろっています。
Jetpack は amount 自体を変更しません。0 を下回らないようにするなど、燃焼が何を意味するかは Fuel が決め、Jetpack はそれを呼び出すだけです。後から Fuel にゲージを表示させたり、アイテムを拾ったときに補給させたりしても、Jetpack を変更する必要はありません。
チャレンジ
簡単スケーターのダッシュにスタミナを消費させましょう。
Staminaにpublic bool TrySpend(float cost)を追加します。currentがcost以上なら、その分を差し引いてtrueを返し、そうでなければfalseを返します。public class Dashの上に[RequireComponent(typeof(Stamina))]を置き、Awake()で取得してフィールドに格納します。- Spaceキーを押したとき、
TrySpend(cost)がtrueの場合にのみダッシュし、そうでなければToo tiredをログに出力します。
「プレイ」を押します。2回ダッシュすると、Consoleに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プレイグラウンド