我正在写一个游戏,并希望对我的阶级等级有一个看法。
目前,我有一个字符类、一个AICharacter类和一个KnightCharacter类。
字符包含所有字符必须提供的死亡()之类的东西,AICharacter用AI驱动的字符的额外细节覆盖Death()。KnightCharacter凌驾角色的东西,如处理盾牌(只为骑士)。
我怎么能优雅地允许我的玩家拥有一个KnightCharacter :字符和我的AI拥有一个KnightCharacter : AICharacter :字符?
我只想在AICharacter被AI控制时才实现它。
谢谢
发布于 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),我会使每一个方面。
发布于 2017-12-01 08:50:14
对于普通的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>();
}
}
https://stackoverflow.com/questions/47588507
复制相似问题