Statistiques des armes
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 24 sur 64.
Une épée et un marteau font la même chose : ils frappent, attendent, puis frappent à nouveau. Ce qui les distingue, ce sont leurs valeurs. Une épée inflige 4 points de dégâts et frappe toutes les 0.5 secondes, un marteau inflige 10 points de dégâts toutes les 1.5 secondes. Un seul script Weapon suffit donc pour les deux, et les valeurs de chaque arme sont stockées dans un asset :
[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);
}
}Le projet contient un asset Sword (4, 0.5, un prefab d’étincelles) et un asset Hammer (10, 1.5, un prefab de poussière). Le chevalier et l’ogre ont tous deux le script Weapon ; le champ data du chevalier contient Sword et celui de l’ogre, Hammer. Une lance est un asset supplémentaire créé depuis le menu Create, sans modifier aucun script. Un asset peut pointer vers des prefabs et d’autres assets, comme le fait hitEffect, mais pas vers des objets d’une scène : il se trouve dans le projet, en dehors de toutes les scènes.
Les autres façons de créer différentes armes stockent toutes les valeurs dans le code. if (weaponName == "Sword") damage = 4; else if ... s’allonge avec chaque arme, et une sous-classe Sword de Weapon qui ne fait que définir des valeurs revient à avoir une classe par asset. Les sous-classes servent aux armes qui se comportent différemment, comme un arc qui tire des flèches. Une arme qui inflige simplement plus de dégâts ou frappe plus vite a besoin de son propre asset et d’aucun code.
Défi
MoyenFais en sorte que chaque arme lise ses valeurs depuis son asset GunData.
- Dans
Gun, ajoutepublic GunData data;. - Tire
data.bulletPrefab, attendsdata.fireIntervalentre les tirs et attribuedata.damageà chaque balle. - Supprime
gunType, les deux champs de balle, les trois copies privées etStart().
Appuie sur « Jouer » et maintiens la barre d’espace enfoncée : le blaster tire aussi. Puis appuie sur « Vérifier ».
Essayez vous-même
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;
}
}
}
Toutes les leçons de Architecture de jeu dans Unity
1Des composants, pas des hiérarchies
De petits composantsUn script de base pour les ennemisComposants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaireRécapitulatif : canon double4Données sérialisées
Classes sérialisablesListes dans l’InspecteurÉnumérations dans l’InspecteurRécapitulatif : table de butinRécapitulatif : tirer le butin2Les interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interactionLe plus proche à portée5ScriptableObjects
Ressources de donnéesStatistiques des armesParamètres partagésSauver le ventLes vagues comme donnéesRécapitulatif : base de données des objetsRécapitulatif : acheter dans la boutique3Événements
Les événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interfaceRécapitulatif : fenêtre de succèsRécapitulatif : minuteur de la fenêtreEntraînez-vous par vous-même : Playground Unity