Gemeinsame Einstellungen
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 21 von 50.
Eine Schwierigkeitsstufe ändert alle Gegner auf einmal, daher passt dafür ein Asset, auf das sie alle verweisen. Jeder Gegner liest in jedem Frame die Geschwindigkeit des Assets, und die Hard-Schaltfläche 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. Daher liest das nächste Update jedes Gegners nach SetHard() den Wert 4 – auch Gegner, 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 wird, hängt davon ab, wo das Spiel ausgeführt wird. Ein Build lädt seine Assets bei jedem Start so, wie sie erstellt wurden. Die vom Spieler gewählte Einstellung Hard ist also im nächsten Spiel verloren: Um eine Auswahl beizubehalten, speichere sie mit PlayerPrefs und schreibe sie beim Spielstart zurück in das Asset. Im Editor ist das Asset in deinem Projekt dasjenige, das vom Spiel geändert wird, und die Änderung bleibt nach dem Drücken von Stop bestehen – anders als bei den Objekten der Szene, die auf ihre Inspector-Werte zurückgesetzt werden. Beim nächsten Play startet das Spiel mit Hard, und das Asset behält den Wert 4, bis du ihn zurücksetzt.
Aufgabe
MittelDrei Segelboote überqueren die Bucht und werden vom Wind angetrieben. Mit den Pfeiltasten nach oben und unten wird die Windstärke zwischen 0 und 5 erhöht und verringert. Aber jedes Boot hat sein eigenes Feld windStrength, und der WindVane ändert nur seine eigene strength, sodass die Pfeiltasten auf dem Wasser nichts bewirken. Verwende stattdessen ein gemeinsames Asset. WindSettings.cs ist bereit, und das Breeze-Asset des Projekts (strength 2) ist im Feld wind jedes Bootes und des WindVane zugewiesen.
Sailboat: ErsetzewindStrengthdurch ein öffentliches Feldwindvom Typ WindSettings und segle mitwind.strength.WindVane: Ersetzestrengthdurch ein öffentliches Feldwindund lass die Pfeiltastenwind.strengthändern, damit es jedes Boot spürt. Der Text zeigt die Windstärke an, zum BeispielWind: 3.- Ein Build lädt das Breeze-Asset bei jedem Start neu, wodurch die Windstärke des Spielers verloren ginge. Speichere
wind.strengthjedes Mal, wenn sie sich ändert, unter dem PlayerPrefs-SchlüsselWindund übertrage in Start einen gespeicherten Wert zurück in das Asset. Bei einem neuen Spieler bleibt der Wert des Assets 2 erhalten.
Drücke Play, ändere den Wind, drücke dann Stop und erneut Play und anschließend Check.
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;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basisskript für GegnerAbstrakte KomponentenKomponenten im ZusammenspielRückblick: Modularer Geschützturm4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-Tabelle7Zustandsautomaten
Zustände als KlassenEin ZustandsautomatÜbergängeGegner-KIWiederholung: Türzustände10Projekt: Arena-Überlebenskampf
Der HeldGegnertypen2Interfaces in Unity
IDamageableInterfaces und TryGetComponentGetComponentsRückblick: Interaktionstaste5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenWellen als DatenRückblick: Item-Datenbank8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearest