Gemeinsame Einstellungen
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 25 von 64.
Eine Schwierigkeitseinstellung ändert alle Gegner gleichzeitig und passt daher zu einem Asset, auf das sie alle verweisen. Jeder Gegner liest in jedem Frame die Geschwindigkeit des Assets aus, und die Schaltfläche „Schwer“ im Menü schreibt in dasselbe Asset:
[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, mit dem onClick des Hard-Buttons verknüpft
public Difficulty difficulty;
public void SetHard()
{
difficulty.enemySpeed = 4f;
}Die Felder der Gegner und das Feld des Menüs enthalten dasselbe Asset. Nach SetHard() liest das nächste Update jedes Gegners den Wert 4 aus, auch bei Gegnern, die später aus einem Prefab erzeugt werden, in dessen Feld das Asset eingetragen ist. Das funktioniert, weil jeder Gegner beim Bewegen difficulty.enemySpeed ausliest. Ein Gegner, der den Wert in Start in ein eigenes Feld kopiert hat, bewegt sich weiterhin mit 2.
Wo eine Änderung landet, die während des Spiels vorgenommen wurde, hängt davon ab, wo das Spiel läuft. Ein Build lädt seine Assets bei jedem Start so, wie sie erstellt wurden. Daher ist die Einstellung „Schwer“ des Spielers im nächsten Spiel verloren: Um die Auswahl beizubehalten, speichere sie mit PlayerPrefs und schreibe sie beim Start des Spiels zurück in das Asset. Im Editor ist das Asset in deinem Projekt dasjenige, das das Spiel ändert, und die Änderung bleibt nach einem Klick auf Stop bestehen – anders als die Objekte der Szene, die auf ihre Inspector-Werte zurückgesetzt werden. Beim nächsten Klick auf „Spielen“ startet das Spiel mit der Einstellung „Schwer“, und das Asset behält den Wert 4, bis du ihn zurücksetzt.
Aufgabe
MittelLass die Pfeile den Wind auf jedem Boot ändern, indem sie ein Asset gemeinsam nutzen.
- Ersetze in
SailboatwindStrengthdurchpublic WindSettings wind;und segle mitwind.strength. - Ersetze in
WindVanestrengthdurchpublic WindSettings wind;. - Lass die Pfeile
wind.strengthändern (0 bis 5), und lass den Text den Wert anzeigen, wie inWind: 3.
Drücke „Spielen“ und dann die Pfeiltaste nach oben: Alle drei Boote werden schneller. Drücke anschließend „Prüfen“.
Probier es selbst
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;
}
}
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground