• 外国人就医计划示范医院授牌 天津医院泰达医院获认定 2019-07-21
  • 文体 —频道 春城壹网 七彩云南 一网天下 2019-07-18
  • 【理上网来喜迎十九大】苏格:习近平总书记外交思想领航中国特色大国外交 2019-07-18
  • 8种家居环境很败“性” 2019-06-28
  • 2018年全军院校招生计划下达:计划招收学员3.05万名 2019-06-15
  • 晋城市举办干部素质提升工程第十八期专题讲座 2019-06-15
  • 抖音广告出现对英烈邱少云不敬内容 今日头条致歉 2019-06-13
  • 超半数巴西民众对世界杯不感兴趣--旅游频道 2019-06-12
  • 外交部举行中外媒体吹风会:王毅介绍上合组织青岛峰会情况 2019-06-12
  • 2018网络中国节·端午 2019-06-04
  • 韩媒:韩美商定暂停原定8月“乙支自由卫士”联演 2019-06-03
  • 重庆市公安局交通管理局互联网交通安全服务管理平台 2019-06-03
  • 俄侦察船穿越英吉利海峡 英国急派军舰战机监视 2019-05-28
  • 网购陷阱多 女子花3000元买5套化妆品只有2套是真的 2019-05-28
  • 环保约谈濂溪区主要负责同志 谢一平要求立行立改真抓真改 2019-05-25
  • 南粤36选7更新开奖结果: DevTips Unity简易请求系统

    67
    回复
    15572
    查看
    [ 复制链接 ]
    排名
    9776
    昨日变化

    福建36选7和值走势图 www.00-na.com 263

    主题

    301

    帖子

    1602

    积分

    Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

    UID
    159865
    好友
    9
    蛮牛币
    3981
    威望
    0
    注册时间
    2016-8-1
    在线时间
    626 小时
    最后登录
    2018-3-8

    蛮牛译员

    2017-11-2 11:06:42 显示全部楼层 阅读模式

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

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

    x
    在使用多场景进行游戏开发时,我总是发现需要获取由另一个场景中建立的系统提供的一些值或对象。 像信号系统一样,我想要一个类似的系统,我可以在不知道提供者的类型的情况下查询值。

    当我在Reddit上发布信号系统时,有人指向我这个博客文章,其中描述了一个解决同样问题的类似系统。 我不得不承认,我认为这是很好的的办法。 我所喜欢的是这样的方法甚至对它的参数是安全的。 重构这个系统的确会好多了。

    我想到了这一点,我意识到我可以建立一个具有相同目标的查询系统 - 类型安全。 我做了一个,我想我会从现在开始使用这个游戏。 如果你要使用这个代码,我必须提醒你,与我一直在使用的较旧的查询系统相比,这不是一回事。 所以请谨慎使用。


    用法
    我将从如何使用它开始。 有三个实体与系统进行交互。 这些是查询请求,查询请求者和查询提供者。 请求者和提供者可以在同一个场景或不同的场景中。 查询请求只不过是一个保存请求参数的类。 这是一个示例请求:
    [C#] 纯文本查看 复制代码
    public class TestRequest : QueryRequest {
        private readonly int intParam;
        private readonly string stringParam;
        public TestRequest(int intParam, string stringParam) {
            this.intParam = intParam;
            this.stringParam = stringParam;
        }
        public int IntParam {
            get {
                return intParam;
            }
        }
        public string StringParam {
            get {
                return stringParam;
            }
        }
    }


    这里的TestRequest是一个具有两个参数的不可变类。 一个实际的游戏查询请求类可能有更多的参数。

    参数提供者的寄存如下所示:
    [C#] 纯文本查看 复制代码
    public class QueryManagerTestProvider : MonoBehaviour {
        private void Awake() {
            QueryManager.RegisterProvider<TestRequest, GameObject>(TestProvider);
        }
        private GameObject TestProvider(TestRequest request) {
            // Log the parameters just to show that they are passed
            Debug.Log("intParam: " + request.IntParam);
            Debug.Log("stringParam: " + request.StringParam);
            return this.gameObject;
        }
    }


    单提供者只是示例,以便他们可以很容易地写入。 单个MonoBehaviour或类可以注册多个提供着。

    示例查询请求将如下所示:
    [C#] 纯文本查看 复制代码
    public class QueryManagerTestRequester : MonoBehaviour {
        private void Start() {
            GameObject result = QueryManager.Query<TestRequest, GameObject>(new TestRequest(77, "Hello Query Manager"));
            Debug.Log("result: " + result.gameObject.name);
        }
    }


    将它们放在一起就会有如下的结果:
    querymanagerresult.png


    在我的测试中,QueryManagerTestProvider和QueryManagerTestRequester放置在不同的场景中,以便我可以验证它是否适用于这样的设置。 本质上,我在这里所做的是能够检索来自不同场景的GameObject。


    框架代码
    让我们从基类QueryRequest开始:

    [C#] 纯文本查看 复制代码
    public abstract class QueryRequest {
    }


    是的,就是这样。 它只是用作所有请求类的常用类型。 稍后可以看到它的用法。 为什么不是界面? 目的是让用户制作轻量级的单独的请求类。 这样可以防止还可以充当查询请求的大类或MonoBehaviour类。

    接下来是QueryManagerImplementation类,它将是静态类QueryManager在内部使用的类。 看起来像这样:
    [C#] 纯文本查看 复制代码
    class QueryManagerImplementation {
        private delegate object QueryProvider(QueryRequest request); // The internal delegate that we manage
        private Dictionary<Type, QueryProvider> providerMap = new Dictionary<Type, QueryProvider>();
        public QueryManagerImplementation() {
        }
        public void RegisterProvider<R, V>(QueryManager.QueryProvider<R, V> provider) where R : QueryRequest {
            Type type = typeof(R);
            Assertion.Assert(!this.providerMap.ContainsKey(type)); // Should not contain the provider for a certain request yet
            // Make the internal delegate which invokes the generic delegate
            QueryProvider internalProvider = delegate (QueryRequest request) {
                return provider((R)request);
            };
            this.providerMap[type] = internalProvider;
        }
        public bool HasProvider<R>() where R : QueryRequest {
            return this.providerMap.ContainsKey(typeof(R));
        }
        public V Query<R, V>(R request) where R : QueryRequest {
            Type type = typeof(R);
            // Invoke the provider
            // This will throw an error if a provider does not exist
            return (V)this.providerMap[type](request);
        }
    }


    提供者简单地保存在字典中,其中键是请求的类型。 这些方法是自我解释的。 通用标识符R表示请求者类型,V表示结果值的类型。 请注意QueryRequest在这里用作R的限定符,限制可以传递哪些类类型。

    最后,静态QueryManager类看起来像这样:
    [C#] 纯文本查看 复制代码
    public static class QueryManager {
        public delegate V QueryProvider<R, V>(R request) where R : QueryRequest;
        private static readonly QueryManagerImplementation INTERNAL_MANAGER = new QueryManagerImplementation();
        public static void RegisterProvider<R, V>(QueryProvider<R, V> provider) where R : QueryRequest {
            INTERNAL_MANAGER.RegisterProvider(provider);
        }
        public static bool HasProvider<R>() where R : QueryRequest {
            return INTERNAL_MANAGER.HasProvider<R>();
        }
        public static V Query<R, V>(R request) where R : QueryRequest {
            return INTERNAL_MANAGER.Query<R, V>(request);
        }
    }



    注意事项
    像信号一样,调用查询请求比直接调用提供程序方法要慢。 注意不要在Update()或者在循环中重复调用的部分中使用它。 缓存结果如果可以的话。

    这个系统的另一个缺点是垃圾。 每次你想要查询一个值,你可以实例化一个请求类,特别是如果它是不可变的。 虽然这可以通过使请求类可变并且仅维护它的一个实例来缓解,然后重用该实例进行查询。 另一种方式是使用工厂设计模式进行请求实例。




    原文标题:Simple Query System


    5熟悉之中
    800/1000
    排名
    5235
    昨日变化

    3

    主题

    237

    帖子

    800

    积分

    Rank: 5Rank: 5

    UID
    243817
    好友
    1
    蛮牛币
    712
    威望
    0
    注册时间
    2017-9-16
    在线时间
    286 小时
    最后登录
    2019-6-26
    2017-11-2 11:32:59 显示全部楼层
    受教了,感谢楼主分享
    5熟悉之中
    916/1000
    排名
    2736
    昨日变化

    0

    主题

    171

    帖子

    916

    积分

    Rank: 5Rank: 5

    UID
    224879
    好友
    1
    蛮牛币
    1412
    威望
    0
    注册时间
    2017-6-2
    在线时间
    214 小时
    最后登录
    2018-11-29
    2017-11-2 11:41:18 显示全部楼层
    谢谢楼主分享。。。。
    6蛮牛粉丝
    1410/1500
    排名
    2128
    昨日变化

    0

    主题

    333

    帖子

    1410

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    228538
    好友
    11
    蛮牛币
    3371
    威望
    0
    注册时间
    2017-6-24
    在线时间
    425 小时
    最后登录
    2019-7-10
    2017-11-3 09:34:11 显示全部楼层
    受教了 感谢分享
    7日久生情
    4402/5000
    排名
    2320
    昨日变化

    5

    主题

    3108

    帖子

    4402

    积分

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

    UID
    209186
    好友
    5
    蛮牛币
    1166
    威望
    0
    注册时间
    2017-3-1
    在线时间
    677 小时
    最后登录
    2019-7-19
    2017-11-3 11:27:20 显示全部楼层
    谢谢分享
    5熟悉之中
    775/1000
    排名
    3900
    昨日变化

    9

    主题

    122

    帖子

    775

    积分

    Rank: 5Rank: 5

    UID
    232340
    好友
    0
    蛮牛币
    112
    威望
    0
    注册时间
    2017-7-15
    在线时间
    260 小时
    最后登录
    2019-7-17
    2017-11-5 09:40:14 显示全部楼层
    受教了,刚入门,虽然没看懂,但已收藏,能力提高了再来细研究
    排名
    34886
    昨日变化

    0

    主题

    12

    帖子

    24

    积分

    Rank: 1

    UID
    196822
    好友
    0
    蛮牛币
    23
    威望
    0
    注册时间
    2016-12-28
    在线时间
    4 小时
    最后登录
    2017-11-8
    2017-11-8 10:57:04 显示全部楼层
    感谢分享经验
    5熟悉之中
    765/1000
    排名
    5364
    昨日变化

    20

    主题

    350

    帖子

    765

    积分

    Rank: 5Rank: 5

    UID
    249218
    好友
    3
    蛮牛币
    2772
    威望
    0
    注册时间
    2017-10-17
    在线时间
    121 小时
    最后登录
    2019-7-3
    2017-11-14 08:35:37 显示全部楼层
    Unity简易请求系统 [修改]
    6蛮牛粉丝
    1078/1500
    排名
    2055
    昨日变化

    0

    主题

    114

    帖子

    1078

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    252416
    好友
    0
    蛮牛币
    1959
    威望
    0
    注册时间
    2017-11-3
    在线时间
    294 小时
    最后登录
    2019-7-21
    2017-11-14 09:31:33 显示全部楼层
    6666666666666
    6蛮牛粉丝
    1210/1500
    排名
    2332
    昨日变化

    1

    主题

    167

    帖子

    1210

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    236305
    好友
    1
    蛮牛币
    1660
    威望
    0
    注册时间
    2017-8-7
    在线时间
    434 小时
    最后登录
    2019-7-19
    2017-11-14 13:50:16 显示全部楼层
    感谢分享
    3偶尔光临
    159/300
    排名
    12478
    昨日变化

    0

    主题

    22

    帖子

    159

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    229624
    好友
    0
    蛮牛币
    352
    威望
    0
    注册时间
    2017-6-30
    在线时间
    65 小时
    最后登录
    2018-9-19
    2017-11-16 19:02:00 显示全部楼层
    等分第三方啊未施粉黛
    5熟悉之中
    562/1000
    排名
    4830
    昨日变化

    1

    主题

    112

    帖子

    562

    积分

    Rank: 5Rank: 5

    UID
    79201
    好友
    0
    蛮牛币
    1334
    威望
    0
    注册时间
    2015-3-12
    在线时间
    145 小时
    最后登录
    2019-4-15
    2017-11-20 20:59:35 显示全部楼层
    多谢分享
    7日久生情
    2880/5000
    排名
    2524
    昨日变化

    2

    主题

    1849

    帖子

    2880

    积分

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

    UID
    241666
    好友
    0
    蛮牛币
    10773
    威望
    0
    注册时间
    2017-9-6
    在线时间
    453 小时
    最后登录
    2019-1-31
    2017-11-27 09:21:33 来自Mobile--- 显示全部楼层
    感谢分享
    7日久生情
    2880/5000
    排名
    2524
    昨日变化

    2

    主题

    1849

    帖子

    2880

    积分

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

    UID
    241666
    好友
    0
    蛮牛币
    10773
    威望
    0
    注册时间
    2017-9-6
    在线时间
    453 小时
    最后登录
    2019-1-31
    2017-11-27 09:30:37 来自Mobile--- 显示全部楼层
    感谢分享
    3偶尔光临
    286/300
    排名
    17381
    昨日变化

    0

    主题

    203

    帖子

    286

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    254038
    好友
    0
    蛮牛币
    173
    威望
    0
    注册时间
    2017-11-13
    在线时间
    45 小时
    最后登录
    2019-5-27
    2017-11-27 22:07:42 显示全部楼层

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

    本版积分规则

  • 外国人就医计划示范医院授牌 天津医院泰达医院获认定 2019-07-21
  • 文体 —频道 春城壹网 七彩云南 一网天下 2019-07-18
  • 【理上网来喜迎十九大】苏格:习近平总书记外交思想领航中国特色大国外交 2019-07-18
  • 8种家居环境很败“性” 2019-06-28
  • 2018年全军院校招生计划下达:计划招收学员3.05万名 2019-06-15
  • 晋城市举办干部素质提升工程第十八期专题讲座 2019-06-15
  • 抖音广告出现对英烈邱少云不敬内容 今日头条致歉 2019-06-13
  • 超半数巴西民众对世界杯不感兴趣--旅游频道 2019-06-12
  • 外交部举行中外媒体吹风会:王毅介绍上合组织青岛峰会情况 2019-06-12
  • 2018网络中国节·端午 2019-06-04
  • 韩媒:韩美商定暂停原定8月“乙支自由卫士”联演 2019-06-03
  • 重庆市公安局交通管理局互联网交通安全服务管理平台 2019-06-03
  • 俄侦察船穿越英吉利海峡 英国急派军舰战机监视 2019-05-28
  • 网购陷阱多 女子花3000元买5套化妆品只有2套是真的 2019-05-28
  • 环保约谈濂溪区主要负责同志 谢一平要求立行立改真抓真改 2019-05-25