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.
Wyzwanie
ŚredniNiech każda broń odczytuje swoje wartości z zasobu GunData.
- W klasie
Gundodajpublic GunData data;. - Strzelaj pociskami z
data.bulletPrefab, odczekujdata.fireIntervalmiędzy strzałami i przypisuj każdemu pociskowidata.damage. - Usuń
gunType, dwa pola dotyczące pocisków, trzy prywatne kopie iStart().
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
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity