Menu
CoddyTech

Statystyki broni

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 20 z 50.

Miecz i młot robią to samo: wykonują zamach, czekają i znów wykonują zamach. Różnią się wartościami liczbowymi. Miecz zadaje 4 punkty obrażeń i wykonuje zamach co 0.5 sekundy, a młot zadaje 10 punktów obrażeń co 1.5 sekundy. Dlatego jeden skrypt Weapon obsługuje oba, a wartości liczbowe każdej broni są przechowywane w zasobie:

[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);
    }
}

Projekt zawiera zasób Sword (4, 0.5, prefabrykowany efekt iskier) i zasób Hammer (10, 1.5, prefabrykowany efekt pyłu). Rycerz i ogr mają skrypt Weapon; pole data rycerza zawiera Sword, a ogra — Hammer. Włócznia to kolejny zasób utworzony z menu Create, bez żadnych zmian w skrypcie. Zasób może wskazywać na prefabrykaty i inne zasoby, tak jak robi to hitEffect, ale nie na obiekty w scenie: znajduje się w projekcie, poza każdą sceną.

Inne sposoby uzyskania różnych broni umieszczają wartości liczbowe w kodzie. if (weaponName == "Sword") damage = 4; else if ... rozrasta się wraz z każdą bronią, a podklasa Weapon o nazwie Sword, która tylko ustawia wartości liczbowe, oznacza jedną klasę na każdy zasób. Podklasy służą do tworzenia broni, które działają inaczej, na przykład łuku strzelającego strzałami. Broń, która tylko zadaje większe obrażenia lub szybciej wykonuje zamachy, potrzebuje własnego zasobu, ale nie wymaga kodu.

challenge icon

Wyzwanie

Średni

Strzelnica ma cztery rodzaje broni: dwa pistolety, karabin i nowy blaster. Przytrzymanie spacji strzela z każdej z nich. Skrypt Gun wybiera pocisk, odstęp między strzałami i obrażenia za pomocą if/else w zależności od gunType, a blastera w nim nie ma, więc nie strzela (sprawdź Konsolę).

Spraw, by każda broń pobierała swoje wartości z zasobu. GunData.cs jest już gotowy, a w projekcie są zasoby Pistol, Rifle i Blaster utworzone na jego podstawie — każdy ma własny prefab pocisku.

  • Dodaj do Gun publiczne pole data typu GunData; w Inspectorze przypisz do niego zasób każdej broni.
  • Strzelaj pociskiem data.bulletPrefab, odczekuj data.fireInterval między strzałami i przypisuj każdemu pociskowi data.damage.
  • Usuń gunType, oba pola pocisków, ich prywatne kopie oraz instrukcję if/else.

Naciśnij Play i przytrzymaj spację, a następnie kliknij Check.

Spróbuj swoich sił

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;
        }
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Architektura gier w Unity