RTS oyun birimi yapısı


18

MoveTo ve Attack eylemleri gibi şeyleri bir kereden fazla programlamak zorunda kalmadan birçok farklı birim oluşturmanın bir yolunu istiyorum

Gördüğüm gibi, bunu yapmanın 2 yolu var.

  1. Ne yapabileceğini / yapamayacağını belirten bayraklara sahip tek bir genel Unit sınıfı (ardından statik bir dizide örnekler oluşturun ve gerektiğinde bunları yakalayın)
  2. (Saldırı, Hasat, Devriye) gibi Birime özgü eylemler için soyut yöntemlerle soyut birim sınıfı , bu da birim aslında bir şey hasat edemese bile alt sınıflara uygulanması gerekir .

Bunu yapmanın ilk yolu en basit gibi görünüyor, ancak birimlerin çoğunluğu için kullanılmayan kod bir sürü sahip olacaktı.

ikinci yol da işe yarayabilir. Ama kaynakları toplayabilecek iki farklı birime sahip olmaya karar verirsem, iki farklı sınıfta aynı kodu kullanacağım, bu da bunu yapmanın doğru yolu gibi görünmüyor.

Bu, bu soruna doğru bir yaklaşım mı?
AoE gibi bir oyunda, her birimin varsaydığım şey, bir tür Eylemler / Siparişler Listesi var, buna benzer bir şeye nasıl ulaşacağımı gerçekten bilmek istiyorum, burada her bir Eylem / Sipariş'i bir kez kodlayabiliyorum ve daha sonra söz konusu Eylem'e ihtiyaç duyan tüm birimlere verin.

Eğer net değilim (son derece makul) veya tam olarak ne aradığım hakkında daha fazla bilgiye ihtiyacınız varsa, bana bir yorumda sorun.

Yanıtlar:


25

Ortak bir yaklaşım, temel sınıf "Birim" in sadece tüm birimlerin ortak olduğu en temel yönleri uyguladığı, bileşen tabanlı bir yaklaşıma sahipken, her birimin ne yapabileceğini söyleyen birden fazla bileşen nesnesi ve nasıl yapar.

Örneğin, bir tank bileşenlere sahip olabilir Mobile, Destructible, Attacker, hareketsiz sadece taret Destructible, Attackerve bir biçerdöver Mobile, Destructible, Harvester. Bu sınıflar daha sonra bu davranışları uygulamak için gereken tüm kodu içerecektir. Bileşenler arasındaki etkileşimler ( Attackeryalnızca olana zarar verebilir Destructible), bileşenin diğer birimin gerekli bileşene sahip olup olmadığını denetlemesi ve ardından bu bileşenle doğrudan etkileşim kurmasıyla gerçekleştirilebilir.

Klasik bir sınıf mirasına göre avantaj, yetenekleri kolayca birleştirebilmenizdir. Örneğin, saldırı, piyade ve sinek taşıyabilen bir biçerdöveye sahip olmak istediğinizde, sadece gerekli bileşenleri eklemeniz gerekir. Ayrıca temel Unit sınıfını şişirmek zorunda kalmadan kolayca yeni bileşenler biçiminde yeni özellikler ekleyebilir ve kaldırabilirsiniz.

Unity sizi böyle bir mimaride destekler, çünkü tüm motor zaten bileşen tabanlıdır. Böylece, bu gibi oyun-mantıksal bileşenler komut dosyası biçiminde eklenebilir.


Birlik halinde, bileşenleri gerektiği gibi devre dışı bırakıp etkinleştirir miyim?
Daniel Holst

@DanielHolst Hayır, gerektiğinde ekleyip kaldırabilirsiniz. Unity editörü veya scrips kullanarak bunu yapabilir gameObject.AddComponentve gameObject.RemoveComponent.
Philipp

ah tamam, ama bir "moveTo" eylemi / emri söyle. birim siparişin ne zaman yapıldığını nasıl bilebilir? ve siparişleri nasıl sıraya koyabilirim?
Daniel Holst

2
@DanielHolst Sanırım bir şeyi yanlış anladınız. MovingBileşen anlamına gelir "bu birim hareket genel olarak yeteneğine sahiptir". Ünite, hareket edip etmediğine bakılmaksızın kalıcı olarak tutturulur. Bu şu anda hareket ettiği anlamına gelmiyor . Eğer rağmen olabilir ayrıca ekleyerek bu şekilde yapmak MoveOrderdüzen yerine veya iptal edildiğinde biriminden o bileşen kaldırmayı kendisi buna bileşeni ve sahip.
Philipp

1
@DanielHolst Şimdi diğer bir solucan kutusu olan AI biriminin yönüne doğru sürükleniyorsunuz. Olası bir yaklaşım, belirli bileşenlerin mevcut olduğunu varsayan veya ünitenin sahip olduğu bileşenlere bağlı olarak davranışlarını değiştiren bir AIScript bileşenleri kütüphanesine sahip olmak olacaktır. Ancak bu, bir yorumda ele alınması gereken çok karmaşık bir konudur.
Philipp

4

Pek çok oyun , varlık sınıfının (veya eşdeğerinin) bir parçası olarak kodlanmak yerine daha genel bir birim türüne eklenebilecek olan varlıklara yönelik bileşen tabanlı bir sistem kullanır .


bunun uygulanması son derece zor olur mu?
Daniel Holst

Bunun gibi modeller, uygulamayı genel olarak kolaylaştırmak için kullanılır. Hangi yaklaşımı alacağınıza karar veremiyorsanız, olabildiğince basit başlamak ve daha fazla işlevsellikte olduğunuz gibi seçiminizi büyütmek iyi bir fikirdir. Sorun hakkında daha fazla fikir edindikten sonra, durumunuza daha uygun bir yaklaşımı yeniden düzenleyebilir veya yeniden yazabilirsiniz.
Ross Taylor-Turner

1
@DanielHolst Sorunuzun Unitybayrağı olduğunu fark ettim . Birlik halihazırda yerleşik bir bileşen sistemine sahiptir ve kalıtım üzerine kompozisyonu şiddetle desteklemektedir . Basit bir yöntem MonoBehaviour, eylem türlerinizin her biri için a oluşturmak , ardından gerçekleştirebileceği eylemlere önceden her birim türüne eklemek (eylem örneklerini hasar değerleri ve maliyetler gibi tür başına ayrıntılarla özelleştirmek) olacaktır. Bu, birim oluşturma işleminizi veriye dayalı tutar, böylece birçok özel birim türünü kolayca yapabilirsiniz.
DMGregory

@DanielHolst Bu, "aşırı zor" tanımınıza bağlıdır. Cevabım bunun nasıl uygulanabileceği hakkında daha ayrıntılı olarak ele alınmaktadır.
Philipp
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.