前言——什么是MVC框架

MVC全名是Model View Controller, 是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面 显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于 映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

目的——Unity UI使用时的优势

框架其实是一种思想,一种在制作游戏时对代码的逻辑化整理,在Unity开发过程中,很多的公司在制作游戏开发项目的时候都用到了MVC的逻辑模式,既数据模型—视图—控制器。

作为码农,我们在写代码的时候,都在追求代码的高聚合、低耦合,高聚合通俗来讲就是说将代码的模块区分开,每个模块的功能高度集中,低耦合是说尽量减少模块与模块之间的相互影响,这样在后期维护代码的时候将会非常的轻松,但产品经理要求改需求的时候也不会“牵一发而动全身”,将代码大改特改。当然也没有完全的高聚合低耦合的模式,但我们要尽量以这个思想来设计代码。

举一个简单的例子:很多的游戏开发项目发布后,看上去各个功能实现的都很完善,但是如果在某个节日要发布游戏活动,要将游戏UI变更相对应的节日时,有的项目各个UI下挂在了大量的脚本,这样很难进行UI的替换,当替换UI会导致其他的功能受到影响时,这将会严重影响游戏的质量。所以我们在设计游戏的时候,在UI方面可以考虑MVC的结构模式,将模块之间的功能区分开,达到低耦合的效果。

实现——简单的UI项目

下面我们用MVC框架的思想来0简单的实现一个制作的UI界面来了解一下如何写MVC框架。

~第一个脚本:Model

1,在这个脚本里面,只存放数据

2,脚本是一个单例对象,不需要挂载在物体上

3,所有的数据通过外部赋值,不需要有初始值

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerModel{/// <summary>/// 单例模式/// </summary>private static  PlayerModel instance;public static PlayerModel GetMod() {if (instance == null) {instance = new PlayerModel();}return instance;}/// <summary>/// 私有构造方法/// </summary>private PlayerModel() { }//创建Action事件public System.Action levelUpEvent;public System.Action takeDamageEvent;public System.Action makeMagicEvent;private int playerLevel;private int playerCoin;private int playerDiamond;private float playerHealth;private float playerMagic;private float maxPlayerHealth;private float maxplayerMagic;public float MaxPlayerHealth {get {return maxPlayerHealth; }set { maxPlayerHealth = value; }}public float MaxplayerMagic {get { return maxplayerMagic; }set { maxplayerMagic = value; }}public int PlayerLevel {get { return playerLevel; }set {playerLevel = value;if (levelUpEvent != null) {            levelUpEvent();}}}public int PlayerCoin {get { return playerCoin; }set { playerCoin = value;}}public int PlayerDiamond {get { return playerDiamond; }set { playerDiamond = value; }}public float PlayerHealth {get { return playerHealth; }set {playerHealth = value;if (takeDamageEvent != null) {takeDamageEvent();}}}public float PlayerMagic {get { return playerMagic; }set {playerMagic = value;if (makeMagicEvent != null) {makeMagicEvent();}}}
}

~第二个脚本:ViewPath(各个UI的路径)

储存所有UI的path路径

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ViewPath  {#region PlayerViewpublic const string PLAYLEVEL = "PlayerHead/PlayerLevelBG/PlayerLevel";public const string PLAYERCOIN = "PlayerHead/PlayerCoin/CoinCount";public const string PLAYERDIAMOND = "PlayerHead/PlayerDiamond/DiamondCount";public const string PLAYERHEALTH = "PlayerHealth/PlayerHealthBg/PlayerHealthData";public const string PLAYERMAGIC = "PlayeMagic/PlayerMagicBg/PlayerMagicData";public const string HEALTH = "PlayerHealth/Health";public const string MAGIC = "PlayeMagic/Magic";public const string LEVELUP = "LevelUpButton";public const string DAMAGE = "DemageButton";public const string SKILL = "SkillButton";#endregion
}

~第三个脚本: PlayerView

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class PlayerView : MonoBehaviour {private Text playerLevelText;private Text playerCoinText;private Text playerDiamondText;private Text healthData;private Text magicData;private RectTransform playerHealth;private RectTransform playerMagic;private Button levelUpBtn;private Button damageBtn;private Button skillBtn;public static PlayerView view;// Use this for initializationvoid Awake() {//单例脚本view = this;//找到需要用到的所有UIplayerLevelText = transform.Find(ViewPath.PLAYLEVEL).GetComponent<Text>();playerCoinText = transform.Find(ViewPath.PLAYERCOIN).GetComponent<Text>();playerDiamondText = transform.Find(ViewPath.PLAYERDIAMOND).GetComponent<Text>();playerHealth = transform.Find(ViewPath.PLAYERHEALTH).GetComponent<RectTransform>();playerMagic = transform.Find(ViewPath.PLAYERMAGIC).GetComponent<RectTransform>();healthData = transform.Find(ViewPath.HEALTH).GetComponent<Text>();magicData = transform.Find(ViewPath.MAGIC).GetComponent<Text>();levelUpBtn = transform.Find(ViewPath.LEVELUP).GetComponent<Button>();damageBtn = transform.Find(ViewPath.DAMAGE).GetComponent<Button>();skillBtn = transform.Find(ViewPath.SKILL).GetComponent<Button>();BindUIChangeEvent();}private void Start() {levelUpBtn.onClick.AddListener(PlayerController.GetController().OnLevelUp);damageBtn.onClick.AddListener(PlayerController.GetController().OnDamage);skillBtn.onClick.AddListener(PlayerController.GetController().OnSkill);}/// <summary>/// 绑定通知UI改变事件/// </summary>void BindUIChangeEvent() {//升级按钮点击事件委托PlayerModel.GetMod().levelUpEvent = () => {playerLevelText.text = PlayerModel.GetMod().PlayerLevel.ToString();playerCoinText.text = PlayerModel.GetMod().PlayerCoin.ToString();playerDiamondText.text = PlayerModel.GetMod().PlayerDiamond.ToString();healthData.text = string.Format("{0} / {1}", PlayerModel.GetMod().PlayerHealth, PlayerModel.GetMod().MaxPlayerHealth);magicData.text = string.Format("{0} / {1}", PlayerModel.GetMod().PlayerMagic, PlayerModel.GetMod().MaxplayerMagic);};//受伤按钮点击事件委托PlayerModel.GetMod().takeDamageEvent = () => {//计算血量UI长度float currentUIHealth = 400 *PlayerModel.GetMod().PlayerHealth/ PlayerModel.GetMod().MaxPlayerHealth;//设置长度playerHealth.sizeDelta = new Vector2(currentUIHealth, playerHealth.sizeDelta.y);};//使用技能按钮点击事件委托PlayerModel.GetMod().makeMagicEvent = () => {//计算蓝量UI长度float currentUIMagic = 400 * PlayerModel.GetMod().PlayerMagic / PlayerModel.GetMod().MaxplayerMagic;//设置长度playerMagic.sizeDelta = new Vector2(currentUIMagic, playerMagic.sizeDelta.y);};}
}

~第四个脚本: PlayerController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerController  {private static PlayerController instance;public static PlayerController GetController() {if(instance == null) {instance = new PlayerController();}return instance;}private PlayerController() {PlayerModel.GetMod().PlayerLevel = 1;PlayerModel.GetMod().PlayerCoin = 100;PlayerModel.GetMod().PlayerDiamond = 10;PlayerModel.GetMod().MaxPlayerHealth = 400;PlayerModel.GetMod().PlayerHealth = 300;PlayerModel.GetMod().MaxplayerMagic = 100;PlayerModel.GetMod().PlayerMagic = 80;}/// <summary>/// 升级事件/// </summary>public void OnLevelUp() {int currentLevel = PlayerModel.GetMod().PlayerLevel;//金币递增PlayerModel.GetMod().PlayerCoin += currentLevel * 10;//钻石递增if ((currentLevel+1) % 3 == 0) {PlayerModel.GetMod().PlayerDiamond += 10;}//最大血量递增PlayerModel.GetMod().MaxPlayerHealth += currentLevel * 20;//调整当前血量 PlayerModel.GetMod().PlayerHealth += currentLevel * 20;//最大蓝量递增PlayerModel.GetMod().MaxplayerMagic += currentLevel * 10;//调整当前蓝量 PlayerModel.GetMod().PlayerMagic += currentLevel * 10;//升级PlayerModel.GetMod().PlayerLevel++;}/// <summary>/// 受到伤害/// </summary>public void OnDamage() {float currentHealth = PlayerModel.GetMod().PlayerHealth - 200;PlayerModel.GetMod().PlayerHealth = Mathf.Clamp(currentHealth, 0f, PlayerModel.GetMod().MaxPlayerHealth);}/// <summary>/// 释放技能事件/// </summary>public void OnSkill() {float currentMagic = PlayerModel.GetMod().PlayerMagic - 30;PlayerModel.GetMod().PlayerMagic = Mathf.Clamp(currentMagic, 0f, PlayerModel.GetMod().MaxplayerMagic);}
}

https://pan.baidu.com/s/1pMPN4Np
附赠源码链接,内涵精美扁平化UI文件











Unity框架——MVC框架相关推荐

  1. spring框架mvc框架_Spring的MVC测试框架入门–第1部分

    spring框架mvc框架 最新推出的主要Spring框架是Spring MVC测试框架,Spring Guys声称它是"一流的JUnit支持,可通过流畅的API测试客户端和服务器端Spri ...

  2. spring框架mvc框架_Spring MVC测试框架入门–第2部分

    spring框架mvc框架 这个迷你系列的第一个博客介绍了Spring MVC测试框架,并演示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途. ...

  3. spring框架mvc框架_5篇Spring框架书籍,通过MVC学习Spring

    spring框架mvc框架 Spring Framework is one of the most widely used Java EE Frameworks. It's an open sourc ...

  4. (十)Spring 与 MVC 框架整合

    Spring 整合 MVC 目录 MVC 框架整合思想 为什么要整合 MVC 框架 搭建 Web 运行环境 Spring 整合 MVC 框架的核心思路 1. 准备工厂 2. 代码整合 Spring 整 ...

  5. python mvc框架_MVC其实很简单(Django框架)

    Django框架MVC其实很简单 让我们来研究一个简单的例子,通过该实例,你可以分辨出,通过Web框架来实现的功能与之前的方式有何不同. 下面就是通过使用Django来完成以上功能的例子: 首先,我们 ...

  6. Spring 与 MVC 框架整合思路

    Spring 整合 MVC MVC 框架整合思想 为什么要整合 MVC 框架 搭建 Web 运行环境 Spring 整合 MVC 框架的核心思路 1. 准备工厂 2. 代码整合 Spring 整合 S ...

  7. Mybatis,Spring,MVC框架

    文章目录 @[toc] unit12-mybatis框架 MyBatis简介(了解) 什么是MyBatis 为什么要使用MyBatis MyBatis快速入门 准备数据,创建库和表 创建工程,导入所需 ...

  8. Unity MVC框架之见解

    Unity MVC框架之见解 MVC框架认识 构架图 案例 无框架,普通逻辑代码脚本 主UI脚本 角色UI脚本 摄像机显示脚本 脚本的放置 MVC框架的运用 Model脚本 View脚本 主界面的Vi ...

  9. Unity——基于MVC的UI框架

    Unity--基于MVC的UI框架 前言 今天来学习一下MVC框架思想在Unity项目中的应用 MVC框架 概念 MVC全名是Model View Controller,是模型(Model)-视图(V ...

最新文章

  1. (原創) 标准的makefile写法 (C/C++)
  2. suse mysql 5.5_suse 11 mysql 如何从5.1升级到5.5
  3. 控件制作之design-time attribute
  4. 虚树详解+例子分析+模板
  5. 在任意目录导入自定义库
  6. 【TDA4系列】硬件分析与刷写程序的几种方式
  7. 《AIX 5L 系统管理技术》学习笔记之第七章设备管理
  8. JAVA/JSP B2C系统介绍
  9. 惠斯通电桥平衡条件推导
  10. 李居明 饿火命(3)
  11. 2021年最新AZ自动发卡网源码-全网首发
  12. linux startx无效_startx启动失败的几个解决方法
  13. c语言 重新输入,C语言函数重新输入
  14. 第一章 数据结构与算法-前言
  15. 网络基础之网络协议篇
  16. Velo项目评级:BB,展望稳定 | TokenInsight
  17. 怎样将相片合成gif图?在线合成图片如何操作?
  18. 维基解密网站总编辑身世被解密
  19. iphone转android 短信通知,如何将短信从iPhone转移/切换到Android
  20. 使用C语言通过POST通信,空格导致的400 Bad Request

热门文章

  1. 一张图掌握薛兆丰经济学讲义的精华
  2. 大数据技术(1):大数据发展脉络
  3. 城市大数据发展评价指标体系
  4. 工厂生产线设备数据采集方法
  5. Android 关于TextView 默认显示英文字母大写问题
  6. (转载)JAVA小知识
  7. 数值计算之 最小二乘法(3)最小二乘的矩阵解法
  8. 数据分析体系 - 用户粘性(DAU/MAU 和 月人均活跃天数)
  9. 蓝牙(二)A2DP协议
  10. 灵活替换、无惧缺芯,ARM工控板中的模块化设计