游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2332

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

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

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

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

[复制链接]  [移动端链接]
6蛮牛粉丝
1023/1500
排名
2520
昨日变化
28

11

主题

75

帖子

1023

积分

Rank: 6Rank: 6Rank: 6

UID
228559
好友
6
蛮牛币
2371
威望
0
注册时间
2017-6-25
在线时间
381 小时
最后登录
2018-10-21

专栏作家

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, 下载次数: 165, 售价: 1 蛮牛币)
[发帖际遇]: 游戏小猪 捡了钱没交公 蛮牛币 降了 3 . 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1023/1500
排名
2520
昨日变化
28

11

主题

75

帖子

1023

积分

Rank: 6Rank: 6Rank: 6

UID
228559
好友
6
蛮牛币
2371
威望
0
注册时间
2017-6-25
在线时间
381 小时
最后登录
2018-10-21

专栏作家

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偶尔光临
255/300
排名
17048
昨日变化
10

0

主题

153

帖子

255

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

5熟悉之中
790/1000
排名
3297
昨日变化
29

2

主题

76

帖子

790

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1023/1500
排名
2520
昨日变化
28

11

主题

75

帖子

1023

积分

Rank: 6Rank: 6Rank: 6

UID
228559
好友
6
蛮牛币
2371
威望
0
注册时间
2017-6-25
在线时间
381 小时
最后登录
2018-10-21

专栏作家

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
627/1000
排名
5143
昨日变化
73

0

主题

262

帖子

627

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

排名
22113
昨日变化
6

0

主题

20

帖子

50

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

7日久生情
3301/5000
排名
1936
昨日变化
5

0

主题

2122

帖子

3301

积分

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

UID
219676
好友
1
蛮牛币
2412
威望
0
注册时间
2017-7-12
在线时间
513 小时
最后登录
2018-10-20

活力之星

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

回复

使用道具 举报

7日久生情
3166/5000
排名
2319
昨日变化
11

0

主题

2266

帖子

3166

积分

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

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

回复

使用道具 举报

7日久生情
1904/5000
排名
2184
昨日变化
3

44

主题

754

帖子

1904

积分

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

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

回复

使用道具 举报

5熟悉之中
656/1000
排名
3879
昨日变化
7

0

主题

75

帖子

656

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

7日久生情
3767/5000
排名
1310
昨日变化
53

0

主题

2027

帖子

3767

积分

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

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

回复

使用道具 举报

4四处流浪
344/500
排名
10870
昨日变化
6

4

主题

57

帖子

344

积分

Rank: 4

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

回复

使用道具 举报

4四处流浪
318/500
排名
7650
昨日变化
6

0

主题

107

帖子

318

积分

Rank: 4

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

回复

使用道具 举报

6蛮牛粉丝
1461/1500
排名
1954
昨日变化
3

0

主题

375

帖子

1461

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

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

本版积分规则

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