【问题标题】:How to send events in a frame model?如何在框架模型中发送事件?
【发布时间】:2012-08-16 23:00:51
【问题描述】:

我们有一个框架模型和其中的许多组件。在几乎每个框架上,几乎每个组件的 Update() 函数都由框架模型控制器调用(比如 Unity3d 和所有发生的事情,都发生在一个线程中)。我们有 "Targets" 的组件,它们改变了其中的一些属性(例如位置)并希望提高其他组件 - "Consumers"(例如导弹)关于这个事实。

如果我们使用普通的 C# 事件模型和来自 "Targets" 的“引发”事件,我们将得到非常长的 Update 调用。一个可以冻结我们所有基于框架的应用程序。所以我们不能像我们想要的那样真正使用 C# 事件。

我们做了什么:对于每个"Consumer" 组件,我们订阅"Targets" 事件,其操作将所有新数据推送到列表中,在"Component" 更新调用上,我们遍历新数据列表并进行更新。

所以我的问题是:有没有一种方法可以概括这种方法(例如,如果我们不仅希望目标影响我们的导弹,而且还希望 "winds" 有自己的传入数据(例如方向和温度))来编写代码好看吗?

在框架模型中发送事件有更正确的方法吗?

【问题讨论】:

    标签: c# .net unity3d


    【解决方案1】:

    如果我理解正确,您现在正在使用修改后的观察者模式。 Targets 然后是 主题 观察更改或发布者。 ConsumerObserver 接口,声明了通知方法,订阅者。如果您现在将观察者功能提取到一个单独的类中,其他类可以从中受益:

    // info to send to all active missiles
    public class MissileInfoMessage { }
    
    // all missile classes should implement:
    public interface MissileInfoSubscriber {
        void Notify (MissileInfoMessage msg);
    }
    
    public class MissileInfoBroker {
        List<MissileInfoSubscriber> missileInfoSubscribers;
        // targets, winds, airplanes calls this to get all missiles notified
        public void NotifyMissiles (MissileInfoMessage msg) {
            foreach (MissileInfoSubscriber missile in missileInfoSubscribers) {
                missile.Notify (msg);
            }
        }
        // missiles register when they got fired
        public void Register (MissileInfoSubscriber s) {
            missileInfoSubscribers.Add (s);
        }
        // and deregister if their job is done
        public void Unregister (MissileInfoSubscriber s) {
            missileInfoSubscribers.Remove (s);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-06
      • 2011-03-30
      • 2015-02-04
      • 2021-05-17
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多