Şu anda bir varlık temelde sadece bir kimlik ve bir oyun nesnesi oluşturmak için bileşenleri bir demet bağlayan bazı yardımcı yöntemler olduğu bir bileşen tabanlı varlık sistemi uygulamaya çalışıyorum. Bunun bazı hedefleri:
- Bileşenler yalnızca durum içerir (örn. Konum, sağlık, cephane sayısı) => mantık, bu bileşenleri ve durumlarını (ör. PhysicsSystem, RenderSystem, vb.) İşleyen "sistemlere" gider.
- Bileşenleri ve sistemleri hem saf C # 'da hem de komut dosyası (Lua) aracılığıyla uygulamak istiyorum. Temelde C # kaynağımı yeniden derlemek zorunda kalmadan doğrudan Lua içinde tamamen yeni bileşenler ve sistemler tanımlamak istiyorum.
Şimdi, bu verimli ve tutarlı bir şekilde nasıl ele alınacağına dair fikirler arıyorum, bu yüzden örneğin C # bileşenlerine veya Lua bileşenlerine erişmek için farklı sözdizimi kullanmama gerek yok.
Şu anki yaklaşımım, muhtemelen editöre varsayılan değerler ve şeyler hakkında bilgi veren bazı özniteliklerle süslenmiş düzenli, genel özellikleri kullanarak C # bileşenlerini uygulamak olacaktır. Sonra ben sadece bir Lua tablo dahili olarak bu tablo bir komut dosyası tarafından oluşturulan ve söz konusu bileşen türünün tüm durumunu tutan bir C # sınıfı "ScriptComponent" olurdu. Derleme zamanında, hangi ScriptComponents benim için hangi özellikleri ile kullanılabilir olacağını bilmiyordum gibi ben gerçekten C # tarafında bu duruma erişmek istemiyorum. Yine de, editörün buna erişmesi gerekecek, ancak aşağıdaki gibi basit bir arayüz yeterli olmalıdır:
public ScriptComponent : IComponent
{
public T GetProperty<T>(string propertyName) {..}
public void SetProperty<T>(string propertyName, T value) {..}
}
Bu, Lua tablosuna erişir ve Lua'dan bu özellikleri ayarlar ve alır ve saf C # bileşenlerine de kolayca dahil edilebilir (ancak daha sonra yansıma veya bir şey aracılığıyla normal C # özelliklerini kullanın). Bu, yalnızca oyun düzenleyicide kullanılır, normal oyun kodu tarafından kullanılmaz, bu nedenle performans burada o kadar önemli değildir. Belirli bir bileşen türünün gerçekte hangi özellikleri sunduğunu belgeleyen bazı bileşen açıklamaları oluşturmayı veya el yazmayı gerekli kılacaktır, ancak bu çok büyük bir sorun olmaz ve yeterince otomatik olabilir.
Ancak, bileşenlere Lua tarafından nasıl erişilir? Böyle bir şeye çağrı getComponentsFromEntity(ENTITY_ID)
yaparsam, muhtemelen kullanıcı verileri olarak "ScriptComponent" de dahil olmak üzere bir grup yerli C # bileşeni alırım. Sarılmış Lua tablosundan değerlere erişmek,GetProperty<T>(..)
erişmek, diğer C # bileşenlerinde olduğu gibi özelliklere doğrudan erişmek yerine yöntemi .
Belki özel bir yazı yaz getComponentsFromEntity()
sadece yerel C # bileşenlerini kullanıcı verileri olarak döndüren Lua'dan çağrılacak yöntem yazın, bunun yerine "ScriptComponent" hariç, bunun yerine kaydırılan tabloyu döndürür. Ancak diğer bileşenlerle ilgili yöntemler olacak ve gerçekten tüm bu yöntemleri hem C # kodundan veya Lua komut dosyasından çağrılmak için çoğaltmak istemiyorum.
Nihai amaç, yerel bileşenler ve Lua bileşenleri arasında, özellikle Lua tarafından farklı bir özel durum sözdizimi olmaksızın, tüm bileşen türlerini aynı şekilde ele almak olacaktır. Örneğin, böyle bir Lua betiği yazmak istiyorum:
entity = getEntity(1);
nativeComponent = getComponent(entity, "SomeNativeComponent")
scriptComponent = getComponent(entity, "SomeScriptComponent")
nativeComponent.NativeProperty = 5
scriptComponent.ScriptedProperty = 3
Komut dosyası aslında ne tür bir bileşen aldığını umursamamalı ve bileşenleri almak, eklemek veya kaldırmak için C # tarafından kullanacağım yöntemleri kullanmak istiyorum.
Belki de senaryoyu böyle varlık sistemlerine entegre etmenin bazı örnek uygulamaları vardır?