Małe komponenty
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 1 z 50.
GameObject to lista komponentów, a każdy napisany przez ciebie skrypt jest jednym z nich. Gry w Unity tworzy się, przypisując każdemu skryptowi jedno zadanie i umieszczając kilka skryptów na jednym obiekcie. Ruch, strzelanie i punkty zdrowia gracza mogłyby być obsługiwane przez jeden PlayerController, ale jako trzy komponenty, Mover, Shooter i Health, każdy z nich może też znaleźć się na innych obiektach:
public class Health : MonoBehaviour
{
public int hp = 3;
public void TakeDamage(int amount)
{
hp -= amount;
if (hp <= 0)
{
Destroy(gameObject);
}
}
}- Gracz: Mover, Shooter, Health
- Wieżyczka: Shooter, Health
- Skrzynia: Health
Używając zwykłych klas C#, można by zamiast tego utworzyć drzewo: Character, potem ShootingCharacter : Character, a następnie Player : ShootingCharacter. Wieżyczka strzela, ale nigdy nie chodzi, a skrzynia tylko się rozpada, więc każdy nowy rodzaj obiektu oznaczałby konieczność przebudowania drzewa. W przypadku komponentów nowy rodzaj obiektu to nowa kombinacja istniejących skryptów, zestawiona w Inspectorze, a każdy skrypt może mieć tam własne wartości: powolny Mover na jednym obiekcie, szybki na innym.
Komponenty na jednym obiekcie współdzielą jego Transform, więc każdy z nich powinien zmieniać tylko tę część, za którą odpowiada. Mover, który dodaje wartości do x i z za pomocą transform.position +=, nie zmienia y, więc Jumper na tym samym obiekcie nadal może zmieniać wysokość. Mover, który ustawia całe położenie na new Vector3(x, 0.5f, z), przywracałby wartość y w każdej klatce i anulował skok.
Wyzwanie
ŁatwyBoat.cs wykonuje jednocześnie trzy zadania: strzałki (akcja Move) sterują łodzią, łódź kołysze się na falach, a jej lampka miga. Kaczka również potrzebuje kołysania, a boja — kołysania i migania, więc scena już przypisuje im komponenty Bobber i Blinker, a łódź ma wszystkie trzy. Podziel Boat.cs na te komponenty:
- Bobber: każdy obiekt kołysze się wokół wysokości, na której się znajduje na początku, o
heightjednostek w górę i w dół, z własną prędkościąspeed(Inspector ustawia obie wartości). Bobber zmienia tylko współrzędną y pozycji, więc łódź nadal może być sterowana. - Blinker: przełącza
lamp(Renderer) między stanem włączonym i wyłączonym cointervalsekund. - Boat zachowuje tylko sterowanie: usuń kołysanie i miganie wraz z ich polami.
Naciśnij Play i pokieruj łodzią, a następnie naciśnij Check.
Spróbuj swoich sił
using UnityEngine;
using UnityEngine.InputSystem;
// Jeden skrypt, trzy zadania: sterowanie, kołysanie i miganie.
public class Boat : MonoBehaviour
{
public float speed = 3f;
public float bobHeight = 0.1f;
public float bobSpeed = 2f;
public Renderer lamp;
public float blinkInterval = 0.5f;
private InputAction moveAction;
private float startY;
private float blinkTimer;
void Start()
{
moveAction = InputSystem.actions.FindAction("Move");
startY = transform.position.y;
}
void Update()
{
// sterowanie
Vector2 input = moveAction.ReadValue<Vector2>();
transform.position += new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime;
// kołysanie
Vector3 p = transform.position;
p.y = startY + Mathf.Sin(Time.time * bobSpeed) * bobHeight;
transform.position = p;
// miganie
blinkTimer += Time.deltaTime;
if (blinkTimer >= blinkInterval)
{
blinkTimer -= blinkInterval;
lamp.enabled = !lamp.enabled;
}
}
}
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