关闭

Unity下的MVC编程

标签: unity3dmvc编程
2491人阅读 评论(0) 收藏 举报
分类:

Unity是基于组件的,做多了代码难免混乱。因此需要有更好的思路。一个思路就是MVC。但是,在Unity下如何使用MVC的思路来编程,没太多思路。前两天看到一个老外的文章,可以借鉴下。

地址:https://www.toptal.com/unity-unity3d/unity-with-mvc-how-to-level-up-your-game-development

例子下载:http://download.csdn.net/detail/wuyt2008/9615891

下面的图显示了老外的思路


老外设计的结构其实是AMVCC

A是application,用来包含整个项目,并调度用哪个control来响应

M是数据

V是视图,只负责作为事件处理的入口

第一个C是控制器,对所有程序逻辑进行处理

第二个C是组件,不同的组件,组成视图、控制器或模型。




这么说,有点不明白,看下脚本,大概就能理解了。


BounceApplication.cs

using UnityEngine;
using System.Collections;

// 所有类的基类
public class BounceElement : MonoBehaviour
{
	// 让整个应用和所有实例便于访问
	public BounceApplication app { 
		get { 
			return GameObject.FindObjectOfType<BounceApplication> (); 
		}
	}
}
	
public class BounceApplication : MonoBehaviour
{
	// MVC的根实例
	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";
	/* ... */
}

如果用这个思路来做,会清晰很多,但是感觉就是程序的耦合度太高了。

0
0
查看评论

Unity3d中UI开发的MVC模式

原文:http://engineering.socialpoint.es/MVC-pattern-unity3d-ui.html 动机         和游戏开发的其他模块类似,UI一般需要通过多次迭代开发,直到用户体验近似OK。另外至关重要的是, 我们想尽快...
  • jjiss318
  • jjiss318
  • 2015-03-12 13:58
  • 21869

一个通用的有限状态机(FSM)框架

吃饭,睡觉,打豆豆现在要实现一个游戏中的一个NPC的AI, 他只做三件事,吃饭,睡觉,打豆豆,最直接,最简答想到的代码应该是这样。void Update() { if(Hungry) { Eat(); return; } if(Sleepy) { Sleep(); ret...
  • qp120291570
  • qp120291570
  • 2016-04-19 02:08
  • 8274

Unity3D用MVC框架思想实现的小例子

模型Model脚本(GameModel)using UnityEngine; using System.Collections; using System.Collections.Generic; //model是双向的,中间的 public class GameModel : MonoBehavi...
  • frank901
  • frank901
  • 2017-06-02 20:02
  • 1823

【Unity框架】Unity & MVC:如何提升游戏开发质量

程序员们经常以经典的Hello World开始他们的编程之旅。接下来才会接触更复杂的任务。每个新的挑战都体现出一个重要的结论: 工程越浩大,逻辑越复杂。               ...
  • wuyiping189
  • wuyiping189
  • 2015-10-10 14:16
  • 3594

Unity3d之MVC框架的使用

在Unity游戏的开发当中,我并没有刻意地采用MVC框架,因为不像网站开发那样,Model,View,Controller在游戏这个领域里还没有很清晰的定义。 究其原因,可能是由于不同游戏类型本身的软件架构可以相差很远,而且游戏里面的Object之间有大量的交互,所以垂直的MVC似乎不是十分应景。 ...
  • qq563129582
  • qq563129582
  • 2016-12-18 17:06
  • 4572

Unity框架_MVC与MVCS

框架是很重要的知识,没有框架的项目就像在没有原画下在拼图,盲目低效容易混乱。 网上已经有很多关于MVC框架的文章,我也没必要从头到尾说一遍,从其他文章可以了解MVC框架。游戏是一个很复杂的设计,MVC并不能满足游戏的设计做到完全层次分明。我曾经在某个博客中看过一个框架MVCS,跟MVC很像,只是多了...
  • u014792086
  • u014792086
  • 2016-11-05 15:51
  • 200

Unity下的MVC编程

Unity是基于组件的,做多了代码难免混乱。因此需要有更好的思路。一个思路就是MVC。但是,在Unity下如何使用MVC的思路来编程,没太多思路。前两天看到一个老外的文章,可以借鉴下。 地址:https://www.toptal.com/unity-unity3d/unity-with-mvc-ho...
  • wuyt2008
  • wuyt2008
  • 2016-08-29 15:29
  • 2491

行为树的原理及实现

查阅了一些行为树资料,目前最主要是参考了这篇文章,看完后感觉行为树实乃强大,绝对是替代状态机的不二之选。但从理论看起来很简单的行为树,真正着手起来却发现很多细节无从下手。 总结起来,就是: 1、行为树只是单纯的一棵决策树,还是决策+控制树。为了防止不必要的麻烦,我目前设计成单...
  • u014805066
  • u014805066
  • 2016-08-04 11:09
  • 3474

C# FSM (仿Unity 中的Mecanim动画系统的状态机)

FSM 精简版
  • linjf520
  • linjf520
  • 2014-03-11 14:25
  • 17033

Unity 行为树 Behavior Designer

Behavior Designer插件官方网站 目前在Unity3D游戏中一般复杂的AI都可以看到行为树的身影,简单的AI使用状态机来实现就可以了,所以这里我也是简单的学习下,为以后用到做准备。 行为树的概念出现已经很多年了,总的来说,就是使用各种经典的控制节点+行为节点进行组合,从而实现复杂...
  • qq563129582
  • qq563129582
  • 2015-12-02 19:29
  • 6069
    个人资料
    • 访问:702326次
    • 积分:7507
    • 等级:
    • 排名:第3453名
    • 原创:141篇
    • 转载:4篇
    • 译文:0篇
    • 评论:202条
    最新评论