Małe komponenty
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 1 z 64.
GameObject to lista komponentów, a każdy napisany przez ciebie skrypt to kolejny z nich. Gry w Unity buduje się, przypisując każdemu skryptowi jedno zadanie i umieszczając kilka skryptów na obiekcie. Ruch gracza, strzelanie i punkty życia mogłyby znajdować się w jednym PlayerController, ale jako trzy komponenty — Mover, Shooter i Health — każdy z nich można umieścić także 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żesz zamiast tego zbudować drzewo: Character, następnie ShootingCharacter : Character, a potem Player : ShootingCharacter. Wieżyczka strzela, ale nigdy nie chodzi, a skrzynia tylko się rozpada, więc każdy nowy rodzaj obiektu oznacza konieczność zmiany drzewa. W przypadku komponentów nowy rodzaj obiektu to nowa kombinacja istniejących już skryptów, zestawiona w Inspectorze. Każdy skrypt może mieć tam też własne wartości: wolniejszy Mover na jednym obiekcie, szybszy 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łą pozycję na new Vector3(x, 0.5f, z), przywracałby y w każdej klatce i niwelował skok.
Wyzwanie
ŁatwyPodziel Boat.cs tak, aby każdy skrypt wykonywał jedno zadanie.
- Przenieś kołysanie do
Bobber: ustawstartYwStart(), a kołysanie umieść wUpdate(), używając własnych wartościheightispeed. - Przenieś miganie do
Blinker, dodając własny timer. - Usuń oba zadania i ich pola z
Boat, aby sterował tylko łodzią.
Naciśnij „Graj”: kaczka kołysze się, boja miga, a łódź jest sterowana. Następnie naciśnij „Sprawdź”.
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;
}
}
}
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