Menu
CoddyTech

連携するコンポーネント

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

challenge icon

チャレンジ

簡単

スケーターのダッシュは無料です。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;
        }
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityにおけるゲームアーキテクチャのすべてのレッスン