c# - 游戏架构 - 耦合还是不耦合?

标签 c# architecture

我正在构建一个简单的游戏,其中包含移动设备——游戏中的角色(生物)。每个生物都可以执行某些功能。为了向 Mob 提供该功能,我创建了一个 Behavior。

例如,假设一个生物需要在游戏区域中移动,我会给它 MoveBehavior - 这被添加到生物类的内部行为列表中:

// Defined in the Mob class
List<Behavior> behaviors;

// Later on, add behavior...
movingMob.addBehavior(new MovingBehavior());

我的问题是这样的。大多数行为都会操纵暴徒的某些事情。在 MoveBehavior 示例中,它将更改生物在世界中的 X、Y 位置。但是,每个行为都需要特定的信息,例如“movementRate”—— movementRate 应该存储在哪里?

是否应该存储在 Mob 类中?其他生物可能会尝试通过减慢/加速生物来与之交互,并且在生物级别更容易访问...但并非所有生物都有 movementRate,因此它会造成困惑。

还是应该存放在MoveBehavior类中?这将它隐藏起来,使其他生物更难与之互动 - 但它不会使具有额外和未使用属性的非移动生物变得杂乱无章(例如,一个不移动的塔永远不需要使用 movementRate)。

最佳答案

这是经典的“行为组合”问题。权衡是行为越独立,它们之间的交互就越困难。

从游戏编程的角度来看,最简单的解决方案是决定一组“核心”或“引擎”数据,并将其放入主对象中,然后让行为能够访问和修改该数据——可能通过功能接口(interface)。

如果您想要特定于行为的数据,那很好,但是为了避免变量名称中的冲突,您可能希望访问它的接口(interface)包含行为名称。喜欢:

obj.getBehaviorValue("movement", "speed")

obj.setBehaviorValue("movement", "speed", 4)

这样两个行为都可以定义自己的变量,称为速度,而不会发生冲突。这种类型的交叉行为 getter 和 setter 将允许在需要时进行通信。

我建议为此考虑使用脚本语言,如 Lua 或 Python。

关于c# - 游戏架构 - 耦合还是不耦合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1044998/

相关文章:

c# - Azure 代理,请求 IIS 托管 API 时出现 CORS 错误

ios - 如何避免 bool 标志?

c# - 使用 vbs 但不使用 C# 的 SendKey 命令

c# - 在 C# 中将 Xml UTF-8 转换为 ISO-8859-9

c# - 在 C# 中使用原始套接字

architecture - Hyperledger Fabric 上的无限组织

ruby-on-rails - 使用heroku上传文件

c++ - 非阻塞 CORBA C++ 服务器 : how to avoid 100% CPU utilization?

api - 面向任务的用户界面和 Rest 应用服务器 API

c# - EF 非静态方法需要一个目标