Birimlerin düşman “farkındalığını” nasıl uygulamalıyım?


12

Bir RTS / TD hibrit prototip oyunu geliştirmek için Unity3d kullanıyorum. Birimler ve düşmanları arasındaki "farkındalık" için en iyi yaklaşım nedir? Her birimin her düşmana olan mesafeyi kontrol etmesi ve menzil dahilindeyse nişan alması mantıklı mı?

Şu an için yaklaşacağım yaklaşım her ünitede tetikleyici bir küreye sahip olmak. Bir düşman tetiğe girerse, birim düşmanın farkına varır ve mesafe kontrolüne başlar. Bu, bazı gereksiz kontrollerden tasarruf sağlıyor mu?

Buradaki en iyi uygulama nedir?


Birim / düşman sayısının Yüce Komutan ölçeğinde olacağını da eklemeliyim
Phil

Yanıtlar:


10

Sınırlayıcı hacim hiyerarşilerine (BVH) bakın. Çarpışmaların hesaplanmasında en çok çarpışma tespitinde veya çarpışmaların hesaplanmasında gerekli olan kontrol sayısını azaltmak için veya nesnelerde frustum kaldırma işlemi yapmak için kullanılırlar. Zaten küreler kullandığınız için, AABB gibi diğer hacimler daha verimli olabilmesine rağmen bir küre ağacı öneririm . Unity'nin hiç kullanmadığım şeyler için ne tür bir desteğe sahip olduğundan emin değilim, ancak muhtemelen bunun için zaten çarpışma algılama veya motorun parçalarını oluşturmada bir şey var.

Temel olarak, birbirine yakın olan düşmanları birden fazla üst alanda gruplandırmak istersiniz. Bir birim taşındığında, her düşmanı kontrol etmek yerine ana küreye karşı tetik küresini kontrol edersiniz. Tetikleyici küre ana küre ile kesişirse, içindeki her düşmanı kontrol edersiniz. Eğer değilse, içindeki tüm düşmanları atabilirsiniz. Her bir küre için maksimum küre büyüklüğüne veya düşman sayısına dayalı olarak birden çok küre seviyesi oluşturmak ve kontrolü en üst düzey bir küre temelinde yapmak istersiniz. O zaman her düşmanı kontrol etmek için her bir düşmanı kontrol etmek zorunda kalmadan ağaçtan aşağı inmek önemlidir.

Her kare için gerekli adımlar:

  1. Düşmanları hareket ettir
  2. Yeni düşman pozisyonları için BVH'yi yeniden oluşturun / güncelleyin
  3. Birimleri hareket ettirin ve küre ağacına karşı kontrol edin.

Bu, çok sayıda düşman olduğunda gerekli kontrolleri azaltabilir, ancak ağacın güncellenmesi ve depolanması yükü, çok fazla olmadığında buna değmeyebilir. Neyin peşinde olduğunu bilmek için Yüksek Komutan'a aşina değilim, bu yüzden sadece 'yüzlerce' varsayıyorum. Ek yükün sizin için buna değip değmeyeceğini öğrenmek için farklı durumlarda profil oluşturmanız gerekir.


3
+1, bu yaklaşım bazı hatalar olsa da en basit olacaktır. OP bunu uygulamak ve daha sonra bir oktree gibi bir şey uygulamak isteyebilir. Ayrıca, çoğu RTS'de, üniteler bir miktar gecikmeyle tepki verir. Aslında, oyunlardaki çoğu yapay zeka saniyede 10-30 kare hesaplanır, burada oyun saniyede 30-60 kare hızında çalışabilir (sayılar elbette yaklaşıktır).
Samaursa

Teşekkür ederim, beni bir adım daha ileri götürmem için gereken buydu. BVH'yi ve Unity'de nasıl uygulanacağını araştıracağım. Çok pedagojik ve bilgilendirici yazı! +1
Phil

Oh ve RTS'ye gidersen Yüce Komutan'a bak. Tüm Chris Taylor oyunları gibi gerçekten çok güzel bir oyun.
Phil

7

BVH'lerin uygulanmasına gerek yoktur, çünkü Unity'nin çarpışma motoru bunu zaten sizin için yapar.

Her birime (aralığını temsil eden) büyük bir sınırlayıcı küre tetiği takın OnCollisionEnter()ve OnCollisionExit()hangi düşmanların her birimin menzili dahilinde olduğunu izlemek için ve geri çağrıları ele alın .

İlgilendiğiniz durumun , başka bir birimin küreyle çarpışması değil , başka bir birimin küreyle çarpışması olduğunu unutmayın.


1
Bunun en azından kabul edilen cevabın hemen üstüne çıkması gerektiğini düşünüyorum. Kabul edilen cevap çalışmak için iyidir, ancak bu cevap en pratik yol olduğu için en üstte olmalıdır.
Varaquilex

Kastettiğine inanıyorum OnTriggerEnter()ve OnTriggerExit()değil mi?
Jibb Smart

1

Çok iyi ölçeklenen ve çok sayıda başka şey için kullanılabilen bir başka çözüm, bir influeunce haritasıdır. X yarıçapında taramak için ünitenin etrafında bir dizi ızgara döşemesi oluşturun. Bu karoları üzerinde duran bir düşman için tarayın. En yakın düşmanları elde etmek istiyorsanız, setinizi mesafeye göre sıralayabilirsiniz.

Bu, özellikle savaş haritası veya patika bulma gibi etki haritasına sahip başka şeyler yapmayı planlıyorsanız, en etkili yöntem olabilir.

İşte konsepti açıklayan bir video: https://www.youtube.com/watch?v=MEd6XV2Pecw .

Ve bir uygulama: https://www.youtube.com/watch?v=y_ewoxlZlgc

Izgara döşemesinin birim koleksiyonunu başlangıçta başlatmamanızı öneririm - bunun yerine yalnızca koleksiyon gerektiğinde.

Alternatif olarak, bir döşemede hiçbir zaman X biriminden daha fazla olmayacağını biliyorsanız X uzunluğunda bir dizi kullanabilirsiniz.

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.