====================================================================================================
Unity是基于组件的,作多了代码不免混乱。所以须要有更好的思路。一个思路就是MVC。可是,在Unity下如何使用MVC的思路来编程,没太多思路。前两天看到一个老外的文章,能够借鉴下。html
地址:https://www.toptal.com/unity-Unity3D/unity-with-mvc-how-to-level-up-your-game-developmentgit
例子下载:http://download.csdn.NET/detail/wuyt2008/9615891github
下面的图显示了老外的思路编程
老外设计的结构实际上是AMVCC架构
A是application,用来包含整个项目,并调度用哪一个control来响应mvc
M是数据app
V是视图,只负责做为事件处理的入口框架
第一个C是控制器,对全部程序逻辑进行处理ide
第二个C是组件,不一样的组件,组成视图、控制器或模型。函数
这么说,有点不明白,看下脚本,大概就能理解了。
BounceApplication.cs
- using UnityEngine;
- using System.Collections;
-
-
- public class BounceElement : MonoBehaviour
- {
-
- public BounceApplication app {
- get {
- return GameObject.FindObjectOfType<BounceApplication> ();
- }
- }
- }
-
- public class BounceApplication : MonoBehaviour
- {
-
- public BounceModel model;
- public BounceView view;
- public BounceController controller;
-
-
- public void Notify (string p_event_path, Object p_target, params object[] p_data)
- {
- BounceController[] controller_list = GetAllControllers ();
- foreach (BounceController c in controller_list) {
- c.OnNotification (p_event_path, p_target, p_data);
- }
- }
-
-
- public BounceController[] GetAllControllers ()
- {
- BounceController[] arr = { GameObject.FindObjectOfType<BounceController>() };
- return arr;
- }
- }
BounceModel.cs
- using UnityEngine;
-
-
- public class BounceModel : BounceElement
- {
-
- public int bounces;
- public int winCondition;
- }
BounceController.cs
- using UnityEngine;
-
-
- public class BounceController : BounceElement
- {
-
- public void OnNotification(string p_event_path,Object p_target,params object[] p_data)
- {
- switch(p_event_path)
- {
- case BounceNotification.BallHitGround:
- app.model.bounces++;
- Debug.Log("Bounce"+app.model.bounces);
- if(app.model.bounces >= app.model.winCondition)
- {
- app.view.ball.enabled = false;
- app.view.ball.GetComponent<Rigidbody>().isKinematic=true;
-
- app.Notify(BounceNotification.GameComplete,this);
- }
- break;
-
- case BounceNotification.GameComplete:
- Debug.Log("Victory!!");
- break;
- }
- }
- }
BallView.cs
- using UnityEngine;
-
-
- public class BallView : BounceElement
- {
-
- void OnCollisionEnter() {
- app.Notify(BounceNotification.BallHitGround,this);
- }
- }
BounceView.cs
- using UnityEngine;
-
-
- public class BounceView : BounceElement
- {
- public BallView ball;
- }
BounceNotification.cs
-
- public class BounceNotification
- {
- public const string BallHitGround = "ball.hit.ground";
- public const string GameComplete = "game.complete";
-
- public const string GameStart = "game.start";
- public const string SceneLoad = "scene.load";
-
- }
若是用这个思路来作,会清晰不少,可是感受就是程序的耦合度过高了。
浅谈unity3d中使用MVC框架模式
MVC框架模式,相信不少人都不会陌生,数据-控制-显示分离的工做方式或者叫作代码结构会使软件(游戏)的结构清晰化,逻辑更明了。但因为MVC框架模式各部件均可以与彼此进行沟通,形成了不少新人在使用MVC的时候消息满天飞,解耦没成,耦合度更高了。我建议在使用MVC的时候,制定策略,让消息单向化,不要双向或造成网状。
好了,咱们下面讨论一下Unity3D是否可使用MVC,如何使用会比较好?(方法有不少种,这里我只写我比较认同的一种)
既然我写了有我比较认同的方式,那么在Unity3D中使用MVC至少我我的持同意态度,任何东西没有好与坏,只有适用不适用。
Unity3D自己的MonoBehavior脚本是一个重大突破,达到了组件式开发的目的。可是我依然要说,东西虽好,不能乱搞。我我的认为:组件式开发是好的方式,但组件自己倒是依靠传统的编程方式创建的,因此除开组件最适用的地方外,强制使用组件进行开发是违和的。MonoBehavior脚本,咱们能够将它理解为界面层与界面直接沟通的上层脚本,在他底部的控制、逻辑、数据等有必要用MonoBehavior脚本么?至少我认为是没必要要的(为何要用用不到的东西管理数据和逻辑呢?)。底部的控制、逻辑用什么实现好呢?方式不少,至少MVC框架模式是一个选择。而在使用MVC时,我我的认为模块内小规模使用MVC更合理,模块内的数据、控制、界面关系比较紧密,模块之间提供合理的接口进行跳转便可(不排除模块间消息沟通)。而模块内使用MVC时,也要遵循消息流向单向化,即:接收方永不发送消息,发送方永不接收消息。有人说不太可能,我给你们提供一个模型供参考:
1. 定义M只提供两种函数接口:操做、获取数据;并能够发送更新消息
2. 定义V只接收消息并控制界面显示、跳转、效果等
注:界面(暂且称之为UI)自身处理界面点击等操做直接调用M层进行处理或内部消化或发送给V进行控制跳转
3. 定义C实现必要逻辑(非界面自身逻辑)
咱们来看以上模型:
a. 用户点击->UI响应控制->调用M更改数据->发送更新界面消息->V接收消息->更新界面
b. 用户点击->UI响应控制->发送界面跳转消息->V接收消息->更新界面
c. 用户点击->UI响应控制->UI自消化
其实,通常的界面模块,用以上的模型就足够了。但有些模块比较复杂,须要不断的与数据和界面交互,这时候C才有意义。
以上方式,纯属我的比较承认的方式,在实际开发中,每一个人都会有本身的观点存在,但一个项目只能用统一的方式才方便沟通、交接、扩展…