Unity MVC框架之见解

article/2025/9/13 2:45:04

Unity MVC框架之见解

  • MVC框架认识
  • 构架图
  • 案例
    • 无框架,普通逻辑代码脚本
      • 主UI脚本
      • 角色UI脚本
      • 摄像机显示脚本
      • 脚本的放置
    • MVC框架的运用
      • Model脚本
      • View脚本
        • 主界面的View脚本
        • 角色View脚本
      • Controller脚本
        • 主界面的Controller脚本
        • 角色Controller脚本
      • 控制主界面的显示脚本
      • 脚本控件物体的连接
  • 总结

MVC框架认识

MVC框架本不是用于在游戏行业产生的框架,但是其编程思想对游戏开发的影响也很大。
M: model,是模型的意思,可是模型是为何物?是我们游戏中所要操作的人物模型等等。其主要就是存储数据的一个物体。我们所见到的的软件等等,都是本身去操作一条条的数据去运行。所以该M脚本的主要内容就是操作数据。数据有什么操作呢???数据无外乎有两个作用,更新和保存
V: View,是视图的的意思。该部分应该很好理解,那就是控制UI的,控制一些什么按钮什么的。用该部分的脚本去实现和M数据的显示。
C: control,管理器的意思。该部分的脚本主要是控制模型和视图的交互作用。给视图中的UI注册事件,模型的实时更新保存。(也就是调用M和V中的方法)

构架图

在这里插入图片描述
人们通过点击View的ui按钮进行给控制器通知,通过控制器给ui注册是事件运行来操作model的数据。然后数据开始响应控制器的信息来进行数据的更新和保存,并反馈给控制器,控制器再进行响应通知view面板开始对数据的变化显示等等。

案例

我们分为两个模块来进行展示。一种是使用了框架,一种是没有使用框架。我们来进行对比试验,来发现实现该框架框架的好处和不足。

我们在做一个展示UI的例子,该例子当运行时,点击M键可以显示UI,点击N键可以关闭UI。再点击UI中的角色按钮可以再打开一个角色面板。点击角色面板的升级按钮,可以改变人物的属性数值,并且可以实时的进行面板的更新相应。
效果演示:
在这里插入图片描述
我的项目资源可供大家下载:项目资源包免费下载

无框架,普通逻辑代码脚本

主UI脚本

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class Main : MonoBehaviour
{public Text PlayerText;public Text LevelText;public Text CoinText;public Text JewelText;public Text PowerText;public Button RoleButton;private static Main intestMain;public static Main IntestMinMain//单例模式{get{return intestMain;}}private GameObject Role;private GameObject resGameObject;void Start(){SetDate();resGameObject = Resources.Load<GameObject>("RoleUI");RoleButton.onClick.AddListener(ButtonRole);}public  void SetDate(){PlayerText.text = PlayerPrefs.GetString("Name", "玩家名字");LevelText.text ="LV. "+ PlayerPrefs.GetInt("Level", 1).ToString();CoinText.text = PlayerPrefs.GetInt("Coin", 0).ToString();JewelText.text = PlayerPrefs.GetInt("Jewel", 0).ToString();PowerText.text=PlayerPrefs.GetInt("Power",10).ToString();}public static void Showme()//控制自身的显示{if (intestMain == null){GameObject res = Resources.Load<GameObject>("UI");GameObject obj = Instantiate(res);obj.transform.SetParent(GameObject.Find("Canvas").transform, false);intestMain = obj.GetComponent<Main>();}intestMain.gameObject.SetActive(true);intestMain.SetDate();}public static void Hideme(){intestMain.gameObject.SetActive(false);}void ButtonRole(){if (Role == null){Role = Instantiate(resGameObject);Role.transform.SetParent(GameObject.Find("Canvas").transform,false);}Role.SetActive(true);}
}

角色UI脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
using Random = System.Random;public class CloseRole : MonoBehaviour
{public Button ColoseButton;public Button UpgradeButton;public Text LevelText;public Text CoinText;public Text JewelText;public Text PowerText;private int Level=1;private int Coin=0;private int Jewel=0;private int Power=0;void Start(){ColoseButton.onClick.AddListener(Close);SetDate();UpgradeButton.onClick.AddListener(UpNumber);}public void Close(){gameObject.SetActive(false);}public void UpNumber(){Level = PlayerPrefs.GetInt("Level",1) + 1;Random random = new Random();Coin += random.Next(50, 100);Jewel += random.Next(50, 100);Power += random.Next(20, 80);PlayerPrefs.SetInt("Level",Level);PlayerPrefs.SetInt("Coin", Coin);PlayerPrefs.SetInt("Jewel", Jewel);PlayerPrefs.SetInt("Power", Power);SetDate();Main.IntestMinMain.SetDate();}public void SetDate(){LevelText.text = "LV. " + PlayerPrefs.GetInt("Level",1).ToString();CoinText.text = PlayerPrefs.GetInt("Coin", 0).ToString();JewelText.text = PlayerPrefs.GetInt("Jewel", 0).ToString();PowerText.text = PlayerPrefs.GetInt("Power", 10).ToString();}}

摄像机显示脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Show : MonoBehaviour
{void Start(){//PlayerPrefs.DeleteAll();}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.M)){Main.Showme();}if (Input.GetKeyDown(KeyCode.N)){Main.Hideme();}}
}

脚本的放置

摄像机及脚本
在这里插入图片描述
主界面及脚本
在这里插入图片描述
角色脚本
在这里插入图片描述

MVC框架的运用

Model脚本

把模型的数据都集中起来进行管理操作。并实现更新和保存的方法。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEditor;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using Random = System.Random;public class ModelUI
{//Model只要就是存放数据,存放数据和更新数据,是MVC框架的核心//MVC只适用于UI游戏场景的游戏,并不是适合于所有的项目游戏private static ModelUI Intenst;#region 数据集合private string playerName;public string PlayerName => playerName;private int level;public int Level => level;private int coin;public int Coin => coin;private int jewel;public int Jewel => jewel;private int power;public int Power => power;#endregionpublic event UnityAction<ModelUI> ModelAction;//这个是unity的委托类型。我们要对其进行通知和反馈的操作注册。public static ModelUI Getit()//这里是单例模式,只有一个Model。{if (Intenst==null){Intenst=new ModelUI();Intenst.SetDate();}return Intenst;}//更新数据public void SetDate(){playerName = PlayerPrefs.GetString("Name", "皮学渣");level = PlayerPrefs.GetInt("Level", 1);coin = PlayerPrefs.GetInt("Coin", 0);jewel = PlayerPrefs.GetInt("Jewel", 0);power = PlayerPrefs.GetInt("Power", 10);}//点击升级按钮后修改数据public void LevelUp(){level += 1;Random random=new Random();coin += random.Next(10, 30);jewel += random.Next(10, 30);power += random.Next(10, 30);SaveDate();}//保存数据public void SaveDate(){PlayerPrefs.SetInt("Level",level);PlayerPrefs.SetInt("Coin",coin);PlayerPrefs.SetInt("Jewel",jewel);PlayerPrefs.SetInt("Power",power);//档保存后就自动更新数据UpdateInfo();}public void AddFuction(UnityAction<ModelUI> fun){ModelAction += fun;}public void SubtrctFuction(UnityAction<ModelUI> fun){ModelAction -= fun;}//通知外部更新数据public void UpdateInfo(){if (ModelAction != null){ModelAction(this);}}
}

View脚本

View的主要作用是对于数据的显示处理,并将该脚本放在特定的UI上面。不需要实现按钮的注册事件逻辑

主界面的View脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class MainUI:MonoBehaviour
{#region View作用/*view主要就是找UI的控件,对UI控件的信息进行更新,不需要实现按钮的注册事件逻辑*/#endregionpublic Text NameText;public Text LevelText;public Text CoinText;public Text JewelText;public Text PowerText;public Button Role;public void InfoDate(ModelUI model){NameText.text = model.PlayerName;LevelText.text = model.Level.ToString();CoinText.text = model.Coin.ToString();JewelText.text = model.Jewel.ToString();PowerText.text = model.Power.ToString();}
}

角色View脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class RoleUI :MonoBehaviour
{public Text LevelText;public Text CoinText;public Text JewelText;public Text PowerText;public Button UpClick;public Button Colose;public void InfoDate(ModelUI model){LevelText.text = model.Level.ToString();CoinText.text = model.Coin.ToString();JewelText.text = model.Jewel.ToString();PowerText.text = model.Power.ToString();}
}

Controller脚本

主界面的Controller脚本

控制器的作用是对UI的事件继续注册,完成代码逻辑的地方。用控制器来进行响应和反馈

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MainController : MonoBehaviour
{// Controle主要用来控制UI的显隐,还有逻辑的处理,数据的更新,ui按钮事件的注册private MainUI _mainUi;//1.控制显隐private static MainController controller=null;public static MainController Controller(){if (controller == null){controller=new MainController();}return controller;}public static void ShowMe(){if (controller == null){GameObject res = Resources.Load<GameObject>("UI");GameObject obj = Instantiate(res);obj.transform.SetParent(GameObject.Find("Canvas").transform,false);controller = obj.GetComponent<MainController>();}controller.gameObject.SetActive(true);}public static void Hide(){if (controller != null){controller.gameObject.SetActive(false);}}//2.注册事件,给UI注册事件,当我们显示UI的时候,就可以和MainUI关联,将MainUI赋值,并给他的按钮注册事件//当显示UI的时候,就给他赋值,所以就在start函数进行初始化private void Start(){_mainUi = this.gameObject.GetComponent<MainUI>();_mainUi.InfoDate(ModelUI.Getit());_mainUi.Role.onClick.AddListener(RoleButton);ModelUI.Getit().AddFuction(Info);}public void RoleButton(){RpleController.ShowMe();}public void Info(ModelUI date){if (_mainUi != null){_mainUi.InfoDate(date);}}private void OnDestroy(){ModelUI.Getit().SubtrctFuction(_mainUi.InfoDate);}
}

角色Controller脚本

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RpleController : MonoBehaviour
{private RoleUI _roleUi;//1.控制显隐private static RpleController controller=null;public static RpleController Controller(){if (controller == null){controller=new RpleController();}return controller;}public static void ShowMe(){if (controller == null){GameObject res = Resources.Load<GameObject>("RoleUI");GameObject obj = Instantiate(res);obj.transform.SetParent(GameObject.Find("Canvas").transform,false);controller = obj.GetComponent<RpleController>();}controller.gameObject.SetActive(true);}public static void Hide(){if (controller != null){controller.gameObject.SetActive(false);}}//2.注册事件,给UI注册事件,当我们显示UI的时候,就可以和MainUI关联,将MainUI赋值,并给他的按钮注册事件//当显示UI的时候,就给他赋值,所以就在start函数进行初始化private void Start(){_roleUi = this.gameObject.GetComponent<RoleUI>();_roleUi.InfoDate(ModelUI.Getit());_roleUi.Colose.onClick.AddListener(Hide);_roleUi.UpClick.onClick.AddListener(LevelUpClick);//这里对Model委托进行添加方法ModelUI.Getit().AddFuction(Info);}//3.更新数据public void LevelUpClick(){ModelUI.Getit().LevelUp();}public void Info(ModelUI date){if (_roleUi != null){_roleUi.InfoDate(date);}}private void OnDestroy(){ModelUI.Getit().SubtrctFuction(_roleUi.InfoDate);}
}

控制主界面的显示脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class InputMN : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//PlayerPrefs.DeleteAll();}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.M)){MainController.ShowMe();}else if(Input.GetKeyDown(KeyCode.N)){MainController.Hide();}}
}

脚本控件物体的连接

主界面的脚本
在这里插入图片描述

角色的脚本
在这里插入图片描述
相机添加脚本控制界面的显隐
在这里插入图片描述

总结

通过上面的两者编程方法,不知大家收获多少。
在普通的编程逻辑下。我们把控制该物体的行为都是写在一个脚本里面。控制UI的,按钮的注册,数据的显示更新保存等都是聚集在一个脚本内。
用了MVC框架,各各行为分工严明,具体是干甚的只需要把自己的内用写好就行。在控制器里来进行调用用于反馈通知。
同时MVC框架不是所有的游戏就可以使用,而是那种UI的游戏什么的可以运用,这种编程思想还需要我们用一些实际的项目来操作来去学习。


http://chatgpt.dhexx.cn/article/gyF2JgLh.shtml

相关文章

asp.net mvc框架

#mvc基础 &#xff08;model view controller&#xff09; 是模型—视图—控制器的缩写&#xff0c;一种用于开发web应用程序的软件架构模式&#xff0c;用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化…

MVC框架简介

MVC的全拼为Model-View-Controller&#xff0c;最早由TrygveReenskaug在1978年提出&#xff0c;是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式&#xff0c;是为了将传统的输入(input)、处理(processing)、输出(output)任务运用到…

PHP笔记-自定义MVC框架

膜拜 膜拜下黑马大佬程序员的项目&#xff0c;学习到了这样的手写MVC框架的方式&#xff0c;受益匪浅&#xff0c;感觉自己在C/C和Java方面&#xff0c;还有许多要学习的地方&#xff0c;看看能不能抄下这个php自己撸一个C/C的MVC框架。 下面记录下PHP自定义MVC框架。 项目结…

搭建一个简单的MVC框架

背景 为何要用MVC框架&#xff1f;首先我们知道不用框架的话&#xff0c;在javaweb项目中每个请求都要写一个servlet&#xff0c;并且要在web.xml中对每个servlet类的映射作配置&#xff0c;不方便开发&#xff0c;因此引入MVC框架。 工作原理 简单的说MVC框架就是为了简化开…

Android MVC框架

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、MVC是什么&#xff1f;二、写个简单的例子1.bean2.callback3.interfaces4.model5.ui 优缺点总结 前言 提示&#xff1a;很多教程讲解框架感觉都像说天书一…

MVC框架之SpringMVC

简介 Spring MVC 是 Spring 给我们提供的⼀个⽤于简化 Web 开发的框架。在说Spring MVC前&#xff0c;我们需要了解下什么是MVC架构以及三层架构&#xff1f; 1 MVC 体系结构 三层架构 在 JavaEE 开发中&#xff0c;⼏乎全都是基于 B/S 架构的开发。那么在 B/S 架构中&…

MVC架构简单介绍

一&#xff1a;MVC架构简介 MVC是Model&#xff08;模型&#xff09;view&#xff08;视图层&#xff09;controller&#xff08;控制器&#xff09;这三者的缩写。 在百度百科中是这样介绍的&#xff1a;MVC强制性地使应用程序的输入、处理和输出分开。使用MVC应用程序被分成…

MVC框架详解(资源整理)

一、什么是MVC&#xff1f; MVC是三个单词的首字母缩写&#xff0c;它们是Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;和Controller&#xff08;控制&#xff09;。 1、视图 视图(View)代表用户交互界面&#xff0c;对于Web应用来说&#x…

MVC框架

MVC框架 MVC框架——一个理论框架&#xff01;&#xff01;&#xff01;前言——必看1 经典MVC框架2 经典mvc模式就是jspservletJavaBean3 JavaBean4 实际MVC框架应用5 总结 MVC框架——一个理论框架&#xff01;&#xff01;&#xff01; 注意&#xff1a;mvc框架只是理论上的…

dojo介绍

dojo是目前最为强大的js框架&#xff0c;包括ajax,browser,event,widget等跨浏览器API&#xff0c;用dojo写Web OS可谓非常方便。 dojo现在已经4.0了&#xff0c;我自己其实不怎么用dojo&#xff0c;毕竟dojo强大的地方在于界面和特效的封装&#xff0c;可以让开发者快速构建一…

(2)Dojo学习之模块化

引言Dojo之模块化 1定义模块2调用模块3解释dojoConfig的全局变量 总结 1本篇博客代码下载地址Dojo模块化 1.引言 在本篇博客中主要讲解一下如何在dojo中使用模块&#xff0c;如何自定义自己的模块等等&#xff0c;在使用dojo编程的时候&#xff0c;大家一定要转变自己的思想&a…

Dojo 1.6 官方教程: 创建自定义Dojo小部件(Widget)

在这个教程中&#xff0c;我们将会演示如何利用Dojo 和Dijit框架来创建自定义的小部件。 主要会使用到dijit._Widget 和dijit._Templated 基类和mixin。 对dijit框架的基础知识&#xff0c;可以参看前两篇教程 难度&#xff1a;中等 适用Dojo版本&#xff1a; 1.6 作者&#xf…

(3)Dojo学习之Class

引言dojo中的类 1创建一个简单的类2类和模块结合使用3关于类的继承 需求 1需求一2需求二很重要21代码实现22程序出错23程序运行3 需求三 再次介绍require加载模块总结 1本博客代码的下载地址dojo_class 1.引言 说到面向对象&#xff0c;我们就不得不提一下类&#xff0c;在原生…

探索dojo/json

难度&#xff1a;中等 Dojo版本&#xff1a;1.7 原作者&#xff1a;Kris Zyp 译者&#xff1a;Oliver (zhuxw1984gmail.com) 原文链接&#xff1a;http://www.sitepen.com/blog/2012/09/21/exploring-dojojson/ &#xff08;年初翻译过Kris Zyp的另一篇介绍dojo/json的文章&…

dojo是什么?

现在Web端vue、React、Angular大行其道&#xff0c;安卓端js也有React Native等&#xff0c;那么学习dojo有什么意义呢&#xff1f; 有些老的项目还是用的dojo。。。。例如arcgis javascript api等等 https://dojotoolkit.org/documentation/tutorials/1.10/hello_dojo/ 为什…

Dojo入门篇

Dojo是一个JavaScript实现的开源DHTML工具包&#xff0c;Dojo最初的目标是解决开发HTML应用程序中遇到的一些长期存在的问题&#xff0c;然而现在Dojo已经成为了开发RIA应用程序的利器。 Dojo让Web页面具有动态能力&#xff0c;我们可以在其他支持JavaScript的环境中使用Dojo。…

dojo中的类

使用arcgis api for js 4.*进行地图的web前端开发&#xff0c;就不得不与dojo打交道。dojo是一个框架&#xff0c;自成体系&#xff0c;比如它对类的支持&#xff0c;有自己的一套。众所周知&#xff0c;js不是面向对象语言&#xff0c;没有类这一说&#xff0c;都是用函数来模…

dojo学习教程

Dojo 作为最著名的 Ajax 开源项目之一&#xff0c;不仅让 Web 程序员可以免费获得和使用其框架进行 Web 应用的开发&#xff0c;更吸引了大量的开发者对其不断的扩充&#xff0c;开发新的组件。DojoX 就是在这样的开发社区中产生的。DojoX 是一组基于 dojo 的开源项目的集合&am…

Dojo与jQuery综合比较分析

最近Dojo和jQuery双双发布了最新的1.8版本,有着相同版本号的两个Javascript库也有许多核心的相同之处:相同的资源加载机制AMD、相同的选择器 引擎Sizzle等。作为业界知名的Javascript库,Dojo和jQuery在各自领域有着为数众多的拥护者。不过正所谓一把钥匙开一把锁,对一个项目…

Dojo简述

Dojo是一个JavaScript实现的开源DHTML工具包。Dojo的最初目标是解决开发DHTML应用程序时遇到的一些长期存在的历史问题。 【注&#xff1a;DHTML是一种使HTML页面具有动态特性的艺术。DHTML是一种创建动态和交互WEB站点的技术集合。对大多数人来说&#xff0c;DHTML意味着HTML…