Menu
CoddyTech

Statystyki broni

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

Miecz i młot robią to samo: wykonują zamach, czekają i wykonują kolejny zamach. Różnią się tylko 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. Wystarczy więc jeden skrypt Weapon dla obu broni, a wartości liczbowe każdej z nich są zapisane 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, prefab iskry) i zasób Hammer (10, 1.5, prefab pyłu). Rycerz i ogr mają skrypt Weapon; pole data rycerza zawiera Sword, a pole ogra — Hammer. Włócznia to kolejny zasób utworzony za pomocą menu Create, bez wprowadzania zmian w żadnym skrypcie. Zasób może wskazywać na prefaby i inne zasoby, tak jak robi to hitEffect, ale nie na obiekty w scenie: znajduje się w projekcie, poza każdą sceną.

Inne sposoby tworzenia różnych broni polegają na umieszczaniu wartości liczbowych w kodzie. if (weaponName == "Sword") damage = 4; else if ... rozrasta się wraz z każdą kolejną bronią, a podklasa Weapon o nazwie Sword, która tylko ustawia wartości liczbowe, oznacza osobną klasę dla każdego zasobu. Podklasy służą do tworzenia broni działających inaczej, na przykład łuku wystrzeliwującego strzały. Broń, która tylko zadaje większe obrażenia lub szybciej wykonuje zamach, potrzebuje własnego zasobu, ale nie wymaga kodu.

challenge icon

Wyzwanie

Średni

Niech każda broń odczytuje swoje wartości z zasobu GunData.

  1. W klasie Gun dodaj public GunData data;.
  2. Strzelaj pociskami z data.bulletPrefab, odczekuj data.fireInterval między strzałami i przypisuj każdemu pociskowi data.damage.
  3. Usuń gunType, dwa pola dotyczące pocisków, trzy prywatne kopie i Start().

Naciśnij „Graj” i przytrzymaj spację: blaster też strzela. Następnie naciśnij „Sprawdź”.

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

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity