首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何构造抽象类?

如何构造抽象类?
EN

Stack Overflow用户
提问于 2017-12-01 07:25:22
回答 2查看 106关注 0票数 0

我正在写一个游戏,并希望对我的阶级等级有一个看法。

目前,我有一个字符类、一个AICharacter类和一个KnightCharacter类。

字符包含所有字符必须提供的死亡()之类的东西,AICharacter用AI驱动的字符的额外细节覆盖Death()。KnightCharacter凌驾角色的东西,如处理盾牌(只为骑士)。

我怎么能优雅地允许我的玩家拥有一个KnightCharacter :字符和我的AI拥有一个KnightCharacter : AICharacter :字符?

我只想在AICharacter被AI控制时才实现它。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-01 07:48:16

提供大量灵活性的一种方法是将您的字符和对象分解为不同的方面,其中每个方面都是它自己的类。动作或角色可能具有的一些方面的例子有: Health、Mana、WearsEquipment、UsesItems、MobileObject、PhysicalRigidbody、MeleeAttackPerformer、RangedAttackPerformer、MagicAttackPerformer、PlayerControlledMobile、AIControlledMobile,甚至还有AudioSource等。这些类中的每一个都来自一个公共基础,例如AspectMixin或类似的东西。

如果您将这些类视为混合类,那么您在创建新的原型时获得了很大的灵活性,这些原型具有对该类型的参与者有意义的方面。这将允许,例如,怪物和玩家分享事实,他们有生命,但有不同的类别来控制他们(AI-控制与玩家-控制)。此外,健康方面可以添加到一个固定的物体(例如一个桶),让它受到损害。

为了实现这一点,原型对象为该原型存储一个方面混合列表。此外,方面需要能够按类型(或接口)查询主对象的其他方面。这需要做一些工作,但这是灵活性的代价。

FWIW,这是Unity试图鼓励的方法(考虑他们称它们为MonoBehavior: behavior..aspect...different单词,表示相同的概念),尽管许多开发人员直到创建了几个失败的原型,类很快就变得单一,才“理解”它。

回到原来的问题,这在一定程度上取决于您有多少可玩类,以及AI是否能够控制相同类的字符。如果是这样的话,最好将控件从字符中抽象出来,然后让AIControls和PlayerControls从控件中派生出来,其中任何一个控件都能够与您的字符类进行接口。

另一方面,如果AI类型可以被分解成几个不同的行为(攻击性怪物,和平的NPC),我会使每一个方面。

票数 2
EN

Stack Overflow用户

发布于 2017-12-01 08:50:14

对于普通的c#继承,您所要求的是不可能的。你弟弟不能和你有不同的祖父。

由于您似乎在寻找想法,这里有一个使用泛型的方法:

代码语言:javascript
运行
复制
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>();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47588507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档