Kleine Komponenten
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 1 von 50.
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 erhält und mehrere Skripte auf einem Objekt zusammengefügt werden. Die Bewegung, das Schießen und die Trefferpunkte eines Spielers könnten alle in einem PlayerController enthalten sein, aber als drei Komponenten, Mover, Shooter und Health, kann jede davon auch auf anderen Objekten verwendet 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 einen Baum aufbauen: Character, dann ShootingCharacter : Character, dann Player : ShootingCharacter. Ein Geschützturm schießt, läuft aber nie, und eine Kiste geht nur kaputt. Daher bedeutet jede neue Objektart, den Baum umzugestalten. Bei Komponenten ist eine neue Objektart eine neue Kombination bereits vorhandener Skripte, die im Inspector zusammengestellt werden. Jedes Skript kann dort außerdem eigene Werte haben: ein langsamer Mover auf einem Objekt, ein schneller auf einem anderen.
Komponenten auf einem Objekt verwenden dessen Transform gemeinsam, daher sollte jede nur den Teil ändern, für den sie zuständig ist. Ein Mover, der mit transform.position += zu x und z addiert, lässt y unverändert, sodass ein Jumper auf demselben Objekt weiterhin die Höhe ändern kann. Ein Mover, der die gesamte Position auf new Vector3(x, 0.5f, z) setzen würde, setzte y in jedem Frame zurück und würde den Sprung aufheben.
Aufgabe
EinfachBoat.cs erledigt drei Aufgaben auf einmal: Die Pfeile (die Aktion Move) steuern das Boot, das Boot schaukelt auf den Wellen, und seine Lampe blinkt. Auch die Ente muss schaukeln, und die Boje muss schaukeln und blinken. Deshalb hat die Szene ihnen bereits die Komponenten Bobber und Blinker zugewiesen, und das Boot hat alle drei. Teile Boat.cs in diese Komponenten auf:
- Bobber: Jedes Objekt schaukelt um die Höhe, auf der es startet, um
heightEinheiten nach oben und unten, mit seiner eigenenspeed(beides wird im Inspector festgelegt). Bobber ändert nur den y-Wert der Position, damit das Boot weiterhin gesteuert werden kann. - Blinker: Schaltet
lamp(einen Renderer) alleintervalSekunden ein und aus. - Boat behält nur die Steuerung: Lösche das Schaukeln und Blinken samt den zugehörigen Feldern.
Drücke Play, steuere das Boot herum und klicke dann auf Check.
Probier es selbst
using UnityEngine;
using UnityEngine.InputSystem;
// Ein Skript, drei Aufgaben: Steuern, 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;
// 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;
}
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basisskript für GegnerAbstrakte KomponentenKomponenten im ZusammenspielRückblick: Modularer Geschützturm4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-Tabelle7Zustandsautomaten
Zustände als KlassenEin ZustandsautomatÜbergängeGegner-KIWiederholung: Türzustände10Projekt: Arena-Überlebenskampf
Der HeldGegnertypen2Interfaces in Unity
IDamageableInterfaces und TryGetComponentGetComponentsRückblick: Interaktionstaste5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenWellen als DatenRückblick: Item-Datenbank8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearest