C#中的委托与游戏中的运用
作者:网络转载 发布时间:[ 2016/3/31 11:19:10 ] 推荐标签:.NET 测试开发技术
这里也讨论一下观察者模式的优缺点:
a.观察者模式在订阅者和发布者之间建立一个抽象的耦合。发布者只知道一个订阅者列表。抽象了具体的发布者和订阅者,减少了二者之间的耦合性;
b.观察者模式支持广播通讯。发布者回想所有登记的订阅者发出通知。
c.如果一个发布者有很多直接或间接的订阅者,将所有的订阅者通知到会花费一定的时间;
d.如果发布者和订阅者之间有依赖循环的话会导致系统崩溃;
e.订阅者虽然知道发布者发生了变化,但是不知道对方是如何发生变化的.
4.游戏中委托的使用
游戏中的一些消息机制是通过委托来实现的,以游戏中属性变化为例,在界面的声明周期开始,我们调用:sysTem.AddUIListener(DgMsgID.NetRes_Profile,OnProfile);为我们的委托字典对应的键上添加一个响应方法;
在界面的生命周期结束时,我们调用:Messenger.RemoveListener(DgMsgID.NetRes_Profile,OnProfile);将我们的委托字典上对应键上的该方法移除。
当我们从服务器接收到的数据更新了角色属性时,则会广播该消息,调用委托字典上该键上所添加的所有方法:Messenger.Broadcast<PlayerProfile>(DgMsgID.DgMsg_UpDatePlayerProfile,response.profile);
而在Messenger类中上述方法的实现其实是添加、伤处、调用委托字典上的对应键上添加的方法。
另外一个典型应用是NGUI定义的UIEventListener类,该类中定义了很多自定义委托,用于处理UI的各种操作响应,如:
publicdelegatevoidVoidDelegate(GameObjectgo);
publicdelegatevoidBoolDelegate(GameObjectgo,boolstate);
publicUIEventListener.VoidDelegateonClick;
publicUIEventListener.BoolDelegateonPress;
voidOnClick(){if(onClick!=null)onClick(gameObject);}
voidOnPress(boolisPressed){if(onPress!=null)onPress(gameObject,isPressed);}
使用时也很简单,如:
UIEventListener.Get(targetObj).onPress+=onPressHandler;
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。

sales@spasvo.com