Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Fai in modo che ogni arma legga i propri valori dal suo asset GunData.

  1. In Gun, aggiungi public GunData data;.
  2. Spara data.bulletPrefab, attendi data.fireInterval tra un colpo e l'altro e assegna a ogni proiettile data.damage.
  3. Elimina gunType, i due campi dei proiettili, le tre copie private e Start().

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

Esercitati da solo: Playground Unity