Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang

Buat setiap senjata membaca nilainya dari aset GunData.

  1. Di Gun, tambahkan public GunData data;.
  2. Tembakkan data.bulletPrefab, tunggu data.fireInterval di antara tembakan, lalu berikan setiap peluru data.damage.
  3. Hapus gunType, kedua field peluru, tiga salinan privat, dan Start().

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

Latihan sendiri: Playground Unity