Statistiques des armes
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 20 sur 50.
Une épée et un marteau font la même chose : ils frappent, attendent, puis frappent à nouveau. Ce qui les distingue, ce sont les nombres. 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 sert donc aux deux, et les nombres de chaque arme sont stockés 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'étincelle) et un asset Hammer (10, 1.5, un prefab de poussière). Le chevalier et l'ogre possèdent tous deux le script Weapon ; le champ data du chevalier contient Sword, et celui de l'ogre contient Hammer. Une lance est un asset supplémentaire créé depuis le menu Create, sans aucune modification de script. Un asset peut référencer des prefabs et d'autres assets, comme le fait hitEffect, mais pas des objets d'une scène : il se trouve dans le projet, en dehors de toutes les scènes.
Les autres moyens de créer différentes armes placent tous les nombres 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 nombres correspond à une classe par asset. Les sous-classes servent aux armes qui ont un comportement différent, 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
MoyenLe champ de tir comporte quatre armes : deux pistolets, un fusil et un nouveau blaster. Maintenir la barre d’espace enfoncée tire avec chacune d’elles. Le script Gun choisit sa balle, son intervalle de tir et ses dégâts avec un if/else basé sur gunType, mais le blaster n’y figure pas : il ne tire donc pas (regarde la Console).
Fais en sorte que chaque arme lise ses valeurs depuis un asset. GunData.cs est prêt, et le projet contient un asset Pistol, un asset Rifle et un asset Blaster créés à partir de celui-ci, chacun avec son propre prefab de balle.
- Ajoute à
Gunun champ publicdatade type GunData ; l’Inspector y place l’asset de chaque arme. - Tire avec
data.bulletPrefab, attendsdata.fireIntervalentre les tirs et attribue à chaque balledata.damage. - Supprime
gunType, les deux champs de balle, les copies privées et le if/else.
Appuie sur Jouer et maintiens la barre d’espace enfoncée, puis clique 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;
}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Architecture de jeu dans Unity
1Des composants, pas des hiérarchies
Des composants simplesUn script de base pour les ennemisDes composants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaire4Données sérialisées
Classes sérialisablesListes dans l’inspecteurÉnumérations dans l’inspecteurRécapitulatif : table de butin7Machines à états
Les états sous forme de classesUne machine à étatsTransitionsLes cerveaux des ennemisRécapitulatif : états d’une porte10Projet : Survivant de l’arène
Le hérosTypes d’ennemis2Interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interaction5ScriptableObjects
Assets de donnéesStatistiques des armesParamètres partagésLes vagues sous forme de donnéesRécapitulatif : base de données d’objets