Unity'nin müfettişinde anahtar / değer çiftlerini (Sözlük gibi) nasıl düzenleyebilirim?


18

Oluşturduğum bir büyü sistemim var, ilke aşağıdaki gibidir:

  • Her büyü özerk bir prefabriktir. Müfettişte değiştirilebilen bazı özelliklere (temel hasar, süre ...) sahip bir komut dosyası içerir.
  • Oyun mantığında kullanılan koddaki tüm olası büyüleri listeleyen bir Büyü numaralandırma var
  • Bir büyü yapmak istediğimde, onu büyülemek ve bilgilerini okumak için bu büyünün prefabrikini elde edebilmeliyim
  • Her aktörün (oyuncular veya düşmanlar olsun) büyüler için olası animasyonların bir listesine sahip olması gerekir

Nasıl uygulamaya çalışıyorum ile ilgili sorunlar şunlardır:

  • Her aktörün animasyonlarını listelemek için bir kullanabilirsiniz Dictionary<Spell, Animation>, ancak sözlükler müfettiş tarafından desteklenmez, bu da birden fazla aktör türünü kolayca düzenlemeyi zorlaştırır.
  • Ben karşılık gelen numaralandırma büyü prefabrik kolayca erişmek için bir yol gerekir. Burada ben de bir sözlük kullanabilirsiniz ama ben sadece müfettiş prefabs referans, kod değil, yani ben bu sözlük dolduramazsınız anlamına

Büyü sayımlarımı ilgili prefabrik ve animasyonlarla kolayca ilişkilendirmenin bir yolunu arıyorum


1
Unity'nin müfettişinde sözlük benzeri davranış (anahtar / değer çiftlerini eşleme) elde etmek için bu sorunun başlığını değiştirmeyi önerebilir miyim? Bu, bu tür bir sorunu çözmek için fikir sahibi olan veya arayan diğer kullanıcılar için sorunun bulunmasını kolaylaştıracaktır. Bu özel durum büyülerle ilgili olsa da, aynı teknikler daha geniş çapta uygulanabilir.
DMGregory

@DM Unity'yi bilmiyorum, ama genel akıl yürütmeniz mantıklı geliyor. Cesur olun ve düzenleyin; geri dönüşler ucuz.
Anko

Yanıtlar:


24

Unity'nin denetçisinde anahtar / değer çiftlerini almanın hızlı bir yolu, serileştirilebilir bir giriş sınıfı tanımlamak ve ardından bunların bir dizisini veya List <> öğesini kullanmaktır. Örneğin...

public class SpellAnimationMap : ScriptableObject
{
   [System.Serializable]
   public class SpellAnimationEntry
   {
       public Spell spell;
       public AnimationClip animation;
   }

   public SpellAnimationEntry[] spellAnimations;    
}

Otomatik olarak, bu, denetçide, özel bir denetçi yazmanıza gerek kalmadan anahtarı ve değeri girebileceğiniz yeniden boyutlandırılabilir bir liste verecektir.

Sonuç şuna benzer:

otomatik oluşturulan denetçi

(Bir numara: Serileştirilmiş giriş sınıfı bir "Ad" alanı içeriyorsa, "Öğe 0" başlıkları yerine o dize görüntülenir. Verimli bir şekilde gezinmek istediğiniz daha karmaşık verileriniz varsa kullanışlıdır.)

Bunu bir ScriptableObject yapmak, aynı animasyon setine ihtiyaç duyan varlık türleri / örnekler arasında paylaşılan bir Varlık olarak ele almanızı ve her biri için listeyi çoğaltmanın yükünü ortadan kaldırmanızı sağlar. (Diğer sınıflar, Unity'de örnek başına serileştirilme eğilimindedir). Bu rotaya gitmek için, Varlıklar klasörünüzde bunların örneklerini oluşturmanıza olanak tanıyan küçük bir düzenleyici komut dosyası eklemeniz gerekir .


Düzenleme: şimdi daha da kolay - bu özelliği ScriptableObject öğenizin üzerine ekleyebilirsiniz :

[CreateAssetMenu(fileName = "fileName.asset", menuName = "Some Folder/Menu Label")]

Bu ScriptableObject öğesini Oluştur menünüze koyar, şöyle: Unity'de özelleştirilmiş bir Oluştur menüsünü gösteren ekran görüntüsü


İsteğe bağlı olarak diziyi denetçide görünecek şekilde özel ve seri hale getirebilirsiniz, ancak istemcilerin daha verimli aramalar için tüketmesi için herkese açık bir Sözlük (veya genel GetAnimation (Yazım büyüsü) yöntemiyle özel sözlük) ekleyebilirsiniz. OnEnable () yönteminde, SpellAnimationMap, bir kez daha tüm istemci örnekleri arasında avantajı paylaşarak bu sözlüğü bir kez oluşturmak için denetçisinin doldurduğu dizisini yineleyebilir. (Öğe ilk oluşturulduğunda OnEnable () öğesinin de düzenleyicide çağrıldığını unutmayın; bu nedenle, okumaya çalışmadan önce dizinizin boş olmadığını kontrol ettiğinizden emin olun)

Son olarak, bu giriş veri tipine ihtiyacınız olduğu kadar ekleyebilirsiniz. Örneğin, prefabrik veya büyü anahtarına bağlamak istediğiniz herhangi bir sayıda başka veri parçasını da içerebilir.

Sözlük <,> alanlarını doğrudan doldurmak için özel müfettişler yazmak da mümkündür, ancak elde ettiğim izlenim, sorunsuz çalışmanın telaşlı olmasıdır.


Tam olarak bir cevap beklerken ne yaptım, bu yüzden bunu kabul edeceğim
Malharhak

0

@DMGregory tarafından sağlanan açıklamayı okuyun

Örnekleri sevenler için:

public class SpellHandler : ScriptableObject
{
    public Spell[] keys;
    public Animation[] values;

    private Dictionary<Spell, Animation> dic;

    void Awake()
    {
        int length = keys.Length;
        this.dic= new Dictionary<Spell, Animation>(length);
        for (int i = 0; i < length; i++)
        {
            this.dic.Add(keys[i], values[i]);
        } 
    }    
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.