Gesundheit und Schaden
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 55 von 71.
Schaden erfordert zwei Skripte. Ein Health-Skript befindet sich auf allem, das Schaden nehmen kann, und verwaltet dessen Lebenspunkte. Was den Schaden verursacht, findet dieses Skript und ruft eine Methode darauf auf. Hier ist das Health-Skript einer Kiste, die nach drei Treffern zerbricht, sowie das Skript für Stacheln, die allem Schaden zufügen, was auf ihnen landet:
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 3;
public void TakeDamage(int amount)
{
hp -= amount;
if (hp <= 0)
{
Destroy(gameObject);
}
}
}public class Spikes : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
Health health = collision.gameObject.GetComponent<Health>();
if (health != null)
{
health.TakeDamage(1);
}
}
}TakeDamage ist public, damit andere Skripte es aufrufen können. Außerdem ist es der einzige Code, der hp verändert. Stacheln, Kugeln und Lava rufen alle dieselbe Methode auf, und allein das Health-Skript entscheidet, was 0 bedeutet: die Kiste zerstören, das Spiel beenden oder eine Todesanimation abspielen. Jedes Skript befindet sich in einer eigenen Datei, die nach seiner Klasse benannt ist.
GetComponent<Health>() gibt für Objekte ohne Health, etwa den Boden, null zurück. Deshalb prüfen die Stacheln den Wert, bevor sie die Methode aufrufen. TryGetComponent(out Health health) führt die Suche und die Prüfung in einem Aufruf durch: Es gibt true zurück und weist health nur dann einen Wert zu, wenn ein Health-Skript vorhanden ist.
Aufgabe
MittelSorge dafür, dass jeder Treffer zählt. Bullet ist bereit und ruft bei dem, was es trifft, TakeDamage(2) auf.
- Fülle in
HealthTakeDamage(int amount)aus: ZieheMathf.Max(amount - armor, 1)vonhpab. - Protokolliere
name + " hp: " + hp, zum BeispielDummy hp: 2. - Rufe bei
hp <= 0Destroy(gameObject);auf.
Drücke „Spielen“ und schieße zweimal auf die Übungspuppe: Es wird Dummy hp: 2 protokolliert, dann verschwindet sie. Drücke anschließend „Prüfen“.
Probier es selbst
using UnityEngine;
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 4;
[SerializeField] private int armor = 0;
public void TakeDamage(int amount)
{
// Ziehe amount minus armor ab (mindestens 1), gib den verbleibenden Wert im Log aus und zerstöre das Objekt bei 0
}
}
Alle Lektionen in Physik und Gameplay
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe4Coroutinen
AufrufenWiederholt aufrufen, Aufruf abbrechenDeine erste CoroutineSchleifen in CoroutinenCoroutinen beendenRückblick: Countdown10Projekt: Arena-Flucht
Die ArenaJäger2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand5Projekt: Münzrausch
Der rollende BallMünzen zum Einsammeln11Abschließende Herausforderungen
KanonenreichweiteBewegliche ZieleMurmelgolfIns LochEscape RoomDie Tür3Trigger
Trigger-ColliderOnTriggerEnterSammelobjekteKisten behalten den RestTodeszonenBetreten und VerlassenRückblick: Schlüssel und Tür6Raycasts
Physics.RaycastRaycastHitBodenprüfung mit einem RayLayer und LayerMaskSichtlinieOverlapSphere und SphereCastRückblick: Laser-Lichtschranke9Gegner
Den Spieler verfolgenVerfolgung in ReichweitePatrouillieren und verfolgenGesundheit und SchadenTreffende KugelnRückstoßRückblick: WachhundÜbe selbstständig: Unity-Playground