Gereksinimler ve Ön Hazırlık
Bu sistemi kurmak için bilgisayarınızda .NET 8.0 veya üzeri bir SDK'nın yüklü olması yeterlidir. Oyun motoru olarak Unity 2023+ veya Godot 4.x tercih edebilirsiniz. Kodlarımız, platformdan bağımsız olarak çalışacak şekilde tasarlanmıştır.
- IDE: Visual Studio 2022 veya JetBrains Rider.
- Dil: C# 12.0 özellikleri (Primary Constructors, Collection Expressions).
- Bilgi: Temel OOP (Sınıflar, Kalıtım, Arayüzler) bilgisi gereklidir.
Adım 1: Eşya (Item) Veri Yapısının Oluşturulması
Envanter sisteminin temel taşı, eşyaların tanımlandığı sınıftır. Her eşyanın bir adı, kimliği ve türü olmalıdır. Burada ScriptableObject veya düz C# sınıfları kullanabiliriz. Veri güvenliği ve performans için readonly alanları tercih ediyoruz.
public enum ItemType { Weapon, Consumable, QuestItem }
public record ItemData(int ID, string Name, ItemType Type, int MaxStack);
Yukarıdaki record kullanımı, verinin değişmezliğini (immutability) garanti altına alır. Bu, oyun esnasında eşya verilerinin yanlışlıkla değiştirilmesini önleyen kritik bir güvenlik önlemidir.
Adım 2: Envanter Yuvası (Slot) ve Yönetim Mantığı
Envanter yuvaları, eşyaların depolandığı birimlerdir. Bir yuva, içindeki eşyayı ve miktarını tutmalıdır. Bu yapıyı kurarken Encapsulation (Kapsülleme) ilkesine dikkat etmeliyiz.
public class InventorySlot
{
public ItemData Item { get; private set; }
public int Amount { get; private set; }
public void AddItem(ItemData item, int amount)
{
Item = item;
Amount += amount;
}
public void RemoveItem(int amount)
{
Amount -= amount;
if (Amount
Adım 3: Envanter Yönetiminde Performans Optimizasyonu
Envanter sistemleri, özellikle çok sayıda eşyanın olduğu RPG veya hayatta kalma oyunlarında performans darboğazı yaratabilir. Her karede (frame) envanterin tamamını taramak yerine, olay tabanlı (event-driven) bir yaklaşım benimsemeliyiz. C# Action veya delegate yapılarını kullanarak, sadece değişiklik olduğunda UI güncellemelerini tetiklemek CPU yükünü ciddi oranda düşürür.
Aşağıdaki örnekte, envanterde bir değişiklik olduğunda UI'ı bilgilendiren bir gözlemci (observer) yapısı kurguluyoruz:
public class InventoryManager
{
public event Action OnInventoryChanged;
private List _slots = new List();
public void UpdateSlot(int index, ItemData item, int amount)
{
_slots[index].AddItem(item, amount);
// Sadece değişiklik olduğunda tetiklenir
OnInventoryChanged?.Invoke();
}
}
Bu yaklaşım, Update metodunda sürekli kontrol yapmaktan kaçınmanızı sağlar. Ayrıca, büyük envanter listelerinde arama yaparken List yerine Dictionary kullanmak, eşya ID'sine göre erişim hızını O(1) karmaşıklığına indirir.
Adım 4: Envanter Verilerini Kaydetme ve Yükleme
Oyun içi eşyaların kalıcı olması için verilerin serileştirilmesi (serialization) gerekir. C# içerisinde JsonUtility veya Newtonsoft.Json kullanarak envanter durumunu bir dosyaya yazabiliriz. Ancak, ItemData gibi karmaşık nesneleri doğrudan kaydetmek yerine, sadece ID ve miktar bilgilerini tutan bir "Data Transfer Object" (DTO) kullanmak en güvenli yöntemdir.
[System.Serializable]
public struct InventorySaveData
{
public int ItemID;
public int Amount;
public int SlotIndex;
}
public string SaveInventory(List slots)
{
var saveData = slots.Select((s, i) => new InventorySaveData {
ItemID = s.Item.ID,
Amount = s.Amount,
SlotIndex = i
}).ToList();
return JsonUtility.ToJson(saveData);
}
Bu yöntem, oyununuzun sürümü güncellense bile eşya verilerinizin bozulmadan kalmasını sağlar. Kayıt dosyasını şifrelemek isterseniz, System.Security.Cryptography kütüphanesini kullanarak JSON çıktısını AES algoritması ile kolayca maskeleyebilirsiniz.
İleri İpuçları: Envanterde Hata Ayıklama (Debugging)
Envanter sistemlerinde en sık karşılaşılan hatalar "Stack Overflow" (yığın taşması) veya "Null Reference" (boş referans) hatalarıdır. Özellikle eşya silme işlemlerinde, miktar sıfıra düştüğünde referansı temizlemeyi unutmak, oyunun çökmesine neden olabilir. Geliştirme aşamasında şu kontrolü mutlaka ekleyin:
public void ClearSlotIfEmpty()
{
if (Amount

Yorumlar (0)
Yorum Yaz