我正在开发一款使用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基于组件的方法,制作Shooter
和Reloadable
组件(脚本)并将它们附加到我的武器游戏对象上?
提前感谢您的帮助。
答案 0 :(得分:1)
感谢所有试图提供帮助的人。我实际上从Jamora那里得到了一个很好的解释,就是我在 [link]上面发布的链接。但我没有时间再次分享它。
但是,我发现您无法将所有内容都设为组件,例如Reloadable
或Shooter
组件。除非你的所有武器以相同的方式重新加载/射击,否则你不能创建这样的组件并将它附加到它们上,因为如果武器重新加载/射击不同,这意味着这些信息应该在武器本身(即抽象{{1可能是一个抽象的Weapon
和Reload
方法,因此组件不知道该信息。
另一个示例,使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)