Menu
CoddyTech

共通設定

CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 25/64。

難易度設定はすべての敵を一度に変更するため、すべての敵が参照する1つのアセットに適しています。各敵は毎フレームそのアセットの速度を読み取り、メニューのHardボタンは同じアセットに値を書き込みます。

[CreateAssetMenu(menuName = "Game/Difficulty")]
public class Difficulty : ScriptableObject
{
    public float enemySpeed = 2f;
}
public class Enemy : MonoBehaviour
{
    public Difficulty difficulty;
    public Transform player;

    void Update()
    {
        float step = difficulty.enemySpeed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, player.position, step);
    }
}
// DifficultyMenu.cs、Hard ボタンの onClick に接続
public Difficulty difficulty;

public void SetHard()
{
    difficulty.enemySpeed = 4f;
}

敵のフィールドとメニューのフィールドは、同じ1つのアセットを保持しています。そのため、SetHard()の後、次にUpdateが呼び出されたとき、すべての敵が4を読み取ります。フィールドにそのアセットを設定したプレハブから後で生成された敵も含まれます。敵が移動するときにdifficulty.enemySpeedを読み取るため、これが機能します。Startでこの値を自身のフィールドにコピーした敵は、2のまま動き続けます。

ゲーム中に加えた変更がどこに残るかは、ゲームの実行場所によって異なります。ビルドでは、起動するたびにビルド時点のアセットが読み込まれるため、プレイヤーが選んだHardは次のゲームでは保持されません。選択を保持するには、PlayerPrefsで保存し、ゲーム開始時にアセットへ書き戻します。Editorでは、プロジェクト内のアセットそのものがゲームによって変更され、Stopを押した後も変更が残ります。Inspectorの値に戻るシーン内のオブジェクトとは異なります。次に「プレイ」を押すとHardで始まり、元に戻すまでアセットの値は4のままです。

challenge icon

チャレンジ

中級

1つのアセットを共有して、矢印キーで全てのボートの風を変えましょう。

  1. Sailboatでは、windStrengthをpublic WindSettings wind;に置き換え、wind.strengthで航行するようにします。
  2. WindVaneでは、strengthをpublic WindSettings wind;に置き換えます。
  3. 矢印キーでwind.strengthを変更(0から5)し、テキストにその値をWind: 3のように表示するようにします。

「プレイ」を押してから上矢印キーを押します。3隻すべてのボートが速くなります。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;

public class WindVane : MonoBehaviour
{
    public TMP_Text windText;
    public float strength = 2f;

    void Start()
    {
        Show();
    }

    void Update()
    {
        if (Keyboard.current.upArrowKey.wasPressedThisFrame)
        {
            strength = Mathf.Min(strength + 1f, 5f);
            Show();
        }
        if (Keyboard.current.downArrowKey.wasPressedThisFrame)
        {
            strength = Mathf.Max(strength - 1f, 0f);
            Show();
        }
    }

    void Show()
    {
        windText.text = "Wind: " + strength;
    }
}

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

自分で練習してみよう: Unityプレイグラウンド