Menu
CoddyTech

Estadísticas de armas

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 24 de 64.

Una espada y un martillo hacen lo mismo: dan un golpe, esperan y vuelven a golpear. Lo que los distingue son los números. La espada inflige 4 de daño y golpea cada 0.5 segundos; el martillo inflige 10 cada 1.5 segundos. Así que un mismo script Weapon sirve para ambos, y los números de cada arma se guardan en un recurso:

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

El proyecto contiene un recurso Sword (4, 0.5, un prefab de chispas) y un recurso Hammer (10, 1.5, un prefab de polvo). Tanto el caballero como el ogro tienen el script Weapon; el campo data del caballero contiene Sword y el del ogro, Hammer. Una lanza es otro recurso creado desde el menú Create, sin cambiar ningún script. Un recurso puede apuntar a prefabs y a otros recursos, como hace hitEffect, pero no a objetos de una escena: vive en el proyecto, fuera de todas las escenas.

Las otras formas de obtener armas diferentes ponen los números en el código. if (weaponName == "Sword") damage = 4; else if ... crece con cada arma, y una subclase Sword de Weapon que solo establece números implica una clase por recurso. Las subclases son para armas que se comportan de forma diferente, como un arco que dispara flechas. Un arma que solo golpea con más fuerza o golpea más rápido necesita su propio recurso y ningún código.

challenge icon

Desafío

Intermedio

Haz que cada arma lea sus valores de su recurso GunData.

  1. En Gun, añade public GunData data;.
  2. Dispara data.bulletPrefab, espera data.fireInterval entre disparos y asigna data.damage a cada bala.
  3. Elimina gunType, los dos campos de bala, las tres copias privadas y Start().

Pulsa «Jugar» y mantén pulsada la barra espaciadora: el bláster también dispara. Después, «Comprobar».

Pruébalo tú mismo

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

Todas las lecciones de Arquitectura de juegos en Unity

Practica por tu cuenta: Playground de Unity