Unity Üzerinde Nesne Tabanlı Envanter Sistemi Nasıl Geliştirilir?

Unity Üzerinde Nesne Tabanlı Envanter Sistemi Nasıl Geliştirilir?
Unity Üzerinde Nesne Tabanlı Envanter Sistemi Nasıl Geliştirilir?

Unity Üzerinde Nesne Tabanlı Envanter Sistemi Nasıl Geliştirilir?

Modern oyun geliştirme süreçlerinde, özellikle RPG veya hayatta kalma türündeki projelerde, esnek ve sürdürülebilir bir envanter yapısı kurmak projenin temel taşıdır. Unity üzerinde nesne tabanlı (ScriptableObject) bir envanter sistemi geliştirmek, verilerin sahneden bağımsız yönetilmesini sağlar ve bellek yönetimini optimize eder. Bu rehberde, 2026 standartlarına uygun, ölçeklenebilir ve modüler bir mimariyi nasıl inşa edeceğinizi adım adım ele alacağız.

Nesne tabanlı envanter sistemleri, geleneksel "MonoBehaviour" tabanlı yaklaşımların aksine, veriyi kodun kendisinden ayırır. Bu ayrım, oyununuzdaki yüzlerce farklı eşyayı tek bir şablon üzerinden yönetmenize olanak tanır. Doğru kurgulanmış bir sistem, sadece eşyaları depolamakla kalmaz; aynı zamanda eşya özelliklerini, istatistiklerini ve oyun içi davranışlarını merkezi bir noktadan kontrol etmenize imkan sağlar.

ScriptableObject Kullanarak Veri Yapısını Oluşturma

Envanter sisteminin temelini oluşturan "Item" (Eşya) verilerini tanımlamak için ScriptableObject sınıfını kullanmak en verimli yöntemdir. Bu yöntem, eşya verilerini projenin varlıklar (Assets) klasöründe saklamanızı sağlar.

Temel Eşya Şablonunu Tanımlama

İlk adımda, tüm eşyaların ortak özelliklerini taşıyan bir temel sınıf oluşturmalısınız. Bu sınıf, eşyanın ID'sini, adını, simgesini ve açıklamasını içermelidir. ScriptableObject kullanımı, her eşya için ayrı bir C# dosyası oluşturma zorunluluğunu ortadan kaldırır.

  • ID: Eşyayı benzersiz şekilde tanımlayan tam sayı veya GUID değeri.
  • DisplayName: Kullanıcı arayüzünde görünen isim.
  • Icon: Eşyayı temsil eden Sprite görseli.
  • Prefab: Eşyanın dünya üzerinde düşürüldüğünde görünecek 3D modeli.

Eşya Türlerini Sınıflandırma

Tüm eşyalar aynı özelliklere sahip değildir. Örneğin, bir "İksir" tüketilebilirken, bir "Kılıç" kuşanılabilir bir eşyadır. Bu durumu yönetmek için kalıtım (inheritance) yapısını kullanmalısınız. Temel eşya sınıfından türetilen "ConsumableItem" ve "EquippableItem" sınıfları, ilgili eşya türüne özel metotları (örneğin: Use() veya Equip()) barındırmalıdır.

Envanter Veri Yönetimi ve Depolama

Eşyaların tanımlanması kadar, bu eşyaların oyuncu tarafından nasıl taşınacağı da kritiktir. Envanter verisini tutan "InventoryData" sınıfı, bir liste (List) veya sözlük (Dictionary) yapısı kullanarak eşyaları ve miktarlarını saklamalıdır.

Envanter Yuvaları (Slots) Mantığı

Envanter sistemi, sabit bir yuva kapasitesine sahip olabileceği gibi dinamik bir yapı da sunabilir. Her yuva, içerisinde bir "Item" referansı ve "Quantity" (miktar) değeri barındırmalıdır. Bu verilerin bir sınıf içerisinde tutulması, envanterin kaydedilmesi (save/load) sürecinde büyük kolaylık sağlar.

Kritik Uyarı: ScriptableObject verileri oyun çalışma süresinde (Runtime) değiştirildiğinde, bu değişiklikler kalıcı olur. Eğer oyun sırasında eşya özelliklerinin değişmesini istemiyorsanız, çalışma anında verinin bir kopyasını (instance) oluşturduğunuzdan emin olun.

Kullanıcı Arayüzü (UI) ile Entegrasyon

Veri yapısı hazır olduktan sonra, bu veriyi görselleştirmek için Unity'nin UI Toolkit veya geleneksel Canvas sistemini kullanabilirsiniz. UI, doğrudan veriye erişmek yerine, envanter yöneticisinden gelen verileri dinlemelidir.

Veri Bağlama (Data Binding) Yöntemleri

UI elemanlarınız, envanterdeki her bir yuva için bir "SlotUI" bileşenine sahip olmalıdır. Bu bileşen, ilgili yuvanın verisi değiştiğinde kendini güncelleyen bir "UpdateSlot" metoduna sahip olmalıdır. 2026 yılı itibarıyla, performans için "Object Pooling" (nesne havuzlama) yöntemini UI elemanlarında da uygulamak, envanter açılış hızını ciddi oranda artıracaktır.

Eşya Etkileşimleri ve Mantıksal Akış

Envanter sistemi sadece bir depolama alanı değildir; aynı zamanda eşyaların dünyayla etkileşime girdiği yerdir. Bir eşyayı kullanmak, envanterden silmek veya başka bir yuvaya sürükleyip bırakmak karmaşık bir mantık gerektirir.

Sürükle-Bırak (Drag and Drop) Operasyonları

Sürükle-bırak işlemleri için Unity'nin "IDragHandler", "IBeginDragHandler" ve "IEndDragHandler" arayüzlerini kullanmalısınız. Bu arayüzler, kullanıcı bir eşyayı tuttuğunda görsel bir geri bildirim sağlamanızı ve bırakıldığında hedef yuvadaki eşya ile yer değiştirmesini (swap) yönetmenizi sağlar.

Eşya Kullanımı ve Tüketim

Eşyalar kullanıldığında bir "Action" veya "Event" tetiklenmelidir. Örneğin, bir iksir kullanıldığında sağlık barını güncelleyecek bir metot çağrılmalıdır. Bu noktada, "Observer Pattern" (Gözlemci Deseni) kullanarak envanter sistemini oyunun diğer sistemlerinden (sağlık, ekipman, görevler) izole etmeniz önerilir.

Performans ve Optimizasyon Teknikleri

Büyük ölçekli bir envanter sistemi, özellikle yüzlerce eşya barındıran oyunlarda performans sorunlarına yol açabilir. Veri erişimini hızlandırmak için bazı stratejiler izlemelisiniz.

Veri Yapısı Karşılaştırması

Yöntem Avantaj Dezavantaj
List Basit ve hızlı erişim Arama yapmak yavaş olabilir (O(n))
Dictionary Çok hızlı arama (O(1)) Sıralama yönetimi daha karmaşıktır
ScriptableObject Bellek dostu, modüler Runtime değişiklikleri dikkat gerektirir

Sıralı envanterler için "List" yapısını, hızlı eşya arama ve kontrol işlemleri için ise "Dictionary" (sözlük) yapısını tercih edebilirsiniz. Büyük envanterlerde, eşyaları kategorize ederek arama sürelerini minimize etmek en sağlıklı yaklaşımdır.

Sıkça Sorulan Sorular

ScriptableObject verileri oyun kapandığında sıfırlanır mı?

Hayır, ScriptableObject dosyaları proje dosyalarınızın bir parçasıdır. Ancak, oyun çalışma süresinde (Runtime) bu dosyalardaki değişkenleri değiştirirseniz, bu değişiklikler kalıcı olur. Bu yüzden, oyuncunun envanterini kaydetmek için JSON veya Binary formatında ayrı bir veri dosyası oluşturmalısınız.

Envanter sisteminde neden arayüz (Interface) kullanmalıyım?

Arayüzler (örneğin IInteractable), farklı nesnelerin (sandık, yerdeki eşya, NPC) envanterle iletişim kurmasını sağlar. Kodunuzu daha modüler kılar ve "spagetti kod" oluşumunu engeller.

Envanter kapasitesini nasıl sınırlayabilirim?

Envanterinize bir "maxCapacity" değişkeni ekleyin. Yeni bir eşya eklemeden önce listenin uzunluğunu bu değerle karşılaştırın. Eğer liste doluysa ekleme işlemini reddeden bir uyarı mekanizması kurun.

Eşyaları nasıl kategorize edebilirim?

Eşyalarınıza bir "ItemType" enum (numaralandırma) değeri atayın. UI tarafında filtreleme butonları oluşturarak, sadece belirli türdeki eşyaların (örneğin sadece silahlar) görünmesini sağlayabilirsiniz.

Çok oyunculu (Multiplayer) oyunlarda envanter nasıl yönetilir?

Çok oyunculu sistemlerde envanter verisi sunucu (server) tarafında tutulmalıdır. İstemci (client), sadece sunucudan gelen veriyi görüntüler. Güvenlik için tüm envanter işlemleri sunucu yetkisiyle doğrulanmalıdır.

Sonuç

Unity üzerinde nesne tabanlı bir envanter sistemi geliştirmek, başlangıçta karmaşık görünse de, doğru mimariyle oyununuzun en sağlam parçalarından biri haline gelir. ScriptableObject kullanımı, veriyi modüler hale getirirken, arayüzler ve olay tabanlı programlama sistemin genişletilebilirliğini artırır. Bu rehberdeki adımları takip ederek, 2026 yılı oyun geliştirme standartlarına uygun, performanslı ve sürdürülebilir bir envanter altyapısı kurabilirsiniz. Unutmayın; en iyi envanter sistemi, oyuncunun oyun deneyimini kesintiye uğratmayan ve geliştiriciye esneklik sunan sistemdir.

Unity Üzerinde Nesne Tabanlı Envanter Sistemi Nasıl Geliştirilir?

Modern oyun geliştirmede, envanter sistemi sadece bir eşya listesi değil, oyunun ekonomi ve ilerleme döngüsünün kalbidir. Nesne tabanlı (Object-Oriented) bir yaklaşım, sistemin ölçeklenebilirliğini artırır. Bu rehberde, Unity'nin sunduğu en güçlü araçları kullanarak profesyonel bir envanter mimarisi kuracağız.

ScriptableObject Kullanarak Veri Yapısını Oluşturma

ScriptableObject, oyun dünyasında "veri kapları" olarak işlev görür. Sahne bazlı değil, proje bazlı oldukları için bellek yönetiminde büyük avantaj sağlarlar.

Temel Eşya Şablonunu Tanımlama

Temel bir ItemObject sınıfı oluşturarak tüm eşyaların ortak paydasını belirleriz. İsim, ID, ikon ve açıklama gibi veriler burada tanımlanır.

Eşya Türlerini Sınıflandırma

Polimorfizm kullanarak, WeaponObject veya ConsumableObject gibi alt sınıflar türeterek, her eşya türünün kendine has özelliklerini (hasar gücü, iyileştirme miktarı vb.) yönetebilirsiniz.

Envanter Veri Yönetimi ve Depolama

Envanter verisini bir List yapısında tutmak, hem sıralama hem de filtreleme işlemleri için en performanslı yöntemdir.

Envanter Yuvaları (Slots) Mantığı

Yuvalar, sadece veriyi tutan değil, aynı zamanda o verinin görsel temsilini yöneten birer köprüdür. Her yuva, içinde barındırdığı eşyanın referansını tutar.

Kullanıcı Arayüzü (UI) ile Entegrasyon

Unity UI (UGUI) sistemini kullanarak, envanter verisi değiştikçe arayüzü güncelleyen "Observer" (Gözlemci) tasarım desenini uygulayın.

Veri Bağlama (Data Binding) Yöntemleri

Veri ile arayüzü birbirinden ayırmak, kodun bakımını kolaylaştırır. C# Action veya UnityEvent kullanarak, eşya eklendiğinde arayüzün otomatik tetiklenmesini sağlayın.

Eşya Etkileşimleri ve Mantıksal Akış

Eşya tıklandığında gerçekleşen olaylar; "Kullan", "Bırak" ve "İncele" gibi alt mantıklarla yönetilmelidir.

Sürükle-Bırak (Drag and Drop) Operasyonları

IBeginDragHandler, IDragHandler ve IEndDragHandler arayüzlerini kullanarak, oyuncunun eşyaları bir yuvadan diğerine taşımasını sağlayın.

Eşya Kullanımı ve Tüketim

Tüketilebilir eşyalar için Use() metodunu bir soyut sınıf (abstract) olarak tanımlayın. Böylece her eşya kendi tüketim mantığını (örneğin can artırma veya mana yenileme) kendisi çalıştırır.

Performans ve Optimizasyon Teknikleri

Envanter sistemlerinde en sık yapılan hata, her karede (frame) tüm envanteri güncellemektir. Bunun yerine, sadece veri değişikliği olduğunda güncellenen "Event-Driven" (Olay Tabanlı) bir mimari kullanın.

Sık Yapılan Hatalar ve Çözümleri

  • Referans Kaybı: ScriptableObject nesnelerini çalışma zamanında değiştirmek, projedeki orijinal veriyi bozar. Her zaman verinin bir kopyasını (instance) oluşturun.
  • UI Kirliliği: Her eşya için ayrı bir GameObject oluşturmak yerine, "Object Pooling" (Nesne Havuzlama) yöntemini arayüz öğeleri için de kullanın.
  • Gereksiz Arama: Envanterde eşya ararken foreach döngüleri yerine, eşya ID'lerini anahtar (key) olarak tutan Dictionary yapılarını tercih edin.

Veri Yapısı Karşılaştırması

Yöntem Avantajı Dezavantajı
ScriptableObject Hafif, modüler, yönetimi kolay. Çalışma zamanı kalıcı değişiklikler için ek kayıt sistemi gerektirir.
JSON/XML Dosyaları Kolay kaydedilebilir, dışarıdan düzenlenebilir. Dosya okuma/yazma işlemleri performans kaybı yaratabilir.
Veritabanı (SQLite) Büyük veriler için mükemmel. Kurulumu ve entegrasyonu karmaşıktır.

Güvenlik ve Veri Bütünlüğü

Envanter verisini istemci tarafında korumak zordur. Özellikle tek oyunculu oyunlarda, oyuncuların "Save" dosyalarını değiştirmesini engellemek için veriyi basit bir şifreleme (Base64 veya AES) yöntemiyle saklamanız önerilir. Ancak unutmayın; profesyonel bir güvenlik için her zaman sunucu taraflı doğrulama şarttır.

Örnek Senaryo: Eşya Birleştirme (Crafting)

Eşya birleştirme mantığında, envanterinizdeki iki farklı eşyanın ID'sini kontrol eden bir Recipe (Tarif) sınıfı oluşturun. Eğer ItemA ve ItemB oyuncunun envanterinde mevcutsa, bunları silip yerine ResultItem nesnesini ekleyin.

Geliştirme Araçları ve İpuçları

  • Odin Inspector: ScriptableObject verilerini düzenlemek için görselleştirme sürecini hızlandırır.
  • Unity Addressables: Çok sayıda eşya görseli ve prefabı kullanıyorsanız, bellek yönetimi için mutlaka kullanın.
  • Debug Logger: Envanter işlemlerini takip etmek için özelleştirilmiş bir log sistemi kurun.
Uzman Notu: Envanter sisteminiz ne kadar karmaşık olursa olsun, kodunuzu "Single Responsibility Principle" (Tek Sorumluluk Prensibi) çerçevesinde tutun. Veriyi tutan sınıf ile veriyi gösteren sınıfın birbirinden bağımsız olması, ileride sisteminize "depo" veya "ticaret" gibi özellikler eklemenizi kolaylaştıracaktır.

Sisteminizi test ederken, envanterin dolu olduğu durumları simüle etmek için rastgele eşya ekleme butonları oluşturun. Eğer liste doluysa ekleme işlemini reddeden bir uyarı mekanizması kurun.

Eşyaları nasıl kategorize edebilirim?

Eşyalarınıza bir "ItemType" enum (numaralandırma) değeri atayın. UI tarafında filtreleme butonları oluşturarak, sadece belirli türdeki eşyaların (örneğin sadece silahlar) görünmesini sağlayabilirsiniz.

Çok oyunculu (Multiplayer) oyunlarda envanter nasıl yönetilir?

Çok oyunculu sistemlerde envanter verisi sunucu (server) tarafında tutulmalıdır. İstemci (client), sadece sunucudan gelen veriyi görüntüler. Güvenlik için tüm envanter işlemleri sunucu yetkisiyle doğrulanmalıdır.

Sonuç

Unity üzerinde nesne tabanlı bir envanter sistemi geliştirmek, başlangıçta karmaşık görünse de, doğru mimariyle oyununuzun en sağlam parçalarından biri haline gelir. ScriptableObject kullanımı, veriyi modüler hale getirirken, arayüzler ve olay tabanlı programlama sistemin genişletilebilirliğini artırır. Bu rehberdeki adımları takip ederek, 2026 yılı oyun geliştirme standartlarına uygun, performanslı ve sürdürülebilir bir envanter altyapısı kurabilirsiniz. Unutmayın; en iyi envanter sistemi, oyuncunun oyun deneyimini kesintiye uğratmayan ve geliştiriciye esneklik sunan sistemdir.

Sık Yapılan Hatalar ve Çözümleri

Envanter sistemleri geliştirilirken karşılaşılan hatalar genellikle ölçeklenebilirlik ve bellek yönetimi kaynaklıdır. İşte en sık rastlanan hatalar ve profesyonel çözüm önerileri:

  • Referans Kaybı: ScriptableObject nesnelerinin çalışma zamanında (Runtime) değiştirilmesi, projenin orijinal veri dosyasını kalıcı olarak bozabilir. Çözüm: Çalışma zamanında yapılan değişiklikler için her zaman verinin bir kopyasını (Instance) oluşturun.
  • UI Güncelleme Yükü: Envanterdeki her değişiklikte tüm arayüzü yeniden oluşturmak (rebuild) performansı düşürür. Çözüm: "Observer Pattern" (Gözlemci Deseni) kullanarak sadece değişen yuvanın (Slot) güncellenmesini sağlayın.
  • Sıkı Bağlılık (Tight Coupling): Envanter mantığının doğrudan UI sınıfına yazılması, kodun bakımını imkansız hale getirir. Çözüm: Veri (Model), Görünüm (View) ve Kontrolcü (Controller) yapılarını birbirinden tamamen ayırın.

Veri Yapısı Karşılaştırması

Envanter sisteminizi tasarlarken hangi veri yapısını kullanacağınız, projenizin karmaşıklığına göre değişiklik gösterir. Aşağıdaki tablo, farklı yaklaşımların avantaj ve dezavantajlarını özetler:

Yöntem Avantajları Dezavantajları
ScriptableObject Bellek dostu, editörde kolay düzenleme, modüler. Çalışma zamanında kalıcı değişiklik yapmak zordur.
JSON/XML Dosyaları Kaydetme/Yükleme (Save/Load) için idealdir. Okuma/Yazma işlemleri CPU maliyetlidir.
Veritabanı (SQLite) Büyük veriler için çok hızlı ve güvenli. Kurulumu ve yönetimi teknik uzmanlık gerektirir.

Güvenlik ve Veri Bütünlüğü

Envanter verisi, özellikle tek oyunculu oyunlarda hile yapılmaya en müsait kısımdır. Veri bütünlüğünü sağlamak için şu stratejileri uygulayın:

  1. Veri Şifreleme: Kayıt dosyalarınızı (Save files) basit bir AES şifreleme algoritması ile koruyun.
  2. Doğrulama (Validation): Oyuncunun envanterine eklenen her eşya için "Eşya ID" ve "Miktar" kontrolü yapın. Negatif miktar veya mevcut olmayan eşya ID'lerini engelleyin.
  3. Sunucu Tarafı Kontrolü: Eğer oyununuzda bir market veya takas sistemi varsa, envanter değişikliklerini asla istemci tarafına bırakmayın; işlemleri sunucuda doğrulayın.

Örnek Senaryo: Eşya Birleştirme (Crafting)

Nesne tabanlı envanter yapısında eşya birleştirme (crafting) mantığını kurmak oldukça basittir. İşte adım adım işleyiş:

1. Tarif (Recipe) ScriptableObject Oluşturma

Bir Recipe sınıfı oluşturun. Bu sınıf, gerekli eşya listesini (Input) ve sonuç eşyasını (Output) tutmalıdır.

2. Kontrol Mekanizması

Oyuncu "Birleştir" butonuna bastığında, envanterdeki mevcut eşyalar ile Recipe listesindeki eşyaları karşılaştıran bir fonksiyon çalıştırın:

public bool CanCraft(Recipe recipe) {
    foreach (var requirement in recipe.ingredients) {
        if (!inventory.Contains(requirement.item, requirement.amount)) return false;
    }
    return true;
}

3. Envanter Güncelleme

Eğer kontrol başarılıysa, envanterden gerekli miktarları çıkarın ve sonuç eşyasını ekleyin. Bu işlem sırasında envanterin "Dirty" (Kirli) bayrağını aktif ederek UI'nın güncellenmesini tetikleyin.

Geliştirme Araçları ve İpuçları

Envanter sisteminizi daha profesyonel hale getirmek için şu araçları ve yöntemleri kullanabilirsiniz:

  • Odin Inspector: ScriptableObject verilerini Unity editöründe çok daha görsel ve düzenli yönetmenizi sağlar.
  • Unity Event System: Eşya tıklandığında veya sürüklendiğinde tetiklenecek olaylar için UnityEvent yapısını kullanın.
  • Addressables: Çok sayıda eşya görseli ve prefabı kullanıyorsanız, bellek yönetimi için Addressables sistemine geçiş yaparak eşyaları ihtiyaç duyulduğunda yükleyin.

Eşyaları nasıl kategorize edebilirim?

Eşyalarınıza bir "ItemType" enum değeri atayın. UI tarafında filtreleme butonları oluşturarak, sadece belirli türdeki eşyaların (örneğin sadece silahlar) görünmesini sağlayabilirsiniz. Bu işlem için LINQ kullanarak inventory.Where(i => i.type == ItemType.Weapon) sorgusunu kullanmak, kodunuzu oldukça sadeleştirecektir.

Çok oyunculu (Multiplayer) oyunlarda envanter nasıl yönetilir?

Çok oyunculu sistemlerde envanter verisi sunucu tarafında tutulmalıdır. İstemci, sadece sunucudan gelen veriyi görüntüler. Güvenlik için tüm envanter işlemleri sunucu yetkisiyle doğrulanmalıdır. Mirror veya NGO (Netcode for GameObjects) gibi kütüphaneler kullanıyorsanız, NetworkVariable veya Rpc yapılarını kullanarak envanterin senkronize kalmasını sağlayabilirsiniz.

Envanter Sistemi Geliştirirken Sık Yapılan Hatalar ve Çözümleri

Envanter sistemi, oyun geliştirme sürecinde en çok mantıksal hata barındıran modüllerden biridir. Yeni başlayan geliştiricilerin sıklıkla düştüğü hatalar, projenin ilerleyen aşamalarında ölçeklenebilirlik sorunlarına yol açar.

  • Hardcoded Veri Kullanımı: Eşya özelliklerini doğrudan kod içerisine yazmak, ileride yapılacak bir değişiklikte tüm sistemi bozabilir. Çözüm: Her zaman ScriptableObject veya JSON/XML gibi harici veri kaynaklarını kullanın.
  • UI ve Mantık Ayrımının Yapılmaması: Envanter verisini tutan sınıf ile UI'ı yöneten sınıfın iç içe geçmesi, kodun okunabilirliğini düşürür. Çözüm: MVC (Model-View-Controller) prensiplerine sadık kalarak, veriyi (Model) ve arayüzü (View) birbirinden tamamen ayırın.
  • Bellek Yönetimi İhmali: Her eşya için ayrı bir GameObject oluşturmak, özellikle mobil platformlarda ciddi performans kayıplarına neden olur. Çözüm: Nesne havuzlama (Object Pooling) yöntemini veya sadece veri odaklı (Data-driven) mimariyi tercih edin.

Veri Yapısı Karşılaştırması: ScriptableObject vs. JSON

Envanter verilerini saklamak için en popüler iki yöntem olan ScriptableObject ve JSON (veya benzeri metin tabanlı formatlar) arasındaki farkları anlamak, projenizin mimarisini belirlemenize yardımcı olacaktır.

Özellik ScriptableObject JSON / Harici Dosya
Kullanım Kolaylığı Unity Editör entegrasyonu ile çok kolay. Kod yazımı ve ayrıştırma (parsing) gerektirir.
Performans Bellekte doğrudan referans olarak tutulur. Okuma/Yazma sırasında işlemci gücü gerektirir.
Düzenlenebilirlik Inspector üzerinden görsel düzenleme imkanı. Metin editörü veya özel bir araç gerektirir.
Kalıcılık Oyun çalışma zamanında yapılan değişiklikler kalıcı olabilir (ayarlar gerektirir). Dosya sistemine yazıldığı için daha güvenli ve kalıcıdır.

Güvenlik ve Veri Bütünlüğü

Tek oyunculu oyunlarda bile hileleri engellemek için veri bütünlüğünü korumak kritiktir. Özellikle "Save/Load" sistemlerinde verilerin dışarıdan değiştirilmesini zorlaştırmak için şu yöntemleri izleyebilirsiniz:

  1. Veri Şifreleme (Encryption): Kayıt dosyalarınızı basit bir Base64 veya AES şifreleme ile paketleyerek, oyuncuların metin editörüyle eşya miktarlarını değiştirmesini engelleyebilirsiniz.
  2. Doğrulama (Validation): Envantere eşya eklenirken, eşyanın geçerli olup olmadığını ve kapasitenin aşılıp aşılmadığını kontrol eden merkezi bir "InventoryManager" sınıfı kullanın.
  3. Checksum Kullanımı: Kayıt dosyasının sonuna bir hash değeri ekleyerek, dosya üzerinde oynama yapılıp yapılmadığını oyun açılışında kontrol edin.

Örnek Senaryo: Eşya Birleştirme (Crafting)

Eşya birleştirme sistemi, nesne tabanlı envanterin gücünü gösteren en iyi örnektir. Bir "CraftingManager" oluşturarak, oyuncunun envanterindeki eşyaları belirli bir formüle göre kontrol edebilirsiniz.

İpucu: Crafting formüllerini de ScriptableObject olarak tanımlayın. Her formül nesnesi, "Gerekli Malzemeler" (List) ve "Sonuç Eşyası" (Item) alanlarını içermelidir.

Süreç şu şekilde işler:

  • Oyuncu "Birleştir" butonuna basar.
  • Sistem, mevcut formül listesini döner ve oyuncunun envanterindeki eşyalarla eşleşme arar.
  • Eşleşme bulunursa, envanterden gerekli malzemeler silinir ve yeni eşya envantere eklenir.
  • UI güncellenir ve oyuncuya görsel geri bildirim verilir.

Geliştirme Araçları ve İpuçları

Geliştirme sürecinizi hızlandırmak ve kod kalitenizi artırmak için şu profesyonel araçları kullanmayı değerlendirin:

  • Odin Inspector: ScriptableObject verilerini Unity editöründe çok daha görsel ve düzenli yönetmenizi sağlar. Karmaşık envanter listelerini sürükle-bırak ile düzenlemenize olanak tanır.
  • Unity Event System: Eşya tıklandığında veya sürüklendiğinde tetiklenecek olaylar için UnityEvent yapısını kullanın. Bu, kodunuzdaki bağımlılıkları (decoupling) azaltır.
  • Addressables: Çok sayıda eşya görseli ve prefabı kullanıyorsanız, bellek yönetimi için Addressables sistemine geçiş yaparak eşyaları ihtiyaç duyulduğunda yükleyin. Bu, özellikle büyük envanter sistemlerinde başlangıç yükleme süresini ciddi oranda düşürür.

Eşyaları Nasıl Kategorize Edebilirim?

Eşyalarınızı yönetirken karmaşayı önlemek için bir "ItemType" enum yapısı kullanmak en temiz yoldur. Envanter sınıfınızda eşyaları liste olarak tutarken, UI tarafında filtreleme butonları oluşturarak, sadece belirli türdeki eşyaların (örneğin sadece silahlar veya sadece iksirler) görünmesini sağlayabilirsiniz. Bu işlem için LINQ kullanarak inventory.Where(i => i.type == ItemType.Weapon) sorgusunu kullanmak, kodunuzu oldukça sadeleştirecektir.

Çok Oyunculu (Multiplayer) Oyunlarda Envanter Nasıl Yönetilir?

Çok oyunculu sistemlerde envanter verisi asla istemci (client) tarafında tek başına yönetilmemelidir. Güvenlik için tüm envanter işlemleri sunucu yetkisiyle doğrulanmalıdır. İstemci, sadece sunucudan gelen veriyi görüntüler ve bir işlem yapmak istediğinde sunucuya "Request" gönderir. Mirror veya NGO (Netcode for GameObjects) gibi kütüphaneler kullanıyorsanız, NetworkVariable veya Rpc yapılarını kullanarak envanterin senkronize kalmasını sağlayabilirsiniz. Sunucu, eşya ekleme veya silme işlemlerini yetkilendiren tek otorite olmalıdır.

Bu yazıya tepkinizi paylaşın:
Deniz Aydın

On yıldır pratik yaşam çözümleri üzerine içerik üretiyorum. Okuyucuların karmaşık sorunlarını en basit yöntemlerle çözmelerine yardımcı olmayı hedefliyorum.

Yorumlar (0)

Yorum Yaz