Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Drei 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: Ersetze windStrength durch ein öffentliches Feld wind vom Typ WindSettings und segle mit wind.strength.
  • WindVane: Ersetze strength durch ein öffentliches Feld wind und lass die Pfeiltasten wind.strength ändern, damit es jedes Boot spürt. Der Text zeigt die Windstärke an, zum Beispiel Wind: 3.
  • Ein Build lädt das Breeze-Asset bei jedem Start neu, wodurch die Windstärke des Spielers verloren ginge. Speichere wind.strength jedes Mal, wenn sie sich ändert, unter dem PlayerPrefs-Schlüssel Wind und ü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;
    }
}
quiz iconTeste dich selbst

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