Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Podziel Boat.cs tak, aby każdy skrypt wykonywał jedno zadanie.

  1. Przenieś kołysanie do Bobber: ustaw startY w Start(), a kołysanie umieść w Update(), używając własnych wartości height i speed.
  2. Przenieś miganie do Blinker, dodając własny timer.
  3. 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

Poćwicz samodzielnie: Edytor online Unity