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.
Görev
OrtaHer silahın değerlerini kendi GunData varlığından okumasını sağla.
Guniçindepublic GunData data;ekle.data.bulletPrefabile ateş et, atışlar arasındadata.fireIntervalkadar bekle ve her mermiyidata.damageile donat.gunTypeöğesini, iki mermi alanını, üç özel kopyayı veStart()öğ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
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground