在Unity上进行开发,请先看对其开发模式应用的讨论:

http://www.reddit.com/r/Unity3D/comments/1nb06h/unity_design_patterns_and_concepts_looking_for/

第一个问题,整个程序的入口在哪里。原来框架里的入口是个Scriptobject,用来启动所有的管理器。在uFrame的架构里,设计一个GameManager继承自Monobehaviour,然后利用DontdestroyOnLoad方法在不同的场景之间进行切换。

看看网上的各种讨论,感觉uFrame不如SOC靠谱,后者用的人多,讨论也多,抱着这颗大树吧。

strangeioc提出了一个mvcs的框架,下面这个算是对框架各个部分一个比较清楚的说明

  • Model – “I hold ALL of the data, ha ha ha.”
  • View – “Hey, look at this” (graphics, gui, sound) and “Oh, you clicked the mouse” (input), “Either way I’ll tell the controller about it”.
  • Controller – “Hey Model (or Service), someone clicked a button so do X or Y”, or “Service, you loaded? Ok, I’ll tell the model”, or “Thanks Model for the updated data, I’ll tell the view to show that”.
  • Services – “Welcome everyone, I’m going to just load stuff from offline files and online servers and tell the controller”.

描述一个最基本的业务流程:

1.玩家点击了一下UI

2.mediator得到通知(回调),因为它绑定了UI事件

3.mediator触发了一次command执行指令,因为mediator和command进行了绑定

4.command执行自己的execute方法

5.请求Service从一个文件中读取数据

6.Service读取数据完成后,触发事件通知Command执行execute函数。

7.command会把加载后的数据送给Model

8.Model检测到自己更新数据后,通知mediator说有新数据来了

9.Mediator就会把数据送给UI,显示到界面上。

原则:

View应该只负责显示和输入,当输入事件发生时,view应当通知mediator,绝不能让View直接通知给Model和Service,View只会分发事件,例如某个按钮按下了,至于对这个按钮的响应,应该交给Mediator来做,例如view告知说帮助按钮按下了,mediator知道后,调用具体的command再去执行具体的任务。Model和Service是被Command来使用的,而不会去监听view的事件。

StrangeIOC的例子

程序的入口是一个ContextView脚本,此脚本是个mb必须要挂在gameobject上,这应该也是命名带上view的意思。这个ContextView里一般就是创建Context。

Context的功能把各个部分组合到了一起 。

分析一个StrangeRocks的例子

入口。此例子实现了类似飞行射击类的游戏。分成了三个部分,入口,游戏模块,UI,对应设计了三个场景,分别是main,game,ui,存放在Art的Scene目录下。每个场景里都有一个节点,挂的是重写的contextview脚本,分别是MainBootstrap,GameBootstrap,UIBootstrap.继承关系如图:

这其中每一个contextview脚本里都创建了一个context对象,分别是MainContext,GameContext,UIContext。这几个类的集成关系如图:

其中,crosstext可作为全局的定义,其他context可以访问到。CrossContext里将会给ICrossContextInjectionBinder类型的变量 injectionBinder赋值。MVCSContext具备了搭建一个IOC应用的所有元素,包括( an Injector)注入器,(a message bus)消息总线,(Command

patterns)命令模式,(model and service support)模型支持,(View mediation)视图中转器等。

三个继承的context ,都会重写mapBindings函数。

1.MainContext里,会绑定全局的事件,绑定数据模型gamemodel为单件。

2.GameContext里,会绑定键盘输入为单件,绑定精灵管理器,绑定技能管理器,定义了游戏过程中用到的各种池对象,包括特效,武器,精灵等。

随后commandBinder,这里用的是SignalCommandBinder,来源于SignalContext的addCoreComponents方法里,把injectionBinder的ICommandBinder绑定为了SignalCommandBinder,这种binder就会把各种事件和对应的command执行器进行绑定。注意,这个command bind将会自动创建注入映射。最后是mediationBinder,用的是MediationBinder, 这个具体对象的绑定来源于MVCSContext的addCoreComponents方法,mediator的绑定将view和mediator结合到了一起。这就是说,context知道所有的细节,mediator不知道的,view不知道的,它都知道。

如何实现bind map to注入,有如下函数段:

其中command的注入过程是动态的,不是在bind的时候就绑定的,这样也好理解,因为有可能我这个事件永远不会发生,那就不需要绑定了:

尝试实现精灵:

可以参考实现精灵的数据对象,例如ISpriteModel包含一个精灵需要的各种数据,包括血量,等级各种东西。然后是精灵的显示对象,ISpriteView,这个view的作用是管理显示相关的逻辑,即所有看得见的东西,例如移动,播放动画,换装,武器挂载,特效挂载,所有跟monobehaviour相关的,而Mecanim相关的事件必然是和gameobject相关的,所以必然是View相关的,gameobject上接收的所有事件都由View来接受,显然这和他相关,是显示。而比如当到达某个关键帧,需要触发特效,让view通知mediator再通知到controller,执行一次command。controller是个中转环节,可以知道model,view,service等各种东西。这样一来有可能就会设计的很复杂。command会有很多个,因为每个行为都是一个command,而不是一个controller。

strangeioc的Attribute竟然没有给自己加命名空间,导致InjectAttribute.cs和nodecanvas里的Attribute命名冲突,nodecanvas是有自己的命名空间,strangeioc竟然没有,略坑。

 这里做个总结:

1.StrangeIOC的成熟度还不够,用来做大型游戏项目显然有些力不从心。至少目前没有3A级的大作出来。

2.概念很多,在团队中推广难度很大,理解起来麻烦,各种事件调用机制 ,调试难度也很大。

3.MVC思想是务必会使用的,在各个模块的设计过程中,都要有这个思想,数据,显示,控制逻辑分开。但至于说是不是真要分的那么清楚,倒不用锱铢必究。

4.关于绑定框架。目前看在运行时,也许有些模块可以做些小应用,但整个application范围的应用需要慎重。

5.做这个框架的两名工程师,可能没做过大型的网络游戏项目,这个框架套在网游上会很别扭,至少现在看来是的。

6.这个框架其实可以持续跟进,也许有一天,牛逼人就搞出来个牛逼的大作来。

关于StrangeIOC框架的更多相关文章

  1. Unity StrangeIoC框架

    Unity StrangeIoC框架  http://blog.csdn.net/y1196645376/article/details/52746251    

  2. StrangeIoc框架学习----在项目中实战

    最近,因为公司的项目一直在研究StrangeIoc框架,小有所得,略作记录. StrangeIoc是一款基于MVCS的一种框架,是对MVC思想的扩展,是专门针对unity开发的一款框架,非常好用. 一 ...

  3. pureMVC与strangeIoc框架对比

    前言 最近有机会了解到了StrangeIoc框架,就拿来跟自己比较熟悉的pureMVC进行一下简要的对比.这两套开源框架都是基于MVC模式的扩展,pureMVC是一个跨平台跨语言的MVC轻量级应用框架 ...

  4. StrangeIoc框架学习

    StrangeIoc是一款基于MVCS的一种框架,是对MVC思想的扩展,是专门针对Unity3D开发的一款框架,非常好用. 一.MVCS分别代表什么 MVCS框架是一种模块的分离,一种写代码的规则,目 ...

  5. Unity StrangeIoc框架 (二)

    MVCSContex :the big picture 1.应用程序的入口是一个类成为ContextView,这是一个Monobehavior实例化MVCSContext 2.用MVCSContext ...

  6. Unity StrangeIoc框架 (一)

    最近想项目中需要使用这个架构  因此 上网看了很多资料摸索   但是对于初学者来说大多数的资料不是那么容易理解 而且文档也是英文的阅读起来有点吃力  所以记录一下自己阅读的过程  方便以后翻阅和跟我一 ...

  7. Unity StrangeIoc框架 (三)signal信号方式

    先创建TestRoot using UnityEngine; using System.Collections; using strange.extensions.context.impl; publ ...

  8. 框架学习笔记:Unity3D的MVC框架——StrangeIoC

    作为从AS3页游走过来的人,看见StrangeIoC会额外亲切,因为StrangeIoC的设计和RobotLegs几乎一致,作为一款依赖注入/控制反转(IoC)的MVC框架,StrangeIoC除了使 ...

  9. Get Start StrangeIOC for Unity3D

    好久没有发blog了,因为只发原创内容,而去年发布的那几篇后来发现随便百度到处都是转载的或者各种网站自动扒的,我觉得既然大家都不尊重这种东西就没必要发上来了!不过由于工作原因最近在看Unity的一个I ...

随机推荐

  1. Microsoft Dynamics CRM 分销行业解决方案

    Microsoft Dynamics CRM 分销行业解决方案 方案亮点 360度动态渠道信息管理 充分的客户细分 全面的业务代表考核指标 业务代表管理和能力建设 业务代表过程管理 业务代表费用管理 ...

  2. iOS之There was an internal API error错误

    There was an internal API error. 错误原因:把Product Name作为程序名称,程序名称错乱 解决方法:检查Product Name, 不要包含中文以及特殊字符.在 ...

  3. 【原+转】创建CocoaPods私有podspec

    在我的上一篇文章<iOS 手把手教你发布代码到CocoaPods>中着重介绍如何将自己的代码索引添加到公开的CocoaPods中,当你需要主动地向大众开源你的代码时需要那么做.但在现实中我 ...

  4. #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

    郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...

  5. SQL Server 2012安装错误案例:Error while enabling Windows feature: NetFx3, Error Code: -2146498298

    案例环境: 服务器环境 :    Windows Server 2012 R2 Standard 数据库版本 :    SQL Server 2012 SP1 案例介绍:   在Windows Ser ...

  6. JVM之Parallel Old收集器

    Parallel Scavenge的老年代版本 标记-整理算法 注重吞吐量及cpu资源敏感环境.

  7. MYSQL的常用命令和增删改查语句和数据类型

    连接命令:<a href="http://lib.csdn.net/base/mysql" class='replace_word' title="MySQL知识库 ...

  8. SQL Server自动化运维系列——监控性能指标脚本(Power Shell)

    需求描述 一般在生产环境中,有时候需要自动的检测指标值状态,如果发生异常,需要提前预警的,比如发邮件告知,本篇就介绍如果通过Power shell实现状态值监控 监控值范围 根据经验,作为DBA一般需 ...

  9. Jsoup做接口测试

    最早用Jsoup是有一个小的爬虫应用要写,发现Jsoup较HttpClient轻便多了,API也方便易懂,上手很快,对于response的Document解析的选择器用的是cssSelector(Jq ...

  10. C# 记录错误日志

    程序的错误日志如何记录下来? 可以在遇到异常时,Catch异常,然后把异常的信息输出到txt文件中即可 /// <summary> /// 错误日志 /// </summary> ...