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.
Aufgabe
EinfachTeile Boat.cs auf, sodass jedes Skript eine Aufgabe erledigt.
- Verschiebe das Auf und Ab nach
Bobber:startYwird inStart()gesetzt, das Auf und Ab erfolgt inUpdate()und verwendet die eigenen Werte fürheightundspeed. - Verschiebe das Blinken nach
Blinker, mit einem eigenen Timer. - 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
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground