繁体   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