Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Lass die Pfeile den Wind auf jedem Boot ändern, indem sie ein Asset gemeinsam nutzen.

  1. Ersetze in Sailboat windStrength durch public WindSettings wind; und segle mit wind.strength.
  2. Ersetze in WindVane strength durch public WindSettings wind;.
  3. Lass die Pfeile wind.strength ändern (0 bis 5), und lass den Text den Wert anzeigen, wie in Wind: 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

Übe selbstständig: Unity-Playground