Menu
CoddyTech

Statistiche delle armi

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 20 di 50.

Una spada e un martello fanno la stessa cosa: fendono, aspettano e fendono di nuovo. A distinguerli sono i numeri. Una spada infligge 4 danni e fende ogni 0.5 secondi, un martello infligge 10 danni ogni 1.5 secondi. Quindi basta uno script Weapon per entrambi, e i numeri di ciascuna arma risiedono in una risorsa:

[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);
    }
}

Il progetto contiene una risorsa Sword (4, 0.5, un prefab di scintilla) e una risorsa Hammer (10, 1.5, un prefab di polvere). Il cavaliere e l'orco hanno entrambi lo script Weapon; il campo data del cavaliere contiene Sword e quello dell'orco Hammer. Una lancia è un'altra risorsa creata dal menu Create, senza modificare alcuno script. Una risorsa può puntare a prefab e ad altre risorse, come fa hitEffect, ma non a oggetti in una scena: si trova nel progetto, al di fuori di tutte le scene.

Gli altri modi per ottenere armi diverse inseriscono tutti i numeri nel codice. if (weaponName == "Sword") damage = 4; else if ... cresce con ogni arma, e una sottoclasse Sword di Weapon che imposta solo i numeri equivale a una classe per ogni risorsa. Le sottoclassi servono per le armi che agiscono in modo diverso, come un arco che scaglia frecce. Un'arma che infligge solo più danni o fende più velocemente ha bisogno di una risorsa propria e di nessun codice.

challenge icon

Sfida

Medio

Il poligono di tiro ha quattro armi: due pistole, un fucile e un nuovo blaster. Tenendo premuto Space, sparano tutte. Lo script Gun seleziona il proiettile, l'intervallo di fuoco e i danni tramite if/else su gunType, ma il blaster non è incluso, quindi non spara (guarda la Console).

Fai in modo che ogni arma legga i propri valori da un asset. GunData.cs è pronto e il progetto contiene un asset Pistol, uno Rifle e uno Blaster creati a partire da esso, ciascuno con il proprio prefab del proiettile.

  • Aggiungi a Gun un campo pubblico data di tipo GunData; nell'Inspector inserisci l'asset di ciascuna arma.
  • Spara usando data.bulletPrefab, aspetta data.fireInterval tra un colpo e l'altro e assegna a ogni proiettile data.damage.
  • Rimuovi gunType, i due campi dei proiettili, le copie private e l'if/else.

Premi Play e tieni premuto Space, poi Check.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Architettura dei giochi in Unity