共有設定
CoddyのUnityジャーニー「Unityにおけるゲームアーキテクチャ」セクションの一部。レッスン 21/50。
難易度設定はすべての敵を一度に変更するため、すべての敵が参照する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の値に戻ります。次のPlayはHardで始まり、元に戻すまでアセットには4が保持されます。
チャレンジ
中級3隻のヨットが風に押されて湾を横切り、上矢印と下矢印で風の強さを0から5の間で上げ下げします。しかし、各ボートにはそれぞれ独自のwindStrengthフィールドがあり、WindVaneが変更するのは自身のstrengthだけなので、矢印を押しても水上のボートには何も起きません。1つのアセットを共有しましょう。WindSettings.csは用意されており、プロジェクトのBreezeアセット(強さ2)は、すべてのボートとWindVaneのwindフィールドに設定されています。
Sailboat:windStrengthを型がWindSettingsのpublicフィールドwindに置き換え、wind.strengthに応じて航行するようにします。WindVane:strengthをpublicフィールドwindに置き換え、矢印でwind.strengthが変わるようにして、すべてのボートがその影響を受けるようにします。テキストにはWind: 3のように表示されます。- ビルドは起動するたびにBreezeアセットを新しく読み込むため、プレイヤーの風の設定は失われてしまいます。変更のたびに
wind.strengthをPlayerPrefsのキーWindに保存し、Startで保存した値をアセットに戻します。新しいプレイヤーには、アセットの2が適用されます。
Playを押して風を変え、次にStopを押してから、もう一度Playを押し、その後Checkを押してください。
自分で試してみよう
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;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。