Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang

Lapangan 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 data bertipe GunData ke Gun; Inspector akan memasukkan asset setiap senjata ke dalamnya.
  • Tembakkan data.bulletPrefab, tunggu selama data.fireInterval di antara tembakan, dan berikan setiap peluru data.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;
        }
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Arsitektur Game di Unity