[英]How can I structure my abstract classes
我正在寫游戲,想對我的班級結構發表意見。
目前,我有一個Character類,一個AICharacter類和KnightCharacter類。
角色擁有諸如Death()之類的所有角色都必須便利的東西,AICharacter會用AI驅動角色的額外細節覆蓋Death()。 KnightCharacter會覆蓋角色的內容,例如處理Shields(僅適用於騎士)。
如何優雅地允許玩家擁有KnightCharacter:Character和我的AI擁有KnightCharacter:AICharacter:Character?
我基本上只想在AI控制的情況下實現AICharacter。
謝謝
一種提供很大靈活性的方法是將您的角色和對象分解為各個方面,每個方面都是其自己的類。 動作或RPG角色可能具有的某些方面的示例是:健康,法力,磨損裝備,UsesItems,MobileObject,PhysicalRigidbody,MeleeAttackPerformer,RangedAttackPerformer,MagicAttackPerformer,PlayerControlledMobile,AIControlledMobile,甚至AudioSource等,等等。類將從一個共同的基礎派生,例如AspectMixin或類似的基礎。
如果將這些類中的每一個都視為混入,那么在創建具有對於該類型的actor有意義的方面的新原型時,您將獲得很大的靈活性。 例如,這將允許怪物和玩家共享它們具有健康狀況,但具有不同的類別來控制它們的事實(AI控件與玩家控件)。 此外,“健康”方面可以添加到固定對象(例如槍管)中,以使其受到損壞的影響。
為此,您的原型對象存儲了該原型的方面mixin列表。 此外,各方面需要能夠按類型(或接口)向主對象查詢其他方面。 設置工作有些繁瑣,但這就是靈活性的代價。
FWIW,這是Unity Engine嘗試鼓勵的方法(考慮到他們將它們稱為MonoBehavior:behavior..aspect ...對於同一概念的不同詞語),盡管許多開發人員在完成之前不會“理解”幾個失敗的原型,其中的類很快變得單一。
回到最初的問題,它取決於您擁有多少個可玩類,以及AI是否可以控制相同類的字符。 如果是這樣,最好從字符中抽象出控件,然后讓AIControls和PlayerControls從Controls派生出來,它們中的任何一個都可以與您的角色類對接。
另一方面,如果AI類型可以分解為幾種不同的行為(攻擊性怪物,和平的NPC),我將把每個方面都作為一個方面。
您要問的是使用普通c#繼承是不可能的。 你的兄弟不能有和你不同的祖父。
由於您似乎在尋找想法,因此這里使用了泛型:
abstract class BaseController
{
virtual GameEvent ReadNextEvent();
}
class PlayerController : BaseController
{
override GameEvent ReadNextEvent
{
return userInterface.ReadNextEvent();
}
}
class NonPlayerController : BaseController
{
override GameEvent ReadNextEvent
{
artificialIntelligenceEngine.Think();
return artificialIntelligenceEngine.ReadNextEvent();
}
}
abstract class Character<T> where T : BaseController
{
protected T controller;
abstract ProcessEvents();
}
class KnightCharacter<T> : Character<T>
{
override ProcessEvents()
{
var e = controller.ReadNextEvent();
switch (e.Action)
{
1 : SwingSword(); break;
2 : LiftShield(); break;
3 : Yell("None shall pass!"); break;
}
}
}
class Program
{
void Example()
{
var playerKnight = new KnightCharacter<PlayerController>();
var aiKnight = new KnightCharacter<NonPlayerController>();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.