首页 > 代码库 > uFrame 1.6 官方文档随意翻译(二)

uFrame 1.6 官方文档随意翻译(二)

事件系统:

  OnEvent使用例子

  1. 传送数据(同时也会new event(其实是一个类)) 好像要自己去定义事件在哪执行什么时候执行。对的,要在一个地方使用publish去执行这个事件的代码。Publish时也会new simpleclass.

简单来说OnEvent的意思是在某个event(但同时event是一个simpleclass,可以用来传送数据)上执行一些代码,然后可以通过Publish去发布执行。

  技术分享

  2. Default Events 可以订阅,但要注意执行顺序

  技术分享

技术分享


 Commands

         Commands分两种,一种是节点,一种是Element的Commands。这里主要讲第一种。

         Commands是一个简单的可带有数据的类,你可以通过publish一个”command”去做一些事。例如,LoadSceneCommand允许你通过这个命令指定的属性去加载场景。

         在一些方面,Commands和Events是一样的。他们不同点在于他们的目的。Events是对事件的触发处理通知,Commands是触发一些行为。

  Subscribing to Commands

         Commands和Event Aggregator一起工作的。你可以使用OnEvent方法订阅一个command(在Service和继承了uFrameComponent的类中有效)

  Publishing Commands

         使用Publish方法执行一个命令。

  Default Commands

    LoadSceneCommand

    InstantiateViewCommand


 

Elements Commands

       Element Commands允许你去改变ViewModel的状态。例子:如果一个玩家受到了伤害,受伤命令被执行并减少玩家生命值。通常ViewModel不能直接被修改,只有通过指定的命令去修改。这就是无论如何ViewModel数据被the View with Scene Properties or Services.直接改变。(大概意思是ViewModel数据只能在View场景属性初始化时和Service时能直接被修改,在View里只能被读和绑定,在Controller里只能改变ViewModel的状态?)

       实际上执行的命令不是存储在ViewModel的内部而是存储在ViewModel的Controller的内部。当一个ViewModel的命令被调用时,这个命令会立即在Controller里执行,然后这个Controller会改变ViewModel的数据触发绑定的View。

      备注:直接在Controller里改变ViewModel数据,所以会有两次OnPropertyChanged被执行。是这个原因么?

   技术分享

  技术分享

 


 

Services

  直接注入Service到其他类中使用会增加耦合,更好的方式是通过事件来通讯。

  Accessing ViewModel

    默认uFrame保存viewmodels(你创建的每一个viewmodels)在一个管理类里。

    为了使用这个管理类,你可以注入他们到控制器类(早已默认生成了一个相关联的ViewModel的管理类属性在里面)和服务类里。

      [Inject] IViewModelManager<PlayerViewModel> AllPlayers { get;set; }

  Accessing Controllers

    [inject] PlayerController PlayerController;


 

System Loaders

       System Loaders负责注册ViewModel和Controller到DI Container给uFrame Kernel加载处理。

       每一个Subsystem节点都有一个Instance字段允许你从其他system注册ViewModel到DI Container里

       默认的Subsystem早已注册所有Elements的Controllers和ViewModelManager

  SystemLoaders

       里面就是负责注册Elements的Controllers和ViewModelManager


 

Controller

       Controller负责在ViewModel后面执行一些逻辑。对于许多ViewModels,Controller都是只有一个实例。对于Element指定的Commands都会在这里执行。Controller也是负责创建和初始化ViewModel的工作。

       实质上,Controller是一个服务类,但是又和服务类有区别(Controller拥有ViewModel)。


常见问题:

  ** Is it possible to call Publish() from some random MonoBehaviour?

  You can inherit your MonoBehaviour from a uFrameComponent to get references to event aggregator and also get callbacks for KernelLoadedEvent and loading events.


  UFrame提供了状态机  json序列化

  要是有需求,也可以自己创建服务类,系统加载类,场景加载类,只要这些类继承对应的基类就可以了。

  uFrame执行顺序XMIND图:https://www.mindmeister.com/571885479?t=F6p1mvLEmJ#

 

uFrame 1.6 官方文档随意翻译(二)