Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Der 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 Gun ein öffentliches Feld data vom Typ GunData; im Inspector wird jeder Waffe ihr Asset zugewiesen.
  • Feuere data.bulletPrefab ab, warte zwischen den Schüssen data.fireInterval und weise jedem Geschoss data.damage zu.
  • 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;
        }
    }
}
quiz iconTeste dich selbst

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