• 党建第一责任与发展第一要务相融合br全面提升机关党建工作水平 2019-05-22
  • 卡纳瓦罗:对比赛结果不满意 晋级机会各占一半 2019-05-22
  • 天津宣讲十九大:津沽大地舞春风,小康路上添豪情 2019-05-21
  • 酱香酒为什么要在端午时节制曲微生物 酒曲 2019-05-20
  • 回复@艾鸣1:你看强坛除了小寻子这种跟你一样老蚕的人之外,有人会有人敢支持你么? 2019-05-15
  • 中国经济稳中向好的发展态势没有变 2019-05-14
  • 私扫码付不加控制党政和人行国有银行国有企业自动退出历史舞台 2019-05-11
  • 你真没一点脑子,文字是哪个人的,你到说说啊 2019-05-04
  • 黎明华丽转身成监制 他给四川金丝猴拍了部动画片 2019-05-04
  • 候选案例:爱在华住滇西北宿改工程 2019-05-02
  • 山西寿阳:竹马戏演员的台前幕后 2019-04-26
  • 96次航拍峨眉 换个角度看巴蜀名山 中国国家地理网 2019-04-23
  • 俄罗斯电影《最后一球》定档落魄球星遇上菜鸟球队 2019-04-21
  • 【理上网来·辉煌十九大】缅甸资深媒体人高度评价习近平十九大报告:立意高远 内涵丰富 2019-04-21
  • 特朗普和金正恩先后抵达嘉佩乐酒店 会晤即将开始 2019-04-17
  • 福建体彩31选7今日开奖: DevTips Unity简易请求系统

    67
    回复
    14943
    查看
    打印 上一主题 下一主题
    [ 复制链接 ]
    排名
    9775
    昨日变化

    福建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

    蛮牛译员

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

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

    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);
        }
    }


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



    在我的测试中,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熟悉之中
    782/1000
    排名
    5234
    昨日变化

    3

    主题

    231

    帖子

    782

    积分

    Rank: 5Rank: 5

    UID
    243817
    好友
    1
    蛮牛币
    657
    威望
    0
    注册时间
    2017-9-16
    在线时间
    274 小时
    最后登录
    2019-3-11
    沙发
    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蛮牛粉丝
    1379/1500
    排名
    2128
    昨日变化

    0

    主题

    326

    帖子

    1379

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    228538
    好友
    11
    蛮牛币
    3302
    威望
    0
    注册时间
    2017-6-24
    在线时间
    401 小时
    最后登录
    2019-5-22
    地板
    2017-11-3 09:34:11 只看该作者
    受教了 感谢分享
    7日久生情
    4393/5000
    排名
    2320
    昨日变化

    5

    主题

    3109

    帖子

    4393

    积分

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

    UID
    209186
    好友
    5
    蛮牛币
    1148
    威望
    0
    注册时间
    2017-3-1
    在线时间
    666 小时
    最后登录
    2019-5-14
    5#
    2017-11-3 11:27:20 只看该作者
    谢谢分享
    5熟悉之中
    743/1000
    排名
    3900
    昨日变化

    9

    主题

    121

    帖子

    743

    积分

    Rank: 5Rank: 5

    UID
    232340
    好友
    0
    蛮牛币
    202
    威望
    0
    注册时间
    2017-7-15
    在线时间
    229 小时
    最后登录
    2019-5-22
    6#
    2017-11-5 09:40:14 只看该作者
    受教了,刚入门,虽然没看懂,但已收藏,能力提高了再来细研究
    排名
    34883
    昨日变化

    0

    主题

    12

    帖子

    24

    积分

    Rank: 1

    UID
    196822
    好友
    0
    蛮牛币
    23
    威望
    0
    注册时间
    2016-12-28
    在线时间
    4 小时
    最后登录
    2017-11-8
    7#
    2017-11-8 10:57:04 只看该作者
    感谢分享经验
    5熟悉之中
    764/1000
    排名
    5363
    昨日变化

    20

    主题

    350

    帖子

    764

    积分

    Rank: 5Rank: 5

    UID
    249218
    好友
    3
    蛮牛币
    2764
    威望
    0
    注册时间
    2017-10-17
    在线时间
    120 小时
    最后登录
    2019-5-16
    8#
    2017-11-14 08:35:37 只看该作者
    Unity简易请求系统 [修改]
    6蛮牛粉丝
    1051/1500
    排名
    2055
    昨日变化

    0

    主题

    114

    帖子

    1051

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    252416
    好友
    0
    蛮牛币
    1779
    威望
    0
    注册时间
    2017-11-3
    在线时间
    267 小时
    最后登录
    2019-5-22
    9#
    2017-11-14 09:31:33 只看该作者
    6666666666666
    6蛮牛粉丝
    1184/1500
    排名
    2332
    昨日变化

    1

    主题

    164

    帖子

    1184

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    236305
    好友
    1
    蛮牛币
    1681
    威望
    0
    注册时间
    2017-8-7
    在线时间
    412 小时
    最后登录
    2019-5-22
    10#
    2017-11-14 13:50:16 只看该作者
    感谢分享
    3偶尔光临
    159/300
    排名
    12477
    昨日变化

    0

    主题

    22

    帖子

    159

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    229624
    好友
    0
    蛮牛币
    352
    威望
    0
    注册时间
    2017-6-30
    在线时间
    65 小时
    最后登录
    2018-9-19
    11#
    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
    12#
    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
    13#
    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
    14#
    2017-11-27 09:30:37 来自Mobile--- 只看该作者
    感谢分享
    3偶尔光临
    284/300
    排名
    17380
    昨日变化

    0

    主题

    203

    帖子

    284

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    254038
    好友
    0
    蛮牛币
    171
    威望
    0
    注册时间
    2017-11-13
    在线时间
    43 小时
    最后登录
    2019-5-22
    15#
    2017-11-27 22:07:42 只看该作者

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

    本版积分规则

  • 党建第一责任与发展第一要务相融合br全面提升机关党建工作水平 2019-05-22
  • 卡纳瓦罗:对比赛结果不满意 晋级机会各占一半 2019-05-22
  • 天津宣讲十九大:津沽大地舞春风,小康路上添豪情 2019-05-21
  • 酱香酒为什么要在端午时节制曲微生物 酒曲 2019-05-20
  • 回复@艾鸣1:你看强坛除了小寻子这种跟你一样老蚕的人之外,有人会有人敢支持你么? 2019-05-15
  • 中国经济稳中向好的发展态势没有变 2019-05-14
  • 私扫码付不加控制党政和人行国有银行国有企业自动退出历史舞台 2019-05-11
  • 你真没一点脑子,文字是哪个人的,你到说说啊 2019-05-04
  • 黎明华丽转身成监制 他给四川金丝猴拍了部动画片 2019-05-04
  • 候选案例:爱在华住滇西北宿改工程 2019-05-02
  • 山西寿阳:竹马戏演员的台前幕后 2019-04-26
  • 96次航拍峨眉 换个角度看巴蜀名山 中国国家地理网 2019-04-23
  • 俄罗斯电影《最后一球》定档落魄球星遇上菜鸟球队 2019-04-21
  • 【理上网来·辉煌十九大】缅甸资深媒体人高度评价习近平十九大报告:立意高远 内涵丰富 2019-04-21
  • 特朗普和金正恩先后抵达嘉佩乐酒店 会晤即将开始 2019-04-17