Menu
CoddyTech

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.

challenge icon

Défi

Moyen

Fais en sorte que chaque arme lise ses valeurs depuis son asset GunData.

  1. Dans Gun, ajoute public GunData data;.
  2. Tire data.bulletPrefab, attends data.fireInterval entre les tirs et attribue data.damage à chaque balle.
  3. Supprime gunType, les deux champs de balle, les trois copies privées et Start().

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

Entraînez-vous par vous-même : Playground Unity