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.
Desafío
IntermedioHaz que cada arma lea sus valores de su recurso GunData.
- En
Gun, añadepublic GunData data;. - Dispara
data.bulletPrefab, esperadata.fireIntervalentre disparos y asignadata.damagea cada bala. - Elimina
gunType, los dos campos de bala, las tres copias privadas yStart().
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
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity