Gesundheit und Schaden
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 53 von 63.
Schaden benötigt zwei Skripte. Ein Health-Skript befindet sich auf allem, das Schaden nehmen kann, und verwaltet dessen Trefferpunkte. Was auch immer 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 von 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, und es ist der einzige Code, der hp ändert. Stacheln, Geschosse 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, daher prüfen die Stacheln dies, 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 füllt health nur dann aus, wenn ein solches Objekt vorhanden ist.
Aufgabe
MittelEine Trainingswaffe schießt auf eine Übungspuppe und einen gepanzerten Ritter. Das Shooter-Skript auf der Waffe ist bereit: Die Pfeiltasten nach links und rechts drehen sie, und die Leertaste feuert eine Kugel ab. Schreibe die beiden Skripte, die dafür sorgen, dass die Treffer zählen.
Health auf der Übungspuppe und dem Ritter (im Inspector werden hp und armor festgelegt):
- Eine öffentliche Methode
TakeDamage(int amount):hpsinkt umamountminusarmor, aber immer um mindestens 1. - Pro Treffer den Namen des Objekts und die verbleibenden hp protokollieren, zum Beispiel als
Dummy hp: 2. - Bei 0 hp oder weniger das Objekt zerstören.
Bullet auf jeder Kugel (im Inspector wird damage auf 2 festgelegt):
- Wenn die Kugel etwas trifft, das über eine Health-Komponente verfügt, dessen
TakeDamage(damage)aufrufen. - Unabhängig davon, was sie trifft, auch bei der Wand, die Kugel zerstören.
Drücke Play, wirf die Übungspuppe und den Ritter um und klicke dann auf Check.
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), protokolliere den verbleibenden Wert und zerstöre das Objekt bei 0
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Physik und Gameplay
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand3Trigger
Trigger-ColliderOnTriggerEnterSammelobjekteTodeszonenBetreten und VerlassenRückblick: Schlüssel und Tür6Raycasts
Physics.RaycastRaycastHitBodenprüfung mit einem RayLayer und LayerMaskSichtlinieOverlapSphere und SphereCastRückblick: Laser-Lichtschranke9Gegner
Verfolge den SpielerVerfolgung in ReichweitePatrouillieren und VerfolgenGesundheit und SchadenRückstoßRückblick: Wachhund