Waffenwerte
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 20 von 50.
Ein Schwert und ein Hammer machen dasselbe: Sie schwingen, warten und schwingen erneut. Sie unterscheiden sich durch ihre Werte. Ein Schwert verursacht 4 Schaden und schwingt alle 0.5 Sekunden, ein Hammer verursacht 10 Schaden alle 1.5 Sekunden. Deshalb reicht ein Weapon-Skript für beide, und die Werte jeder Waffe befinden sich in einem Asset:
[CreateAssetMenu(menuName = "Combat/Weapon Data")]
public class WeaponData : ScriptableObject
{
public string weaponName;
public int damage;
public float swingTime;
public GameObject hitEffect;
}public class Weapon : MonoBehaviour
{
public WeaponData data;
private float nextSwing;
public void Swing(Health target)
{
if (Time.time < nextSwing) return;
nextSwing = Time.time + data.swingTime;
target.TakeDamage(data.damage);
Instantiate(data.hitEffect, target.transform.position, Quaternion.identity);
}
}Das Projekt enthält ein Sword-Asset (4, 0.5, ein Funken-Prefab) und ein Hammer-Asset (10, 1.5, ein Staub-Prefab). Sowohl der Ritter als auch der Oger haben das Weapon-Skript; im Feld data des Ritters befindet sich das Sword, im Feld des Ogers der Hammer. Ein Speer ist ein weiteres Asset, das über das Create-Menü erstellt wird, ohne dass ein Skript geändert werden muss. Ein Asset kann auf Prefabs und andere Assets verweisen, wie hitEffect, aber nicht auf Objekte in einer Szene: Es befindet sich im Projekt, außerhalb aller Szenen.
Bei den anderen Möglichkeiten, unterschiedliche Waffen zu erhalten, werden die Werte jeweils im Code festgelegt. if (weaponName == "Sword") damage = 4; else if ... wird mit jeder Waffe länger, und eine Sword-Unterklasse von Weapon, die nur Werte festlegt, bedeutet eine Klasse pro Asset. Unterklassen sind für Waffen gedacht, die sich anders verhalten, etwa ein Bogen, der Pfeile abschießt. Eine Waffe, die lediglich härter zuschlägt oder schneller schwingt, benötigt ein eigenes Asset und keinen Code.
Aufgabe
MittelDer Schießstand hat vier Waffen: zwei Pistolen, ein Gewehr und einen neuen Blaster. Wenn du die Leertaste gedrückt hältst, feuern sie alle. Das Gun-Skript wählt Geschoss, Schussintervall und Schaden mithilfe von if/else für gunType aus. Der Blaster ist darin nicht enthalten und feuert daher nicht (sieh in der Console nach).
Lass jede Waffe ihre Werte stattdessen aus einem Asset lesen. GunData.cs ist bereits vorhanden, und das Projekt enthält ein Pistolen-, ein Gewehr- und ein Blaster-Asset, die damit erstellt wurden und jeweils ein eigenes Geschoss-Prefab haben.
- Gib
Gunein öffentliches Felddatavom Typ GunData; im Inspector wird jeder Waffe ihr Asset zugewiesen. - Feuere
data.bulletPrefabab, warte zwischen den Schüssendata.fireIntervalund weise jedem Geschossdata.damagezu. - Entferne
gunType, die beiden Geschossfelder, die privaten Kopien und das if/else.
Drücke Play und halte die Leertaste gedrückt, dann Check.
Probier es selbst
using UnityEngine;
using UnityEngine.InputSystem;
public class Gun : MonoBehaviour
{
public string gunType = "Pistol";
public GameObject pistolBullet;
public GameObject rifleBullet;
private GameObject bulletPrefab;
private float fireInterval;
private int damage;
private float nextShot;
void Start()
{
if (gunType == "Pistol")
{
bulletPrefab = pistolBullet;
fireInterval = 0.25f;
damage = 1;
}
else if (gunType == "Rifle")
{
bulletPrefab = rifleBullet;
fireInterval = 0.6f;
damage = 4;
}
}
void Update()
{
if (Keyboard.current.spaceKey.isPressed && Time.time >= nextShot)
{
nextShot = Time.time + fireInterval;
GameObject bullet = Instantiate(bulletPrefab, transform.position + transform.forward, transform.rotation);
bullet.GetComponent<Bullet>().damage = damage;
}
}
}
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