开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2180

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2506|回复: 81

[游戏小猪] 小猪日记,万能的委托框架

[复制链接]  [移动端链接]
5熟悉之中
613/1000
排名
4493
昨日变化
30

8

主题

68

帖子

613

积分

Rank: 5Rank: 5

UID
228559
好友
5
蛮牛币
1430
威望
0
注册时间
2017-6-25
在线时间
247 小时
最后登录
2018-4-26

专栏作家

QQ
发表于 2018-3-17 23:02:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
     额,这次本来是要接着说ab的版本对比,然后差异更新的。但是这几天吃鸡玩的有点上瘾;额。。。。。。   工欲善其事,必先利其器。为了代码的可读性,可扩展性等等等。反正就是你要做个好的东西出来,这些工具类是必不可少的。我们都知道,C#中的委托可以为我们解决很多问题。至于委托是个什么东东,相信很多人都已经知道了,我就我自己的理解简单的说一下;在其他一些语言中,比如说lua中,有个函数的概念,我们C#中叫做方法;在那些语言中,函数属于第一类型值,就相当于一个int , float 这种的东东,他是 function, 函数同样可以和那些int 一样的用法,作为一个参数,一个值取传递;C#中把这个东东更加的抽象话了一点,当我们使用delegate关键字的时候,就声明了一个相当于function的一个类型,然后我们还可以给这个类型自定义一个名字,就有了一个自定义的函数类型。
       int a=0;大家都会;那么自定义的类型的用法同理;( 自定义函数类型)(   变量名 ) =   (具有相同返回值和参数的方法); 是不是一目了然,好了。既然他的用法了解了,那么我每次使用的时候都去生命一个,然后去调用实在是太麻烦了,而且有些方法不可避免的不可以设置为私有的,这样很不安全,还很乱,就像下边这样,如果有几百个的话,那简直就是一个灾难;
    0.png

既然委托就像我们常用的这些类型一样,那么我们是不是可以用一个容器去存储他呢,答案是当然可以了;为了以后方便管理,我专门用一个类来做这件事,那么我们常用的容器类数组显然不行,不合适;列表要根据索引去取,如果我们要维护这个索引那是相当费事的一件事;显然字典更加符合我们的要求,以字符串为key值,以我们的Delegate为value值。维护好一个字典,那么就可以完成所有的委托的添加与调用了;我们事先声明几个不带返回值的,和带返回值的委托,一般参数有三到四个就够用了;
    1.png

  下面我们就可以根据上边自定义的那几个类型,定义一个方法,往字典中放入我们想要调用的方法了;这是不带返回值的添加委托 2.png ,不带返回值的调用委托 3.png ,这里需要注意一下,当我们判断委托不为空的时候,VS会提示我们可以简写;但是在unity5.X的版本中,这种操作是会报错的;当然了,下边就是带返回值的了

4.png


然后就可以很开心的撸代码了;我们耳熟能详的一句话,能不继承MonoBehaviour的就不要继承;所以委托就派上了大用场了呢;我这里这几个代码到目前只继承了一个MonoBehaviour;已经可以在任何没有继承MonoBehaviour的类中调用开启协程,克隆物体了;代码不多,我打包传到附件了,直接拖入就可以用了,也有例子;
        等写完这个AB的以后,下一步打算写TCP的异步连接以及粘包分包。看情况吧,欢迎大家加我扣扣 575566430,加的时候备注   小猪  就可以了,我是一个小菜鸟,有不对的地方,希望及时指正 messenger.zip (286.82 KB, 下载次数: 134, 售价: 1 蛮牛币)
[发帖际遇]: 游戏小猪 捡了钱没交公 蛮牛币 降了 3 . 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
613/1000
排名
4493
昨日变化
30

8

主题

68

帖子

613

积分

Rank: 5Rank: 5

UID
228559
好友
5
蛮牛币
1430
威望
0
注册时间
2017-6-25
在线时间
247 小时
最后登录
2018-4-26

专栏作家

QQ
 楼主| 发表于 2018-3-17 23:04:33 | 显示全部楼层
额,忘记贴代码,失误失误,老想着吃一把鸡,然后睡觉呢;
[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public delegate void CallBack();
public delegate void CallBack<T>(T t);
public delegate void CallBack<T, D>(T t, D d);
public delegate void CallBack<T, D, U>(T t, D d, U u);

public delegate T FuncCallBack<T>();
public delegate T FuncCallBack<T,D>(D t);
public delegate T FuncCallBack<T,D,U>(D t,U d);
public delegate T FuncCallBack<T,D,U,V>(D d,U u,V v);
public delegate T FuncCallBack<T, D, U, V,W>( D d, U u,V v,W w);

public class Messenger
{
    public static Dictionary<string, Delegate> eventTable = new Dictionary<string, Delegate>();

    static void OnListenerAdding(string eventkey, Delegate listenerDelegate)
    {
        if (!eventTable.ContainsKey(eventkey))
        {
            eventTable.Add(eventkey, null);
        }
    }
    public static void AddListener(string eventtype, CallBack handler)
    {
        OnListenerAdding(eventtype, handler);
        eventTable[eventtype] = (eventTable[eventtype] as CallBack) + (handler);
    }

    public static void AddListener<T>(string eventtype, CallBack<T> handler)
    {
        OnListenerAdding(eventtype, handler);
        eventTable[eventtype] = (eventTable[eventtype] as CallBack<T>) + (handler);
    }
    public static void AddListener<T, D>(string eventtype, CallBack<T, D> handler)
    {
        OnListenerAdding(eventtype, handler);
        eventTable[eventtype] = (eventTable[eventtype] as CallBack<T, D>) + (handler);
    }
    public static void AddListener<T, D, U>(string eventtype, CallBack<T, D, U> handler)
    {
        OnListenerAdding(eventtype, handler);
        eventTable[eventtype] = (eventTable[eventtype] as CallBack<T, D, U>) + (handler);
    }
    static void OnBroadcast(string eventtype)
    {
        if (!eventTable.ContainsKey(eventtype))
        {
            Debug.LogError("不包含此监听");
            return;
        }
    }

    public static void Broadcast(string eventtype)
    {
        OnBroadcast(eventtype);
        CallBack callback;
        if (eventTable.ContainsKey(eventtype))
        {
            callback = eventTable[eventtype] as CallBack;
            if(callback!=null)
            callback.Invoke();//如果不为空调用,unity2017以下不可简写
        }
    }
    public static void Broadcast<T>(string eventtype, T t)
    {
        OnBroadcast(eventtype);
        CallBack<T> callback;
        if (eventTable.ContainsKey(eventtype))
        {
            callback = eventTable[eventtype] as CallBack<T>;
            if (callback != null)
                callback.Invoke(t);//如果不为空调用,unity2017以下不可简写
        }
    }
    public static void Broadcast<T, D>(string eventtype, T t, D d)
    {
        OnBroadcast(eventtype);
        CallBack<T, D> callback;
        if (eventTable.ContainsKey(eventtype))
        {
            callback = eventTable[eventtype] as CallBack<T, D>;
            if (callback != null)
                callback.Invoke(t, d);//如果不为空调用,unity2017以下不可简写
        }
    }
    public static void Broadcast<T, D, U>(string eventtype, T t, D d, U u)
    {
        CallBack<T, D, U> callback;
        if (eventTable.ContainsKey(eventtype))
        {
            callback = eventTable[eventtype] as CallBack<T, D, U>;
            if (callback != null)
                callback.Invoke(t, d, u); //如果不为空调用,unity2017以下不可简写
        }
    }
    //==========================  割蛋蛋   上边是无返回值,下边是带返回值  ================================

    public static void AddListener<T>(string eventtype, FuncCallBack<T> handler)
    {
        OnListenerAdding(eventtype, handler);
        eventTable[eventtype] = (eventTable[eventtype] as FuncCallBack<T>) + (handler);
    }

    public static void AddListener<T,D>(string eventtype, FuncCallBack<T,D> handler)
    {
        OnListenerAdding(eventtype, handler);
        eventTable[eventtype] = (eventTable[eventtype] as FuncCallBack<T, D>) + (handler);
    }
    public static void AddListener<T, D,U>(string eventtype, FuncCallBack<T, D,U> handler)
    {
        OnListenerAdding(eventtype, handler);
        eventTable[eventtype] = (eventTable[eventtype] as FuncCallBack<T, D,U>) + (handler);
    }
    public static void AddListener<T, D, U,V>(string eventtype, FuncCallBack<T, D, U,V> handler)
    {
        OnListenerAdding(eventtype, handler);
        eventTable[eventtype] = (eventTable[eventtype] as FuncCallBack<T, D, U, V>) + (handler);
    }

    public static void AddListener<T, D, U, V,W>(string eventtype, FuncCallBack<T, D, U, V,W> handler)
    {
        OnListenerAdding(eventtype, handler);
        eventTable[eventtype] = (eventTable[eventtype] as FuncCallBack<T, D, U, V, W>) + (handler);
    }


    public static T Broadcast<T>(string eventtype)
    {
        OnBroadcast(eventtype);
        FuncCallBack<T> callback;
        T t = default(T);
        if (eventTable.ContainsKey(eventtype))
        {
            callback = eventTable[eventtype] as FuncCallBack<T>;
            if (callback != null)
               t= callback.Invoke();//如果不为空调用,unity2017以下不可简写
        }
        return t;
    }
    public static T Broadcast<T,D>(string eventtype, D d)
    {
        OnBroadcast(eventtype);
        FuncCallBack<T, D> callback;
        T t = default(T);
        if (eventTable.ContainsKey(eventtype))
        {
            callback = eventTable[eventtype] as FuncCallBack<T, D>;
            if (callback != null)
               t= callback.Invoke(d);//如果不为空调用,unity2017以下不可简写
        }
        return t;
    }
    public static T Broadcast<T, D,U>(string eventtype, D d,U u)
    {
        OnBroadcast(eventtype);
        FuncCallBack<T, D,U> callback;
        T t = default(T);
        if (eventTable.ContainsKey(eventtype))
        {
            callback = eventTable[eventtype] as FuncCallBack<T, D, U>;
            if (callback != null)
              t=  callback.Invoke( d ,u);//如果不为空调用,unity2017以下不可简写
        }
        return t;
    }
    public static T Broadcast<T, D, U,V>(string eventtype, D d, U u,V v)
    {
        FuncCallBack<T, D, U,V> callback;
        T t = default(T);
        if (eventTable.ContainsKey(eventtype))
        {
            callback = eventTable[eventtype] as FuncCallBack<T, D, U, V>;
            if (callback != null)
              t=  callback.Invoke( d, u,v); //如果不为空调用,unity2017以下不可简写
        }
        return t;
    }
    public static T Broadcast<T, D, U, V,W>(string eventtype, D d, U u, V v,W w)
    {
        FuncCallBack<T, D, U, V,W> callback;
        T t = default(T);
        if (eventTable.ContainsKey(eventtype))
        {
            callback = eventTable[eventtype] as FuncCallBack<T, D, U, V,W>;
            if (callback != null)
                t = callback.Invoke(d, u, v,w); //如果不为空调用,unity2017以下不可简写
        }
        return t;
    }
}


public class Event
{
    public class Manager
    {
        public const string CloneGameObject = "CloneGameObject";
        public const string StartVersionCompate = "StartVersionCompate";
    }

}
[发帖际遇]: 游戏小猪 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

3偶尔光临
206/300
排名
17399
昨日变化
7

0

主题

123

帖子

206

积分

Rank: 3Rank: 3Rank: 3

UID
266755
好友
0
蛮牛币
11
威望
0
注册时间
2018-1-29
在线时间
51 小时
最后登录
2018-4-26
发表于 2018-3-18 07:07:44 | 显示全部楼层
http://em.cn/raeton_cc2017_5/

回复 支持 反对

使用道具 举报

3偶尔光临
286/300
排名
8554
昨日变化
92

2

主题

58

帖子

286

积分

Rank: 3Rank: 3Rank: 3

UID
9302
好友
1
蛮牛币
373
威望
0
注册时间
2013-12-1
在线时间
108 小时
最后登录
2018-4-26
发表于 2018-3-18 08:47:00 | 显示全部楼层
您可以使用
System.Action
System.Action<>
System.Func<>

回复 支持 反对

使用道具 举报

5熟悉之中
613/1000
排名
4493
昨日变化
30

8

主题

68

帖子

613

积分

Rank: 5Rank: 5

UID
228559
好友
5
蛮牛币
1430
威望
0
注册时间
2017-6-25
在线时间
247 小时
最后登录
2018-4-26

专栏作家

QQ
 楼主| 发表于 2018-3-18 09:22:04 | 显示全部楼层
karsion 发表于 2018-3-18 08:47
您可以使用
System.Action
System.Action

嗯,是的;但是这种通用的工具类里的,我不喜欢用Action这种的,在逻辑里,有个小功能要用到委托了,我才会选择action;谢谢

回复 支持 反对

使用道具 举报

4四处流浪
474/500
排名
7187
昨日变化
1

0

主题

253

帖子

474

积分

Rank: 4

UID
255058
好友
0
蛮牛币
1005
威望
0
注册时间
2017-11-18
在线时间
71 小时
最后登录
2018-4-3
发表于 2018-3-18 09:28:43 | 显示全部楼层
路过看看 感谢分享

回复 支持 反对

使用道具 举报

排名
21738
昨日变化
16

0

主题

19

帖子

46

积分

Rank: 1

UID
271245
好友
0
蛮牛币
74
威望
0
注册时间
2018-3-7
在线时间
10 小时
最后登录
2018-4-3
发表于 2018-3-18 11:18:18 | 显示全部楼层
路过,来看看,谢谢楼主

回复 支持 反对

使用道具 举报

7日久生情
2444/5000
排名
3419
昨日变化
14

0

主题

1749

帖子

2444

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
0
蛮牛币
2309
威望
0
注册时间
2017-7-12
在线时间
319 小时
最后登录
2018-4-26

活力之星

发表于 2018-3-18 12:53:03 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
1676/5000
排名
3700
昨日变化
18

0

主题

1138

帖子

1676

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185339
好友
0
蛮牛币
2429
威望
0
注册时间
2016-11-20
在线时间
194 小时
最后登录
2018-4-26
发表于 2018-3-19 09:20:30 | 显示全部楼层

回复

使用道具 举报

6蛮牛粉丝
1351/1500
排名
3624
昨日变化
20

36

主题

621

帖子

1351

积分

Rank: 6Rank: 6Rank: 6

UID
219600
好友
5
蛮牛币
1899
威望
0
注册时间
2017-4-27
在线时间
344 小时
最后登录
2018-4-26
发表于 2018-3-19 09:21:04 | 显示全部楼层
感谢分享

回复

使用道具 举报

3偶尔光临
280/300
排名
7337
昨日变化
79

0

主题

39

帖子

280

积分

Rank: 3Rank: 3Rank: 3

UID
229891
好友
0
蛮牛币
523
威望
0
注册时间
2017-7-2
在线时间
93 小时
最后登录
2018-4-26
发表于 2018-3-19 09:26:52 | 显示全部楼层
值得学习,继续加油!

回复 支持 反对

使用道具 举报

7日久生情
3376/5000
排名
1714
昨日变化
6

0

主题

1991

帖子

3376

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
94526
好友
0
蛮牛币
1592
威望
0
注册时间
2015-4-22
在线时间
709 小时
最后登录
2018-4-26
发表于 2018-3-19 09:37:51 | 显示全部楼层
感谢楼主分享

回复

使用道具 举报

3偶尔光临
252/300
排名
10617
昨日变化
7

4

主题

37

帖子

252

积分

Rank: 3Rank: 3Rank: 3

UID
185462
好友
1
蛮牛币
1380
威望
0
注册时间
2016-11-21
在线时间
129 小时
最后登录
2018-4-17
发表于 2018-3-19 09:54:01 | 显示全部楼层
mark下,~~~~~~~~~~~~~~~~

回复

使用道具 举报

4四处流浪
314/500
排名
7255
昨日变化
4

0

主题

106

帖子

314

积分

Rank: 4

UID
248343
好友
0
蛮牛币
583
威望
0
注册时间
2017-10-12
在线时间
58 小时
最后登录
2018-4-21
发表于 2018-3-19 09:59:34 | 显示全部楼层
v5v5v5v5v5v5

回复

使用道具 举报

5熟悉之中
954/1000
排名
2900
昨日变化
15

0

主题

255

帖子

954

积分

Rank: 5Rank: 5

UID
136635
好友
0
蛮牛币
884
威望
0
注册时间
2016-2-15
在线时间
263 小时
最后登录
2018-4-26
发表于 2018-3-19 10:14:31 | 显示全部楼层
值得学习,谢谢
[发帖际遇]: hed_tan 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表