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.
Sfida
MedioIl 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
Gunun campo pubblicodatadi tipo GunData; nell'Inspector inserisci l'asset di ciascuna arma. - Spara usando
data.bulletPrefab, aspettadata.fireIntervaltra un colpo e l'altro e assegna a ogni proiettiledata.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;
}
}
}
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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti