Menu
CoddyTech

Współdzielone ustawienia

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 21 z 50.

Ustawienie poziomu trudności zmienia naraz wszystkich wrogów, dlatego pasuje do niego jeden zasób, do którego odwołują się wszyscy. Każdy wróg odczytuje prędkość z zasobu w każdej klatce, a przycisk Hard w menu zapisuje wartość w tym samym zasobie:

[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, powiązany z onClick przycisku Hard
public Difficulty difficulty;

public void SetHard()
{
    difficulty.enemySpeed = 4f;
}

Pola wrogów i pole menu przechowują odwołanie do tego samego zasobu, więc po wywołaniu SetHard() następne wywołanie Update każdego wroga odczyta wartość 4 — dotyczy to również wrogów utworzonych później z prefabrykatu, w którego polu znajduje się ten zasób. Działa to dlatego, że każdy wróg odczytuje difficulty.enemySpeed, gdy się porusza. Wróg, który w metodzie Start skopiował tę wartość do własnego pola, nadal porusza się z prędkością 2.

To, gdzie trafia zmiana wprowadzona podczas gry, zależy od miejsca jej uruchomienia. Kompilacja za każdym razem wczytuje zasoby w stanie z momentu jej utworzenia, więc ustawienie Hard wybrane przez gracza znika po rozpoczęciu następnej gry. Aby zachować wybór, zapisz go za pomocą PlayerPrefs i zapisz go z powrotem w zasobie po uruchomieniu gry. W Edytorze zmiany wprowadza zasób w projekcie, więc pozostają one po naciśnięciu Stop — w przeciwieństwie do obiektów sceny, które wracają do wartości z Inspektora. Następne uruchomienie Play rozpocznie się na poziomie Hard, a zasób zachowa wartość 4, dopóki jej nie zmienisz.

challenge icon

Wyzwanie

Średni

Trzy żaglówki przepływają przez zatokę, popychane przez wiatr, a strzałki w górę i w dół zmieniają siłę wiatru w zakresie od 0 do 5. Każda łódź ma jednak własne pole windStrength, a WindVane zmienia tylko własne strength, więc strzałki nie wpływają na wodę. Użyjcie więc jednego wspólnego zasobu. WindSettings.cs jest gotowy, a zasób Breeze w projekcie (siła 2) znajduje się w polu wind każdej łodzi i obiektu WindVane.

  • Sailboat: zastąp windStrength publicznym polem wind typu WindSettings i płyń z prędkością wind.strength.
  • WindVane: zastąp strength publicznym polem wind i spraw, by strzałki zmieniały wind.strength, tak aby każda łódź odczuwała zmianę. Wyświetlany tekst pokazuje wartość, na przykład Wind: 3.
  • Przy każdym uruchomieniu kompilacja wczytuje zasób Breeze od nowa, co spowodowałoby utratę ustawień wiatru gracza. Zapisuj wind.strength pod kluczem PlayerPrefs Wind za każdym razem, gdy wartość się zmienia, a w Start przywróć zapisaną wartość do zasobu. Nowy gracz zachowuje wartość 2 z zasobu.

Naciśnij Play, zmień siłę wiatru, potem naciśnij Stop i ponownie Play, a następnie Check.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Architektura gier w Unity