Menu
CoddyTech

Kleine Komponenten

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 1 von 64.

Ein GameObject ist eine Liste von Komponenten, und jedes Skript, das du schreibst, ist eine weitere davon. Unity-Spiele entstehen, indem jedes Skript eine Aufgabe übernimmt und mehrere Skripte auf einem Objekt zusammengefügt werden. Die Bewegung, das Schießen und die Trefferpunkte einer Spielfigur könnten alle in einem PlayerController untergebracht sein, aber als drei Komponenten, Mover, Shooter und Health, kann jede davon auch anderen Objekten hinzugefügt werden:

public class Health : MonoBehaviour
{
    public int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
  • Spieler: Mover, Shooter, Health
  • Geschützturm: Shooter, Health
  • Kiste: Health

Mit einfachen C#-Klassen könntest du stattdessen eine Hierarchie aufbauen: Character, dann ShootingCharacter : Character, dann Player : ShootingCharacter. Ein Geschützturm schießt, läuft aber nie, und eine Kiste zerbricht nur, also bedeutet jede neue Objektart, die Hierarchie umzugestalten. Bei Komponenten besteht eine neue Objektart aus einer neuen Kombination bereits vorhandener Skripte, die im Inspector zusammengestellt werden. Außerdem kann jedes Skript dort eigene Werte haben: ein langsamer Mover auf einem Objekt, ein schneller auf einem anderen.

Komponenten auf demselben Objekt teilen sich dessen Transform, deshalb sollte jede nur den Teil verändern, für den sie zuständig ist. Ein Mover, der mit transform.position += x und z erhöht, lässt y unverändert, sodass ein Jumper auf demselben Objekt weiterhin die Höhe verändern kann. Ein Mover, der die gesamte Position auf new Vector3(x, 0.5f, z) setzt, würde y in jedem Frame zurücksetzen und den Sprung aufheben.

challenge icon

Aufgabe

Einfach

Teile Boat.cs auf, sodass jedes Skript eine Aufgabe erledigt.

  1. Verschiebe das Auf und Ab nach Bobber: startY wird in Start() gesetzt, das Auf und Ab erfolgt in Update() und verwendet die eigenen Werte für height und speed.
  2. Verschiebe das Blinken nach Blinker, mit einem eigenen Timer.
  3. Lösche beide Aufgaben und ihre Felder aus Boat, sodass es nur noch das Boot steuert.

Drücke „Spielen“: Die Ente wippt auf und ab, die Boje blinkt und das Boot wird gesteuert. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;
using UnityEngine.InputSystem;

// Ein Skript, drei Aufgaben: Steuern, Auf und Ab schaukeln und Blinken.
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()
    {
        // Steuern
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.position += new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime;

        // Auf und Ab schaukeln
        Vector3 p = transform.position;
        p.y = startY + Mathf.Sin(Time.time * bobSpeed) * bobHeight;
        transform.position = p;

        // Blinken
        blinkTimer += Time.deltaTime;
        if (blinkTimer >= blinkInterval)
        {
            blinkTimer -= blinkInterval;
            lamp.enabled = !lamp.enabled;
        }
    }
}

Alle Lektionen in Spielarchitektur in Unity

Übe selbstständig: Unity-Playground