继承的构成 - 武器系统

时间:2013-10-13 11:25:03

标签: c# inheritance unity3d composition

我正在开发一款使用Unity3D编码C#的游戏。

自从我从纯OOP环境来到Unity后,基于组件的方法对我来说毫无意义。因此,对于我们的武器系统,我使用继承树和对象层次结构方法纯粹是OOP。我花了更多时间在我的代码中添加新功能和东西,我发现这个设计越不灵活。所以现在我倾向于基于组件的设计。

我发布了我的问题here,询问我是否已经使用了基于组合的继承方法,这是由Mr.Jamora建议的here

他的解决方案听起来非常好。但是如果我拥有多种武器,实现相同的逻辑就可以说Reload来自IReloadable

public interface IReloadable
{
   void Reload();
}

public interface IUpgradable
{
   void Upgrade();
}

public interface IShooter
{
   void Shoot();
}

public SMG : IShooter, IReloadable
{
   void Shoot()
   {
       // shooting logic 1
   }
   void Reload()
   {
       // reloading logic 1
   }
}

public AssaultRifle : IShooter, IReloadable, IUpgradable
{
   void Shoot()
   {
       // shooting logic 2
   }
   void Upgrade()
   {
       // upgrade logic 1
   }
   void Reload()
   {
       // reloading logic 1 -- SAME LOGIC
   }
}

正如您所看到的,代码重复,我不喜欢这样。 这可以避免吗? (以干净,灵活的方式)

总的来说,这是(继承的构图)是一种在Unity中制造武器系统的好方法吗? - 或者最好使用Unity基于组件的方法,制作ShooterReloadable组件(脚本)并将它们附加到我的武器游戏对象上?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

感谢所有试图提供帮助的人。我实际上从Jamora那里得到了一个很好的解释,就是我在 [link]上面发布的链接。但我没有时间再次分享它。

但是,我发现您无法将所有内容都设为组件,例如ReloadableShooter组件。除非你的所有武器以相同的方式重新加载/射击,否则你不能创建这样的组件并将它附加到它们上,因为如果武器重新加载/射击不同,这意味着这些信息应该在武器本身(即抽象{{1可能是一个抽象的WeaponReload方法,因此组件不知道该信息。

另一个示例,使Shoot脚本组件附加到您的项目。你不能这样做,这没有意义。使用健康项目与使用钥匙打开门不同。使用信息存储在项目本身中。将Usable附加到项目,意味着所有项目都以相同的方式使用。

我还发现,即使在Unity中,继承也是必须的。但糟糕的是,只依赖纯粹的对象层次树来完成所有设计。相反,创建小树的混合,实现不同行为的接口,并尽可能地创建脚本组件。

答案 1 :(得分:0)

如果您遵循Unity3D约定,特别是如果您使用javascript,则首选(强制)使用Composition。

但是看起来你使用C#就可以选择了。

只要您不违反DRY,那么这实际上取决于您的偏好。但是已经建立了统一来处理作文。 (另一方面,我更喜欢继承)

答案 2 :(得分:0)

是的,组合对于可重复使用的代码是最佳的,并防止重复和复制粘贴代码。你没有使用组合,你只使用了继承和接口。最好的方法是实现IReloadable Ishootable,...接口和Reloadable1,shootable1,Reloadable2,shootable2,......继承IReloadable,Ishootable的类。然后你可以使用Reloadable1,shootable1,Reloadable2,shootable2,..组件为你的武器。因此,如果您想要更改任何内容,则只需更改一个组件(例如Reloadable2)