Bileşen tabanlı bir varlık mimarisinde “sistemlerin” rolü nedir?


177

Varlık bileşenleri ve sistemleri hakkında çok şey okudum ve bir varlık olarak sadece bir kimlik olması fikrinin oldukça ilginç olduğunu düşündüm.

Ancak bunun tamamen bileşen veya sistem yönüyle nasıl çalıştığını bilmiyorum. Bir bileşen, sadece ilgili bir sistem tarafından yönetilen bir veri nesnesidir. Bir çarpışma sistemi, çarpışmaların olup olmadığını belirlemek için uzamsal veri yapısıyla birlikte bazı BoundsComponent'i kullanır.

Şu ana kadar ki her şey yolunda, fakat birden fazla sistemin aynı bileşene erişmesi gerekiyorsa? Veriler nerede yayınlanmalı? Bir giriş sistemi bir BoundsComponent varlığını değiştirebilir, ancak fizik sistemlerinin bazı oluşturma sistemlerinde olduğu gibi aynı bileşene erişmesi gerekir.

Ayrıca, varlıklar nasıl inşa edilir? Çok okuduğum avantajlardan biri varlık inşasında esneklik. Sistemler gerçekten bir bileşene bağlı mı? Yeni bir bileşen tanıtmak istersem, yeni bir sistem tanıtmam veya var olanı değiştirmem gerekir mi?

Sık sık okuduğum bir diğer şey, varlığın 'türünün' hangi bileşenlere sahip olduğuna göre çıkarımı olmasıdır. Eğer varlığım sadece bir kimlik ise, robot varlığımın bazı sistemler tarafından taşınması, yaratılması ve değiştirilmesi gerektiğini nasıl bilebilirim?

Uzun yazı için özür dilerim (ya da en azından benim telefon ekranından öyle görünüyor)!

Yanıtlar:


336

Varlık bileşen sistemlerini temsil etmenin ve uygulamanın çok sayıda yolu vardır, ancak burada bir yolun açıklaması bulunmaktadır. Unutmayın, varlık / bileşen / sistem mimarilerinin somut bir tanımı yoktur, bu yüzden bu sadece bir uygulama.

Varlık / bileşen / sistem mimarileri için yardımcı olabilecek bir analoji tanıtacağım. Anahtar gibi bir varlık düşünelim.

Varlık

Varlık anahtarı

Anahtarlar ayrıca dişlere sahiptir (koyu mavi). Varlık anahtarımızın dişleri, onu oluşturan bileşenlerdir. Aynı dişlere sahip olsalar bile varlıklarına kimlikleriyle ayırabilirsiniz. Peki anahtarlar neye uyuyor? Kilitler. Kilitler bizim sistemimizdir. Örneğin, bir hareket sistemi.

Sistem

Hareket sistemi kilidi

Kilit sadece anahtarımız hem konum hem de hız için dişe sahipse çalışır. Bu sistem sadece pozisyonu ve hızı olan varlıkları işler. Bu sistemlerin hangi varlıkların işleneceğini nasıl tanıdığını ayarlamanın birden fazla yolu vardır, ancak bunun bir yolu kullanmaktır long. Her bit bir bileşen türü için ayrılmıştır. Örneğimize göre, 64 bit uzunluğunda bir 4 bit tür üstlenelim. Örnek varlığımız mevcut tüm bileşenlere sahip olacaktır. Bu yüzden anahtar olurdu 1111. Ardından, sistem, sahip olan herhangi bir varlık için arıyor 11--. ( -Temsil umursamıyor, çünkü hareket bir sprite veya sağlık olup olmadığını umursamıyor). Basit bir ANDişlemle bir varlığı kontrol edebilir . Yani bizim varlığımız eşleşiyorsa ((1111 & 1100) == 1100). Seni kaybettiysem bitsel işlemler hakkında biraz daha kontrol et .

Gördüğünüz gibi, sistemlerin dış kaynaklara erişimi var. Zamana, grafiklere, sese vb. Erişebilirler. Onlar sadece bir seferde bir anahtar alan ve işlem yapan küçük işlemcilerdir. Hareket sisteminin hız, delta zaman ve konum aldığını görüyorsunuz; daha sonra bazı hesaplamaları yapar ve sonucu tekrar konumuna kaydeder.

Varlık anahtarlarını oluşturmak gerçekten kolaydır. İstediğiniz zaman ekleyebilir veya kaldırabilirsiniz. İşletme umursamıyor, sadece bileşenleri gruplandırmanın ve tutmanın bir yolu. Bileşenlerin birbirine bağımlılığı yoktur. Bileşenlerin birbirleriyle etkileşime en yakın olduğu şey, bir sistemin kendileri üzerinde çalıştığı ve hareket örneğimizde olduğu gibi birinden diğerini güncellemek için verileri kullandığı zamandır.

Bu fikri sağlamlaştırmak için başka bir sisteme göz atalım:

Çizim sistemi kilidi

Bu bizim çizim sistemimiz. Eşleşen bileşenleri arar 1-1-. Bu varlık eşleşir çünkü: ((1111 & 1010) == 1010)Ek olarak, varlık sprite'ı konumuna çekerek bu sistemin ekrana bilgi verdiğini görebilirsiniz.

Tamam, bir tane daha. Başka bir işletmeye bakalım ve şimdiye kadar bizim örneğimize nasıl uyduğunu görelim.

Hareketsiz varlık anahtarı

Gördüğünüz gibi, bu işletmenin kendisine bağlı daha az bileşeni var. Sahip olduğu bileşenlere bakarak, kaya gibi statik bir ürün olabileceği anlaşılıyor. Sadece bir konumu ve sprite var. Hareket etmeyecek ve herhangi bir sağlık değişikliğinden etkilenmeyecek. Bu işletme, 1010'un anahtarını üretecektir. Peki, bu varlık üzerinde hangi sistemler çalışıyor? Hadi kontrol edelim:

Hareket sistemimize karşı: ((1010 & 1100) != 1100)Hayır. Hareket sistemi bu varlığı önemsemiyor, çünkü gerekli bileşenlere sahip değil.

Çizim sistemimize karşı: ((1010 & 1010) == 1010)Hey, bu bir eşleşme. Bu varlık çizim sistemi tarafından işletilecektir. Çizim sistemi sprite tanımlanmış pozisyonda çizer.


Umarım, şimdi bileşenlerimizi alan ve üzerinde çalışan başka bir sistem eklemenin ne kadar kolay olduğunu görebilirsiniz. Sorularınıza cevap verdiğime emin olalım:

Birden fazla sistemin aynı bileşene erişmesi gerekiyorsa ne olur? Veriler nerede yayınlanmalı?

Tipik olarak, sistemler birbiri ardına çalışır. Gereksinimlerine uyan tüm varlıkları işlerler, sonra bir sonraki sistem de aynısını yapar. Veri varlık ile birlikte yaşıyor. Sistemde depolanan herhangi bir şey olmamalıdır, sadece döndürülen bir kilit, anahtar bilginin kaldığı ve kilitten kilide geçtiği yerdir.

Varlıklar nasıl inşa edilir? Sistemler gerçekten bir bileşene bağlı mı? Yeni bir bileşen tanıtmak istersem, yeni bir sistem tanıtmak veya mevcut bir bileşeni de değiştirmek zorunda mıyım?

Varlıklar sadece bileşen torbalarıdır. Benzersiz bir kimlikleri ve bir bileşen listesi var. Sistemler yalnızca yukarıda açıklanan şekilde bileşenlere bağlanır. Üzerinde çalışan sistemler olmadan bileşenlere sahip olabilirsiniz, ancak bu oldukça anlamsız. Benzer şekilde, hiçbir varlığa sahip olmayan bileşenleri arayan sistemlere sahip olabilirsiniz. Bu daha az anlamsız, çünkü sadece kilitleriyle eşleşen bir varlık yaratılmayı bekliyor olabilirler. Yani, evet, eğer yeni bir bileşen tanıtırsanız, o bileşeni kullanan bir sistem yapmak istersiniz. Aksi halde, mevcut olmayan bir kilit için sadece anahtarınıza diş eklersiniz.

Eğer varlığım sadece bir kimlik ise, robot varlığımın bazı sistemler tarafından taşınması, yaratılması ve değiştirilmesi gerektiğini nasıl bilebilirim?

Sanırım buna long, varlığın içerdiği bileşenleri tanımlayan bir anahtar fikri ile cevap veriyorum . Bilirsin, çünkü anahtar kilide uyar.

Uf! Bu uzun bir yazıydı! (Ya da en azından benim büyük monitörümden öyle görünüyor.)


23
Bu anahtar benzetme şimdi tüm fikri anlamak için gerçekten yararlıdır. Parlak fikir! Son paragrafınızda Lol :)
bio595

16
+1 Varlık bileşen sisteminin şimdiye kadar gördüğüm en büyük ve en iyi açıklaması için. :Ö!
knight666

7
Benden -1 - çünkü bu kötü bir yaklaşım değil, ancak THE yaklaşımı olarak gösteriliyor. Ancak, bileşenlerin ve hizmetlerin ayrılmadığı pek çok sistem vardır (örneğin, Birlik'te) ve sistemlerin hangi varlıkların işleneceğini bilmeleri için daha basit yollar vardır (yalnızca varlık oluşturulduğunda bunları ekleyin).
Kylotan

37
@Kylotan " Bu sistemlerin hangi varlıkların işleneceğini nasıl tanıdığını ayarlamanın birden fazla yolu var, ama bunun bir yolu da kullanmaktır long. " diyor). Ele aldıkları konuların% 100'ünü kapsamayan tüm cevaplar için yaparsanız, oy kullanmaya çok zaman harcayacağınızı düşünüyorum.
MichaelHouse

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.