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.
Wyzwanie
ŚredniTrzy ż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ąpwindStrengthpublicznym polemwindtypu WindSettings i płyń z prędkościąwind.strength.WindVane: zastąpstrengthpublicznym polemwindi spraw, by strzałki zmieniaływind.strength, tak aby każda łódź odczuwała zmianę. Wyświetlany tekst pokazuje wartość, na przykładWind: 3.- Przy każdym uruchomieniu kompilacja wczytuje zasób Breeze od nowa, co spowodowałoby utratę ustawień wiatru gracza. Zapisuj
wind.strengthpod kluczem PlayerPrefsWindza 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;
}
}
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
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest