Współdzielone ustawienia
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 25 z 64.
Ustawienie poziomu trudności zmienia od razu wszystkich przeciwników, dlatego pasuje do niego jeden zasób, do którego wszyscy się odwołują. Każdy przeciwnik odczytuje z zasobu prędkość 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, podłączony do onClick przycisku Hard
public Difficulty difficulty;
public void SetHard()
{
difficulty.enemySpeed = 4f;
}Pola przeciwników i pole menu przechowują odwołanie do tego jednego zasobu, więc po wywołaniu SetHard() następne Update każdego przeciwnika odczyta wartość 4; dotyczy to także przeciwników utworzonych później z prefabrykatu, który ma ten zasób w swoim polu. Działa to dlatego, że każdy przeciwnik odczytuje difficulty.enemySpeed podczas ruchu. Przeciwnik, który skopiował tę wartość do własnego pola w Start, nadal porusza się z prędkością 2.
To, gdzie trafia zmiana wprowadzona podczas gry, zależy od tego, gdzie gra jest uruchomiona. Wersja kompilacyjna ładuje swoje zasoby w stanie z chwili kompilacji za każdym razem, gdy się uruchamia, więc ustawienie Hard wybrane przez gracza nie zostanie zachowane w następnej grze: aby zachować wybór, zapisz go za pomocą PlayerPrefs i zapisz z powrotem do zasobu podczas uruchamiania gry. W edytorze zmieniany jest zasób w projekcie, a zmiana pozostaje po naciśnięciu Stop, w przeciwieństwie do obiektów sceny, które wracają do wartości z Inspektora. Następne uruchomienie za pomocą Play rozpocznie się na poziomie Hard, a zasób zachowa wartość 4, dopóki jej nie zmienisz.
Wyzwanie
ŚredniSpraw, aby strzałki zmieniały siłę wiatru na każdej łodzi dzięki współdzieleniu jednego zasobu.
- W
SailboatzastąpwindStrengthprzezpublic WindSettings wind;i płyń z prędkościąwind.strength. - W
WindVanezastąpstrengthprzezpublic WindSettings wind;. - Spraw, aby strzałki zmieniały
wind.strength(od 0 do 5), a tekst wyświetlał tę wartość, na przykładWind: 3.
Naciśnij „Graj” i strzałkę w górę: wszystkie trzy łodzie przyspieszą. Następnie naciśnij „Sprawdź”.
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;
}
}
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity