Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Boat.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 height jednostek 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 co interval sekund.
  • 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;
        }
    }
}
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