Statistiche delle armi
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 24 di 64.
Una spada e un martello fanno la stessa cosa: oscillano, aspettano e oscillano di nuovo. A distinguerli sono i numeri. La spada infligge 4 danni e oscilla ogni 0.5 secondi, il martello infligge 10 danni ogni 1.5 secondi. Quindi basta uno script Weapon per entrambi, e i numeri di ciascuna arma sono contenuti 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). Sia il cavaliere sia l’orco hanno lo script Weapon; il campo data del cavaliere contiene Sword, mentre quello dell’orco contiene Hammer. Una lancia è un’altra risorsa creata dal menu Create, senza modificare alcuno script. Una risorsa può fare riferimento a prefab e ad altre risorse, come fa hitEffect, ma non a oggetti di una scena: risiede nel progetto, al di fuori di ogni scena.
Gli altri modi per ottenere armi diverse inseriscono tutti i numeri nel codice. if (weaponName == "Sword") damage = 4; else if ... cresce con ogni arma, mentre 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 oscilla più velocemente ha bisogno di una risorsa propria e non richiede codice.
Sfida
MedioFai in modo che ogni arma legga i propri valori dal suo asset GunData.
- In
Gun, aggiungipublic GunData data;. - Spara
data.bulletPrefab, attendidata.fireIntervaltra un colpo e l'altro e assegna a ogni proiettiledata.damage. - Elimina
gunType, i due campi dei proiettili, le tre copie private eStart().
Premi «Gioca» e tieni premuto Spazio: anche il blaster spara. Poi premi «Verifica».
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;
}
}
}
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozioEsercitati da solo: Playground Unity