排列三排列五周即开奖结果: DevTips Unity简易请求系统

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

排列三2014079期正版藏机图 www.d0po.cn 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熟悉之中
798/1000
排名
5234
昨日变化

3

主题

237

帖子

798

积分

Rank: 5Rank: 5

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

0

主题

328

帖子

1392

积分

Rank: 6Rank: 6Rank: 6

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

5

主题

3108

帖子

4394

积分

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

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

9

主题

122

帖子

759

积分

Rank: 5Rank: 5

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

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蛮牛粉丝
1063/1500
排名
2055
昨日变化

0

主题

114

帖子

1063

积分

Rank: 6Rank: 6Rank: 6

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

1

主题

166

帖子

1192

积分

Rank: 6Rank: 6Rank: 6

UID
236305
好友
1
蛮牛币
1670
威望
0
注册时间
2017-8-7
在线时间
417 小时
最后登录
2019-6-19
10#
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
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偶尔光临
286/300
排名
17380
昨日变化

0

主题

203

帖子

286

积分

Rank: 3Rank: 3Rank: 3

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

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

本版积分规则

  • 兰州彩民收获2018年度甘肃首枚七乐彩头奖 2019-06-19
  • 人民日报人民时评:前进的时代需要英雄 2019-06-18
  • 境外媒体:中国商务部严批美方“反复无常,挑起贸易战” 2019-06-16
  • 水银、煮沸的蚁巢、热熨斗:欧洲人的梅毒抗争史 2019-06-03
  • 咨询成果推介泸州长江生态湿地新城概念性规划 2019-06-03
  • 黄河口,大美之诗文章中国国家地理网 2019-05-30
  • 【人事】中共临汾市委组织部公示3名拟任职干部 2019-05-18
  • 习近平与人民日报那些事 2019-05-10
  • 很多常用药同属一家族 2019-04-30
  • 小牛犊天生两条腿 走起路来像袋鼠 2019-04-30
  • 就因为“阶级亲”,才应把这些难民送到欧洲。欧洲生活水平高呀,让亲人生活的更好。不能让他们到中国受苦受难呀。 2019-04-27
  • 资管新规来了!打破刚兑  投资者怎么办? 2019-04-27
  • 紫光阁中共中央国家机关工作委员会 2019-04-24
  • 图解:习近平主席这12个金句振奋人心! 2019-04-24
  • 您访问的页面找不回来了 2019-04-07
  • 496| 829| 150| 329| 840| 641| 370| 954| 424| 557|