Unity3d 组件驱动设计体系结构-组件之间的通信

Unity3d 组件驱动设计体系结构-组件之间的通信,unity3d,architecture,components,Unity3d,Architecture,Components,我正在使用Unity3D构建一个游戏,我有一个关于如何构建我的角色架构的问题(对于角色,我指的是可以以某种方式与其他对象交互的对象) 因此,我遵循了组件驱动的设计,每个组件负责处理对象的不同方面(例如动画组件、运动组件、攻击者组件等),但我很难决定组件之间应该如何通信。我的想法是: 每个对象都有一个组件管理器,用于保存附着在对象上的每个组件的引用。组件通过组件管理器的引用相互通信 每个组件负责保存自己的引用,并处理内部通信。我能想到的缺点是,多个组件将持有相同的引用 使用自动消息传递系统处理通信

我正在使用Unity3D构建一个游戏,我有一个关于如何构建我的角色架构的问题(对于角色,我指的是可以以某种方式与其他对象交互的对象)

因此,我遵循了组件驱动的设计,每个组件负责处理对象的不同方面(例如动画组件、运动组件、攻击者组件等),但我很难决定组件之间应该如何通信。我的想法是:

  • 每个对象都有一个组件管理器,用于保存附着在对象上的每个组件的引用。组件通过组件管理器的引用相互通信

  • 每个组件负责保存自己的引用,并处理内部通信。我能想到的缺点是,多个组件将持有相同的引用

  • 使用自动消息传递系统处理通信。(事件和侦听器)

  • 我的问题是:有没有更好的方法来处理组件通信? 每种方法的优点或缺点是什么?

    p、 我不是在问统一或特定语言的答案,只是朝着正确的方向稍微推动一下。提前谢谢

    每个对象都有一个组件管理器,用于保存附着在对象上的每个组件的引用

    如果组件继承自MonoBehavior,这已经是可能的。有一个GetComponent()可以从游戏对象中获取组件,它既适用于脚本,也适用于组件

    有没有什么特别的原因让您希望创建自己的管理系统,而不是使用解耦的内置系统

    资料来源:

    每个对象都有一个组件管理器,用于保存对每个对象的引用 附着在对象上的组件。这些组件相互通信 通过组件管理器的引用执行其他操作

    使用自动消息传递系统处理通信。(事件 (观众和听众)

    我得说,在这两者之间进行混合。为每个对象提供组件管理器将非常有用,特别是在将来添加新组件时。只要在manager中为这个新字段创建一个引用字段,就完成了。此外,管理器还可以充当外部实体和管理器组件之间的入口点

    相反,让对象保存自己对其他组件的引用肯定是不好的,因为当新组件出现时,必须在所有组件上指定引用。另外,这可能不会使组件彼此独立工作,因为它们必须在某个时间点访问彼此的函数、属性或变量

    使用事件在同一对象的组件之间进行通信可能不是一个好主意。在某些情况下,您可能需要调用函数并使用其返回值来确定是否继续。例如,假设玩家有机会阻止传入的攻击,并且只有在攻击成功时才应更新玩家UI。你可以这样做

    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的生命周期方法,例如在游戏引擎中调用时启动和更新。非常感谢你的回复,真的很有帮助!很乐意帮忙。:)