簡體   English   中英

如何構造我的抽象類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM