Statistik Senjata
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 24 dari 64.
Pedang dan palu melakukan hal yang sama: mengayun, menunggu, lalu mengayun lagi. Yang membedakan keduanya adalah angkanya. Pedang menghasilkan 4 kerusakan dan mengayun setiap 0.5 detik, sedangkan palu menghasilkan 10 kerusakan setiap 1.5 detik. Jadi, satu skrip Weapon dapat digunakan untuk keduanya, dan angka untuk setiap senjata disimpan dalam sebuah aset:
[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);
}
}Proyek ini memiliki aset Pedang (4, 0.5, prefab percikan) dan aset Palu (10, 1.5, prefab debu). Kesatria dan ogre sama-sama membawa skrip Weapon. Kolom data milik kesatria menyimpan Pedang, sedangkan kolom milik ogre menyimpan Palu. Tombak adalah satu aset lagi yang dibuat dari menu Create, tanpa mengubah skrip apa pun. Sebuah aset dapat menunjuk ke prefab dan aset lain, seperti yang dilakukan hitEffect, tetapi tidak ke objek di dalam scene: aset berada di proyek, di luar semua scene.
Cara lain untuk mendapatkan senjata yang berbeda masing-masing menaruh angka di dalam kode. if (weaponName == "Sword") damage = 4; else if ... akan bertambah panjang setiap kali ada senjata baru, sedangkan subclass Sword dari Weapon yang hanya menetapkan angka berarti satu class untuk setiap aset. Subclass digunakan untuk senjata yang berperilaku berbeda, seperti busur yang menembakkan anak panah. Senjata yang hanya menghasilkan pukulan lebih kuat atau mengayun lebih cepat membutuhkan aset tersendiri dan tidak memerlukan kode.
Tantangan
SedangBuat setiap senjata membaca nilainya dari aset GunData.
- Di
Gun, tambahkanpublic GunData data;. - Tembakkan
data.bulletPrefab, tunggudata.fireIntervaldi antara tembakan, lalu berikan setiap pelurudata.damage. - Hapus
gunType, kedua field peluru, tiga salinan privat, danStart().
Tekan tombol “Main” dan tahan Space: blaster juga menembak. Lalu tekan tombol “Periksa”.
Coba sendiri
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;
}
}
}
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity