Statistik Senjata
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 20 dari 50.
Pedang dan palu melakukan hal yang sama: mengayun, menunggu, lalu mengayun lagi. Yang membedakan keduanya adalah angkanya. Pedang memberikan damage sebesar 4 dan mengayun setiap 0.5 detik, sedangkan palu memberikan damage sebesar 10 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 Sword (4, 0.5, sebuah prefab percikan) dan aset Hammer (10, 1.5, sebuah prefab debu). Kesatria dan ogre sama-sama membawa skrip Weapon. Field data milik kesatria berisi Sword, sedangkan milik ogre berisi Hammer. Tombak bisa dibuat sebagai aset tambahan melalui menu Create, tanpa mengubah skrip apa pun. Sebuah aset dapat menunjuk ke prefab dan aset lain, seperti yang dilakukan hitEffect, tetapi tidak dapat menunjuk ke object dalam scene: aset berada di dalam proyek, di luar setiap scene.
Cara lain untuk membuat senjata yang berbeda sama-sama menempatkan angka di dalam kode. if (weaponName == "Sword") damage = 4; else if ... akan bertambah panjang untuk setiap senjata, sedangkan subclass Sword dari Weapon yang hanya mengatur angka berarti satu class untuk setiap aset. Subclass digunakan untuk senjata yang bertindak berbeda, seperti busur yang menembakkan panah. Senjata yang hanya memberikan damage lebih besar atau mengayun lebih cepat cukup memiliki asetnya sendiri dan tidak memerlukan kode.
Tantangan
SedangLapangan tembak ini memiliki empat senjata: dua pistol, satu senapan, dan satu blaster baru. Tahan Space untuk menembakkan semuanya. Skrip Gun memilih peluru, jeda tembakan, dan damage dengan if/else berdasarkan gunType, tetapi blaster tidak tercakup di dalamnya, jadi blaster tidak menembak (lihat Console).
Buat setiap senjata membaca nilainya dari asset. GunData.cs sudah siap, dan proyek ini memiliki asset Pistol, Rifle, dan Blaster yang dibuat darinya, masing-masing dengan bullet prefab sendiri.
- Tambahkan field publik
databertipe GunData keGun; Inspector akan memasukkan asset setiap senjata ke dalamnya. - Tembakkan
data.bulletPrefab, tunggu selamadata.fireIntervaldi antara tembakan, dan berikan setiap pelurudata.damage. - Hapus
gunType, kedua field peluru, salinan privat, dan if/else.
Tekan Play dan tahan Space, lalu Check.
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;
}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja SamaRingkasan: Turret Modular5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaGelombang sebagai DataUlasan: database Item8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest