Bir Varlık Sisteminde çarpışma tespiti ve yanıtı


12

ES ile daha eğlenceli ...

Şu anda birkaç sistemim var:

  • Renderer (Yenilenebilir özellik, Transform özelliği)
  • Hareket (Taşınabilir özellik, Dönüştür özelliği, Yenilenebilir özellik [sınırlayıcı kutular için, vb.])
  • Giriş (InputReceiver özniteliği)
  • vb.

Çarpışma tespiti ekliyorum. İlk düşüncem çarpışma yapan yeni bir sistem eklemekti. MotionHareket eden veya canlandırılan her şey çarpışma algılamaya (kameralar, sis vb.) Mutlaka katılmadığı için bunu sistemden izole tutmak bana mantıklı geliyor , ancak öyle görünüyor Collisionve Motionbirbirine bağımlı görünüyor .

Bir Motionöğeyi taşıdığında, dönüşümün onaylanması Collisionve hareketin iptal edilmesi veya ayarlanması gerekir (sıçrayan, duvarda durma vb.).

Alternatif olarak, birbiriyle çarpışabilecek varlıklar arasında paylaşılan bir çarpışma nesnesine (kd-tree, octree vb.) Bir referans sağlayan Collidable niteliği oluşturmak olabilir. MotionSistem daha sonra bu özellik için kontrol edin ve kontrol etmek veya hareketini ayarlamak için kullanmak.

Kod açısından bakıldığında, bu kabul edilebilir bir çözümdür. Ancak, bir ECS mimarisi bakış açısından, mantığı, özniteliği Motionolan tüm varlıklara uygulanmayan sisteme ittiği görülmektedir Movable.

Ben de bir hareket vektörü depolayabilir Movableözniteliği ve sahip Collidersistem ayarlamak Transformgerektiği gibi, ama bu işlevleri arasında çoğaltma dahil edeceğiz Motionve Colliderya bir geri arama Collideriçin Motionsıçrama / yansıma, vb çarpışma konumu ve yüzey veriler hakkında bazı verilerle .

Bu "özel durum kesmek" başlığı altında olabilir ama bir ton kenar vaka kodu oluşturmadan önce bu ele almış olanlar bazı girdi almak istiyorum.

Soru Hareket ve çarpışma sistemleri arasında birbirlerinin bilgisine ihtiyaç duydukları zaman sıkı bağlantıdan kaçınmanın iyi bir yolu nedir?


1
Soru nedir?
jcora

@Çarpışma algılama mantığını koymak, çarpışma + hareketini olabildiğince ayrı tutmak ve sistemler arasındaki karşılıklı bağımlılıkları minimumda tutmak için iyi bir yer olsun.
Yazım

1
Harika, şimdi bunu sorunuza koyun, cesurca . :)
jcora

Yanıtlar:


7

Çok düşünüyorsun. Bir varlık bileşen sistemi de kullanan motorumda, her GameObjectbirinin bir işaretçisi olabilir ModuleCollision.

Oyun güncellendiğinde ne olur:

  • Sahne, tuttuğu tüm nesneleri günceller. Her Updatebiri için işlevi çağırır GameObject.
  • İçinde Updatefonksiyonu, her GameObject sadece hızını ve yönünü, günceller değil konumunu.
  • GameObjectmevcut konumunu, hızını ve yönünü ( ModuleCollisionvarsa) yükler .
  • Sahne ModuleCollisiontemelde çarpışma kontrolü yapar .
  • Sahne UpdatePost, her birinde işlevi çağırır GameObject. Nesnede bir çarpışma modülü varsa, çarpışma modülünden güncellenmiş konumu, hızı ve yönü getirir. Konum hız ve yön ile güncellenir.
  • GameObjectKonumu ve başlığı dışında nihai bir 3x3 matris oluşturur.

Evet, bazı devlet kopyaları var, ama sorun değil. A üzerinde çarpışma işlemi yapmak ModuleCollisionen iyi yoldur, çünkü aksi takdirde her GameObjectbirinin bir ModuleCollisiontutamacı olup olmadığını kontrol etmeniz gerekir .


2
Öyleyse, bir çarpışma durumunda geri izleme pozisyonu hakkında endişelenmek yerine, hızı / ivmeyi çeviriden ayırırsınız, algılanan çarpışmalara dayalı olanları değiştirirsiniz ve daha sonra bu değişiklikler aynı çerçeve içindeki ikinci bir özel güncellemede yayılır mı? Oldukça temiz görünüyor. Teşekkürler.
3Dave

3

Ben böyle yapardım ...

Üç sisteminiz var:

  1. Hareket sistemi
  2. Hızlanma sistemi
  3. Çarpışma sistemi

Hareket sistemi pozisyonlara hız uygular. İvme sistemi hızlara kuvvet uygular. Çarpışma sistemi çarpışmaları tespit eder ve kuvvetleri doğru yönlere uygular veya kaba çarpışmalar istiyorsanız, hızları doğrudan değiştirir.

Örneğin, atan2'yi kullanarak çarpışmalar arasındaki açıyı hesaplayabilir ve daha sonra bunu, cisimleri doğru kuvvetleri / hızları uygulamak için kullanabilirsiniz.

Gerekirse çarpışma algılama sisteminin de mesaj yayınlamasını sağlayın.

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.