OOP'de devam eden ve bölücü bir tartışma, bir program aracılığıyla veri akışının nasıl yönetileceğidir. Oyununuz veya programınızdaki veri akışını nasıl yapılandırdığınız, düzgün yönetilmezse, hangi nesnelerin hangi yollarla konuştuğuna dair diyagramın yönetilemez hale geleceği kadar önemlidir (IE, popüler bir makarna yemeği gibi.) Bu küçük referans. veri trafiğini kontrol etmenize yardımcı olabilecek üç modele ayrılacaktır: singletons, PubSub ve olaylar/geri aramalar.
Birlik günlerinizde şuna benzer bir kod görmüş veya yazmış olabilirsiniz:
GameObject.Find("GameManager").GetComponent<GameManager>().StartGame(); var score = GameObject.Find("GameManager").GetComponent<GameManager>().Score
Ayrıca bu kişisel bir görüş olabilir, kodunuzda editörde değiştirebileceğiniz isimleri kullanmaktan kaçınmalısınız. Ad, düzenleyicide değişebilir ve bu, kodunuzu bozar. Ayrıca GameObject için seçtiğiniz ismi unutabilir ve onu bulmak için editöre geri dönmeniz gerekebilir (ki bu can sıkıcıdır).
Bununla mücadele etmek için, bir sahnede yalnızca bir kez olacak olan MonoBehaviours için singleton modelini kullanabiliriz.
Singleton, yalnızca bir kez örneklenebilen bir sınıftır. MonoBehaviour bağlamında, bir sahnede yalnızca bir kez örneklenecek bir bileşendir. Bir MonoBehaviour singletonu yaratma planı aşağıda gösterilmiştir;
public static GameManager Instance { private set; get; } = null; ... private void Awake() { if(Instance != null) throw new System.Exception("More than one instance"); Instance = this; } private void OnDestroy() { Instance = null; }
Singleton'a erişmek için bunu herhangi bir yerde çalıştırabilirsiniz.
GameManager.Instance.StartGame(); var score = GameManager.Instance.Score;
OnDestroy()bunun için uygundur.
OnEnable()ve
OnDisable()bunu yapabilseniz de, devre dışı bırakılmış bir bileşene erişmek isteyebileceğiniz durumlar olduğu için buna karşı çıkmanızı öneririm.
Instanceolduğu gibi, başka bir diziden erişmek çarpışmalara neden olabileceğinden, yalnızca ana dizinden erişmelisiniz. Örneğin,
GameObject.Instancebir
Timergeri aramadan erişmeyin. Bunu kontrol edebilirsiniz, ancak gerekli olmadığını gördüm.
PubSub, veri akışı için merkezi bir merkez görevi görür. Nesneler belirli bir anahtara mesaj yayınlayabilir ve mesajı o belirli anahtara abone olan herkese gönderir. Bunu özellikle kapsamı geniş olan mesajlar için ve bir oyuncunun ölümü gibi onu alması gereken çok sayıda nesne olduğunda faydalı buluyorum.
PubSub sınıfı, kolayca erişilebilmesi için statik olarak yazılabilir veya tek bir MonoBehaviour olarak yazılabilir. Statik sınıf yaklaşımını tercih ederim çünkü sahnenizi karıştırmaz ve editör kurulumu gerektirmez.
PubSub için gereken üç davranış.
Unity'ye yönelik bir uygulama burada bulunabilir. Bunu kodunuzda kullanmaktan çekinmeyin.
https://gist.github.com/ZacharyBuffone/df9d2fb0ab1a2032c9b205aa31eda10c
PubSubID sınıfının gereğinden fazla kullanılabileceğini unutmayın, ancak abone olan nesnelerin kimliğin değerini (uint'in aksine) değiştirmesine izin vermemesini seviyorum.
Geri aramalar, web geliştirmede popüler bir mesajlaşma yöntemidir. Geri arama, başka bir nesneye verilen ve daha sonra bir olay meydana geldiğinde o nesne tarafından çağrılabilen bir yöntemdir. Bu, özellikle bir düğmeye basıldığında kodun yürütülmesini istediğiniz UI geliştirmede yararlı olabilir. C#'ta bunu başarmanın popüler bir yolu delegeler ve olaylar kullanmaktır.
A
delegate, bir yöntem imzasını tanımlayan özel bir veri türüdür (yöntemin argüman olarak kabul ettiği ve döndürdüğü şeydir, yani
void SomeMethod(int i)).
eventBir temsilci kullanarak , daha sonra çağrılacak yöntemleri saklayan bir bildirebilirsiniz . Aşağıda basit bir temsilci/olay örneği gösterilmektedir:
public class ClassA { public delegate OnEventHandler(int amount); public event OnEventHandler OnEvent; public void Update() { OnEvent?.Invoke(1); } }
objectA.OnEvent += (amount) => { //handle event } OR objectA.OnEvent += MethodWithSameSignatureAsDelegate;
object.OnEvent -= MethodWithSameSignatureAsDelegate;
Geri aramalar için başka bir seçenek de
System.Action<>sınıfı kullanmaktır.
System.Action<T>type parametresine sahip bir yöntemi saklayacaktır
T. Geri aramak için yalnızca bir yönteme ihtiyacınız varsa bu kullanışlıdır. Ancak, yalnızca bir yöntemi kaydedebilirsiniz.
public class ClassA { private System.Action<int> callback = default; public void Update() { callback?.Invoke(1); } public void SetCallback(System.Action<int> cb) { callback = cb; } }
Diyelim ki iki sınıfınız var, House ve Road. House nesnelerinin üzerinde bulundukları Road nesnesine başvurmak istemesi makul görünebilir ve road Object, üzerinde bulunan House nesnelerine başvurmak isteyebilir. Yani böyle bir şeye sahip olabilirsiniz…
public class House { private Road road; ... } public class Road { private House[] houses; ... }
Ev -> Yol
Yolu <- Ev
Bu, dairesel veya çift yönlü referanslama olarak adlandırılan şeydir. Bununla ilgili sorun, herhangi bir nesnenin silinmesinin diğerindeki referansta bir güncelleme gerektirmesidir.
MissingReferenceExceptionSilme için güncelleme yapmadan, ve büyük olasılıkla tanımsız bir davranış elde edersiniz . Silme ve güncellemeyi hatasız yapmak mümkün olsa da, bunu yapmak kodunuz için gereksiz karmaşıklık yaratacaktır.
Çift yönlü referanslamayı çözmek için, diğerine referans taşımak için her iki nesneye de gerçekten ihtiyacınız olup olmadığına bakın. Referans vermeyi düşünmenin iyi bir yolu, referansları en geniş kapsamdan en küçük kapsamda taşımaktır. Bir şehir kurma oyunu için bağımlılık çizelgeniz şöyle görünebilir…
Şehir -> Mahalle -> Yol -> Ev -> Yerleşik
…tek yönlüdür ve doğrusal olarak güncellenebilir.
FindRoadForHouse(House h)Ayrıca , geriye doğru gitmeniz gerekiyorsa (bunlar tekil olabilir 👍) gibi işlemleri yönetebilen Road ve House gibi popüler nesneler için de yöneticiler ekleyebilirsiniz .
OOP'de veri akışını yönetmek çok zordur. Doğru şekilde yapılmazsa, kod tabanınız yönetilemez bir çok yönlü bağımlılık karmaşasına dönüşebilir, bu da hataların oluşmasına ve yeni özelliklerin uygulanmasının olanaksız olmasına neden olur. Bu modellerden bazılarını kullanarak, bundan kaçınmayı umabilirsiniz.
2021'de hizmet verdiğiniz müşteriler ve onlara anlattığınız hikayeler hakkında bildiğiniz her şeyi yeniden düşünmenizi tavsiye ediyorum. Geri adım atmak.
Yaz sonu ve sonbahar nostaljik mevsimlerdir. Sokak lambaları ışıklarını yağmurlu sokaklara saçıyor ve ayakların altındaki yapraklar - alacakaranlığın gölgelerinde soluk kırmızı-turuncu - geçmiş günlerin bir hatırlatıcısı.
Mars, Uranüs ve Kuzey Düğümü, 1 Ağustos 2022'de 18 derecede Boğa burcunda kavuşuyor. Yataklarımız yanarken nasıl uyuruz?-Gece yarısı yağı Yılın en önemli astrolojik yönlerinden biri olan Mars ve Uranüs'ün kaderin Kuzey Düğümü ile kavuşumu, gerçek bir aciliyet hissinin eşlik ettiği büyük bir uyandırma çağrısıdır.
"Bozulma" terimi, nedensel mekanizma bilinmediğinde kullanılır ve bireyin altta yatan bilişinde ve nörobiyolojisinde bir işlev bozukluğunu ima eder. 1952'de, DSM 1, klinik kullanım için zihinsel bozuklukları kategorize eden APA Adlandırma ve İstatistik Komitesi tarafından yayınlandı.
Bu ay tüm yeni abonelerimize ve yazarlarımıza sıcak bir karşılama; sürülerinizde ortaya çıkıyorsunuz ve bunun için size teşekkür ediyoruz. Burada harika bir topluluk oluşturuyoruz ve yorumlarınızı ve makalelerinizi okumak harika.
İnsanlar sanata çekilir. On yıldan fazla bir süredir araştırmacılar, izleme sanatının sağlığımız ve esenliğimiz üzerindeki olumlu etkisini araştırıyorlar.