Menu
CoddyTech

連携するコンポーネント

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 を変更する必要はありません。

challenge icon

チャレンジ

簡単

スケーターのダッシュにスタミナを消費させましょう。

  1. Staminaにpublic bool TrySpend(float cost)を追加します。currentがcost以上なら、その分を差し引いてtrueを返し、そうでなければfalseを返します。
  2. public class Dashの上に[RequireComponent(typeof(Stamina))]を置き、Awake()で取得してフィールドに格納します。
  3. 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プレイグラウンド