Menu
CoddyTech

Silah İstatistikleri

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 24 / 64.

Bir kılıç ve bir çekiç aynı şeyi yapar: savrulur, bekler ve tekrar savrulur. Aralarındaki fark sayılardır. Kılıç 4 hasar verir ve her 0.5 saniyede bir savrulur; çekiç ise 10 hasar verir ve her 1.5 saniyede bir savrulur. Böylece tek bir Weapon betiği ikisi için de kullanılır ve her silahın sayıları bir varlıkta tutulur:

[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);
    }
}

Projede bir Kılıç varlığı (4, 0.5, bir kıvılcım prefab'ı) ve bir Çekiç varlığı (10, 1.5, bir toz prefab'ı) bulunur. Şövalye ve devin ikisi de Weapon betiğini taşır; şövalyenin data alanında Kılıç, devinkinde ise Çekiç bulunur. Create menüsünden oluşturulan bir mızrak da başka bir varlıktır; hiçbir betikte değişiklik yapmaya gerek yoktur. Bir varlık, hitEffect'in yaptığı gibi prefab'lara ve diğer varlıklara başvurabilir, ancak sahnedeki nesnelere başvuramaz: proje içinde, her sahnenin dışında bulunur.

Farklı silahlar elde etmenin diğer yollarının her birinde sayılar koda yazılır. if (weaponName == "Sword") damage = 4; else if ... her silahla birlikte büyür; yalnızca sayıları belirleyen bir Weapon alt sınıfı olan Sword ise her varlık için ayrı bir sınıf demektir. Alt sınıflar, ok atan bir yay gibi farklı davranan silahlar içindir. Yalnızca daha sert vuran veya daha hızlı savrulan bir silahın kendi varlığına ihtiyacı vardır, koda değil.

challenge icon

Görev

Orta

Her silahın değerlerini kendi GunData varlığından okumasını sağla.

  1. Gun içinde public GunData data; ekle.
  2. data.bulletPrefab ile ateş et, atışlar arasında data.fireInterval kadar bekle ve her mermiyi data.damage ile donat.
  3. gunType öğesini, iki mermi alanını, üç özel kopyayı ve Start() öğesini sil.

“Oyna” düğmesine bas ve Space tuşunu basılı tut: blaster da ateş eder. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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;
        }
    }
}

Unity'de Oyun Mimarisi bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground