Unity3d 组件驱动设计体系结构-组件之间的通信
我正在使用Unity3D构建一个游戏,我有一个关于如何构建我的角色架构的问题(对于角色,我指的是可以以某种方式与其他对象交互的对象) 因此,我遵循了组件驱动的设计,每个组件负责处理对象的不同方面(例如动画组件、运动组件、攻击者组件等),但我很难决定组件之间应该如何通信。我的想法是:Unity3d 组件驱动设计体系结构-组件之间的通信,unity3d,architecture,components,Unity3d,Architecture,Components,我正在使用Unity3D构建一个游戏,我有一个关于如何构建我的角色架构的问题(对于角色,我指的是可以以某种方式与其他对象交互的对象) 因此,我遵循了组件驱动的设计,每个组件负责处理对象的不同方面(例如动画组件、运动组件、攻击者组件等),但我很难决定组件之间应该如何通信。我的想法是: 每个对象都有一个组件管理器,用于保存附着在对象上的每个组件的引用。组件通过组件管理器的引用相互通信 每个组件负责保存自己的引用,并处理内部通信。我能想到的缺点是,多个组件将持有相同的引用 使用自动消息传递系统处理通信
void OnPlayerDamagedCommon() {
bool damaged = PlayerDefense.OnPlayerDamaged();
PlayerUI.OnPlayerDamaged(damaged);
}
但是,在不同对象之间通信时,事件将非常有用。例如,当执行攻击时,玩家可以触发OnAttack
事件,所有订阅此事件的敌人都可以相应地响应。此外,任何类型的实体都可以订阅事件。成为敌人、NPC或环境目标。这将使行为逻辑更容易本地化
还可以使用接口将一个对象添加到另一个对象的处理列表中
class Enemy : IShootable {
void Enemy() {
playerManager.AddToShootable(this);
public void OnShoot() {...}
}
}
class PlayerAttack {
void OnShoot () {
foreach(IShootable s in _shootableList) {
if(CheckRaycast(s))
{
s.OnShoot()
}
}
}
}
这有助于对代码进行本地化,以确定一个敌人是否被击中到了一个地方,而不是每个敌人都有自己的光线投射检查代码,如果您使用的是事件,则会出现这种情况实际上没有。我想我只是想得太多了,因为这是我第一次使用这种设计架构。非常感谢你的回答!很乐意帮忙,别担心,谅解会及时到来的。既然你是新来的,请允许我向你表示欢迎。请注意,如果您想了解Stackoverflow是如何在帮助中心工作的,您可以在帮助中心阅读更多信息:@ρωττόκρτττιτταλλλλιανάτος,如果您是Unity的新手,此链接可能对您很有用,它概述了Unity的生命周期方法,例如在游戏引擎中调用时启动和更新。非常感谢你的回复,真的很有帮助!很乐意帮忙。:)