Menu
CoddyTech

Silah İstatistikleri

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

Bir kılıç ve bir çekiç aynı şeyi yapar: savurur, bekler ve tekrar savurur. Aralarındaki fark sayılardır. Kılıç 4 hasar verir ve her 0.5 saniyede bir savrulur; çekiç 10 hasar verir ve her 1.5 saniyede bir savrulur. Bu nedenle her ikisi için de tek bir Weapon betiği yeterlidir 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);
    }
}

Proje, bir Sword varlığı (4, 0.5, kıvılcım prefab'ı) ve bir Hammer varlığı (10, 1.5, toz prefab'ı) içerir. Şövalye ve ogre ikisi de Weapon betiğini taşır; şövalyenin data alanında Sword, ogre'ninkinde ise Hammer bulunur. Create menüsünden oluşturulan bir mızrak da başka bir varlıktır; hiçbir betikte değişiklik gerekmez. Bir varlık, hitEffect'in yaptığı gibi prefab'lara ve diğer varlıklara başvurabilir; ancak bir sahnedeki nesnelere başvuramaz: proje içinde, tüm sahnelerin dışında bulunur.

Farklı silahlar elde etmenin diğer yöntemlerinde sayılar koda yazılır. if (weaponName == "Sword") damage = 4; else if ... her silahla birlikte büyür; yalnızca sayıları ayarlayan bir Weapon alt sınıfı olan Sword ise her varlık için 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 için kendi varlığı yeterlidir; kod gerekmez.

challenge icon

Görev

Orta

Atış poligonunda dört silah var: iki tabanca, bir tüfek ve yeni bir blaster. Space tuşunu basılı tutmak hepsini ateşler. Gun betiği mermisini, ateş aralığını ve hasarı gunType üzerinden if/else ile seçiyor; blaster bu seçime dahil olmadığı için ateş etmiyor (Console'a bak).

Her silahın sayılarını bir varlıktan okumasını sağla. GunData.cs hazır ve projede bu dosyadan oluşturulmuş bir Pistol, bir Rifle ve bir Blaster varlığı bulunuyor; her birinin kendine ait bir mermi prefab'ı var.

  • Gun sınıfına GunData türünde herkese açık bir data alanı ekle; Inspector her silahın varlığını bu alana koyar.
  • data.bulletPrefab ile ateş et, atışlar arasında data.fireInterval kadar bekle ve her mermiye data.damage değerini ver.
  • gunType, iki mermi alanı, özel kopyalar ve if/else'i kaldır.

Oynat'a basıp Space tuşunu basılı tut, ardından Kontrol Et'e 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;
        }
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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