Estadísticas de armas
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 20 de 50.
Una espada y un martillo hacen lo mismo: dan un golpe, esperan y vuelven a golpear. Lo que los diferencia son los números. Una espada inflige 4 de daño y golpea cada 0.5 segundos; un martillo inflige 10 cada 1.5 segundos. Así que un único 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 llevan 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 es una clase por recurso. Las subclases sirven para armas que actúan de forma diferente, como un arco que dispara flechas. Un arma que solo golpea más fuerte o más rápido necesita su propio recurso y ningún código.
Desafío
IntermedioEl campo de tiro tiene cuatro armas: dos pistolas, un rifle y un bláster nuevo. Al mantener pulsada la tecla Space, disparan todas. El script Gun elige la bala, el intervalo de disparo y el daño mediante if/else según gunType, pero el bláster no está incluido, así que no dispara (mira la Consola).
Haz que cada arma lea sus valores de un recurso en su lugar. GunData.cs está listo, y el proyecto tiene un recurso Pistol, uno Rifle y uno Blaster creados a partir de él, cada uno con su propio prefab de bala.
- Añade a
Gunun campo públicodatade tipo GunData; en el Inspector se asigna a cada arma su recurso. - Dispara
data.bulletPrefab, esperadata.fireIntervalentre disparos y asigna a cada baladata.damage. - Elimina
gunType, los dos campos de bala, las copias privadas y el if/else.
Pulsa Play y mantén pulsada la tecla Space; después, pulsa Check.
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;
}
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Arquitectura de juegos en Unity
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos