蛮牛地址:http://www.manew.com/thread-50564-1-1.html
官方地址:http://unitycodecontrol.com/tutorials/
一下内容根据自身理解,以及原文重新翻译了教程文档。并修复了其中我认为的一些错误。
Code Control MVC框架-发消息
介绍
这篇教程教我们如何使用Code Control的全局消息系统去发送和接收消息。使用它会保持你的类解耦并发动令人激动的 Message Flow可视化监视器!
(这个框架里面实现一些可视化的功能,可以把一些代码或者我们无法洞悉的东西以可视化的方式展现出来,让我们清楚的看到其工作原理,这个消息系统就是其中一个,详细的你可以导入到你的工程中去查看。)
如果这是你第一次使用Code Control我们建议你从第1篇开始读。
Sending a Message 发送一个消息
发送消息可以简单地使用Message类来实现。
public class GameController : Controller<GameModel> {
protected override void OnInitialize() {
// Send a global message
//发送一个全局消息
Message.Send("Hello World!");
}
}
这会使GameController发送一个“Hello World!”的全局消息。他不知道谁正在听这个消息,但这就是解耦的要点所在。不需要知道谁在听!
为什么控制层应该通过一个消息系统来交流?
控制层不需要相互引用来确保它们不是紧耦合。紧耦合意味着彼此之间有大量的依赖。紧密耦合的类是很难理解的并且很难去重构。一个全局的消息系统避免了直接的依赖并保持代码易于改变和理解。尽管全局消息的大问题是不知道哪些类在彼此之间通信。但是幸运地,那就是Code Control的Message Flow监视器派上用场的地方!
Handling a Message 处理消息
发送一个消息如果没有东西在听就没有多大意义了。我们还是再建一个控制器好了,但这一次是要听“Hello World!”消息。
public class WorldController : Controller<WorldModel> {
private void Awake() {
// Listen to the global message and call the OnHelloWorldMessage when it is send
//监听全局消息并在消息被发送的时候调用OnHelloWorldMessage方法
Message.AddListener("Hello World!", OnHelloWorldMessage);
}
private void OnHelloWorldMessage() {
// "Hello World!" has been called!
//“你好,世界!”被调用了!
// Stop listening to the message
//停止监听这个消息
Message.RemoveListener("Hello World!", OnHelloWorldMessage);
}
}
使用AddListener()方法WorldController主动开始监听这个“Hello World!”的消息并在消息发送的时候调用OnHelloWorldMessage()方法。在这个例子里面,WorldController在使用 RemoveListener()方法处理它后立即停止监听“Hello World!”消息。
Custom Messages 自定义消息
有时发送一个字符串类型的消息是不够的,并且更多的值需要被发送。消息类可以派生成一个自定义的类来添加额外的字段。我们一起来看一个例子!
public class ResponseMessage : Message {
public bool IsPositive;
public string Text;
}
ResponseMessage派生自Message类并添加额外的IsPositive和Text字段。WorldController现在可以使用ResponseMessage响应“Hello World!”消息。
public class WorldController : Controller<WorldModel> {
/* Previous code 我是之前的代码*/
private void OnHelloWorldMessage() {
// Instantiate a ResponseMessage
//实例化一个ResponseMessage
ResponseMessage m = new ResponseMessage();
// Assign values to the ResponseMessage's fields
//赋值给ResponseMessage的字段
m.IsPositive = true;
m.Text = "Good morning, GameController!"
// Send the ResponseMessage with its assigned values
//发送被赋值的ResponseMessage
Message.Send<ResponseMessage>(m);
}
}
WorldController实例化一个新的ResponseMessage,给其赋值并发送给任何在听的对象。欧,关于这个……我们来看看GameController是如何监听一个这样的自定义消息吧!
public class GameController : Controller<GameModel> {
/* Previous code 我是之前的代码*/
private void Awake() {
// Listen to the custom global message ResponseMessage and call the OnResponseMessage when it is send
//监听自定义全局消息 ResponseMessage并在它被发送的时候调用 OnResponseMessage
Message.AddListener<ResponseMessage>(OnReponseMessage);
}
private void OnResponseMessage(ResponseMessage m){
// Check if the response is positive
//检查回应是否是肯定的
if (m.IsPositive){
// Stop listening to the OnResponseMessage
//停止监听 OnResponseMessage
Message.RemoveListener<ResponseMessage>(OnResponseMessage);
}
}
}
GameController用AddListener()方法来开始监听所有我们的自定义ResponseMessage消息并使用OnResponseMessage()方法来处理一个发送的消息。在OnResponseMessage()方法里面,第一个参数包含和消息一起被WorldExample设置的值。在这个栗子里面,WorldController检查 ResponseMessage是否是肯定的,并且只有那时才会停止监听。
Conclusion 小结
在这个教程里面我们学会了如何发送和监听消息,并且我们将消息派生成一个可以在里面添加额外的字段自定义类。
本文介绍如何使用CodeControl框架中的全局消息系统发送和接收消息。通过解耦类之间的直接依赖,使得代码更易于理解和维护。同时展示了如何创建自定义消息类来传递更多数据。
458

被折叠的 条评论
为什么被折叠?



