Unity之MVC思想(通过普通方法和使用MVC思想完成同一个小案例:掌握MVC简单框架)

简介: Unity之MVC思想(通过普通方法和使用MVC思想完成同一个小案例:掌握MVC简单框架)

对MVC思想简单说明


MVC思想就是一种让View(视图(UI界面))、Data(数据)之间分离,通过中介Controller(管理逻辑脚本)进行交互的一种框架思想,目的是为了减少代码的耦合性。

MVC全名是Model View Controller,是模型(Model)👉 视图(View)👉 控制器(Controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

M 👉 V 👉 C

1、M(模型) 处理应用程序数据逻辑的部分 👉 通常模型对象负责在数据库中存取数据。

2、V(视图) 是应用程序中处理数据显示的部分 👉 通常视图是依据模型数据创建的。

3、C(控制器) 是应用程序中处理用户交互的部分 👉 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据(管理相关逻辑)。

4.注意:1、Unity~MVC是一种非必须UI系统开发框架 2、主要用于开发游戏UI系统逻辑

5.优点:降低耦合性,方法修改,逻辑更清晰

6.缺点(1、有一定的性能消耗(如今的电脑配置基本可以忽略))

普通方法与MVC思想脚本进行对比


普通方法脚本如👇:

代码少、体积小、逻辑复杂😥

image.png

MVC思想脚本如👇:

脚本分开管理逻辑更加清晰😀

image.png

使用的UI预制体


image.png

最后效果


1.gif

使用普通方法完成案例


图示如👇:

image.png

1、PlayerGradeManager


usingUnityEngine;
usingUnityEngine.UI;
publicclassPlayerGradeManager : MonoBehaviour{
//正常写法 通常四部走 获取对应组件 👉 添加事件 👉 更新信息 👉 动态显示//1、获取对应组件publicTexttxtLev;
publicButtonplayerBut;
privatestaticPlayerGradeManagerplayerGradeManageG;
publicstaticPlayerGradeManagerPlayerGradeManageG { get=>playerGradeManageG; }
//2、添加事件privatevoidStart()
    {
playerBut.onClick.AddListener(() =>        {
//打开角色面板的逻辑PlayerInfoManager.ShowMe();
        });
    }
//3、更新信息publicvoidUpdateInfo()
    {
//获取玩家数据 更新数据//获取数据方法 1、网格请求 2、json 3、xml 4、2进制 5、PlayerPrefs公共类//这里通过PlayerPrefs来获取本地存储的玩家信息  更新信息界面上txtLev.text="等级:"+PlayerPrefs.GetInt("LevValue", 1).ToString();
    }
//4、动态显示publicstaticvoidShowMe()
    {
if (PlayerGradeManageG==null)
        {
GameObjectres=Resources.Load<GameObject>("UI/PlayerGrade");
GameObjectobj=Instantiate(res);
//设置他的位置obj.transform.SetParent(GameObject.Find("Canvas").transform, false);
//获取自身脚本playerGradeManageG=obj.GetComponent<PlayerGradeManager>();
        }
//创建完后显示PlayerGradeManageG.gameObject.SetActive(true);
//更新面板后同步数据PlayerGradeManageG.UpdateInfo();
    }
publicstaticvoidHideMe()
    {
//方式一 :直接删除//if (playerGradeManager != null)//{//    Destroy(playerGradeManager.gameObject);//    playerGradeManager = null;//}//方式二 :隐藏PlayerGradeManageG.gameObject.SetActive(false);
    }
}

2、PlayerInfoManager


usingUnityEngine;
usingUnityEngine.UI;
publicclassPlayerInfoManager : MonoBehaviour{
//正常写法 通常四部走//1、获取对应组件publicTextplayerAttack;
publicTexthp;
publicTextdefense;
publicTexttxtLev;
publicButtonupgrade;
publicButtonhideBag;
privatestaticPlayerInfoManagerplayerInfo;
//2、添加事件privatevoidStart()
   {
upgrade.onClick.AddListener(() =>       {
Debug.Log("sasd");
//升级相关逻辑UpLev();
       });
hideBag.onClick.AddListener(() =>       {
//隐藏面板HideMe();
       });
   }
//3、更新信息privatevoidUpdateInfo()
   {
//获取玩家数据 更新数据//获取数据方法 1、网格请求 2、json 3、xml 4、2进制 5、PlayerPrefs公共类//这里通过PlayerPrefs来获取本地存储的玩家信息  更新信息界面上txtLev.text=PlayerPrefs.GetInt("LevValue",1).ToString();
playerAttack.text=PlayerPrefs.GetInt("AttackValue", 888).ToString();
hp.text=PlayerPrefs.GetInt("HpValue", 888).ToString();
defense.text=PlayerPrefs.GetInt("DefenseValue", 888).ToString();
   }
//4、动态显示publicstaticvoidShowMe()
   {
if (playerInfo==null)
       {
GameObjectres=Resources.Load<GameObject>("UI/PlayerInfo");
GameObjectobj=Instantiate(res);
//设置他的位置obj.transform.SetParent(GameObject.Find("Canvas").transform, false);
//获取自身脚本playerInfo=obj.GetComponent<PlayerInfoManager>();
       }
//创建完后显示playerInfo.gameObject.SetActive(true);
//更新面板后同步数据playerInfo.UpdateInfo();
   }
publicstaticvoidHideMe()
   {
//方式一 :直接删除//if (playerGradeManager != null)//{//    Destroy(playerGradeManager.gameObject);//    playerGradeManager = null;//}//方式二 :隐藏playerInfo.gameObject.SetActive(false);
   }
//升级相关逻辑privatevoidUpLev()
   {
//获取数据intLevValueInt=PlayerPrefs.GetInt("LevValue", 1);
intAttackValueInt=PlayerPrefs.GetInt("AttackValue", 888);
intHpValueInt=PlayerPrefs.GetInt("HpValue", 888);
intDefenseValueInt=PlayerPrefs.GetInt("DefenseValue", 888);
//更新磁盘里面的数据intadd=50;
LevValueInt+=add;
AttackValueInt+=add;
HpValueInt+=add;
DefenseValueInt+=add;
PlayerPrefs.SetInt("LevValue", LevValueInt);
PlayerPrefs.SetInt("AttackValue", AttackValueInt);
PlayerPrefs.SetInt("HpValue", HpValueInt);
PlayerPrefs.SetInt("DefenseValue", DefenseValueInt);
//同步面板数据UpdateInfo();
//同步PlayerGradeManager~UI界面的数据PlayerGradeManager.PlayerGradeManageG.UpdateInfo();
   }
}

3、UI_Evenemt (UI事件)


usingUnityEngine;
publicclassUI_Evenemt : MonoBehaviour{
privateboolisShowBag;
privatevoidUpdate()
    {
if (Input.GetKeyDown(KeyCode.B))
        {
//显示隐藏面板isShowBag=!isShowBag;
if (isShowBag)
PlayerGradeManager.ShowMe();
elsePlayerGradeManager.HideMe();
        }
    }
}

使用MVC思想完成案例


图示如👇:

image.png

1、Controller


PlayerGradeController

usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
//MVC中的C 👉 1、Controller负责相关逻辑 👉 2、界面事件监听等 处理对应的业务逻辑 👉 3、界面更新publicclassPlayerGradeController : MonoBehaviour{
//在Controller获取View 简单理解?? C控制VprivatePlayerGradeViewplayerGradeView;
privatestaticPlayerGradeControllerplayerGradeControllerC=null;
publicstaticPlayerGradeControllerPlayerGradeControllerC { get=>playerGradeControllerC;}
privatevoidStart()
    {
//获取View脚本 👉 第一次更新界面  👉 监听事件处理相关逻辑//获取View脚本playerGradeView=GetComponent<PlayerGradeView>();
//更新界面playerGradeView.UpdateInfo(ModeData.Instance);
//事件监听playerGradeView.playerBut.onClick.AddListener(() =>        {
PlayerInfoController.ShowMe();
        });
//添加委托事件ModeData.Instance.AddEvent(UpdateInFo);
    }
//见面的显示与隐藏publicstaticvoidShowMe()
    {
if (playerGradeControllerC==null)
        {
//实例化UI对象GameObjectres=Resources.Load<GameObject>("UI/PlayerGradeS");
GameObjectobj=Instantiate(res);
//设置其位置到Canvasobj.transform.SetParent(GameObject.Find("Canvas").transform,false);
//判断是否实例过playerGradeControllerC=obj.GetComponent<PlayerGradeController>();
        }
playerGradeControllerC.gameObject.SetActive(true);
    } 
publicstaticvoidHideMe()
    {
//方式一 :直接删除//if (playerGradeManager != null)//{//    Destroy(playerGradeManager.gameObject);//    playerGradeManager = null;//}//方式二 :隐藏if(playerGradeControllerC!=null)
playerGradeControllerC.gameObject.SetActive(false);
    }
//更新同步数据privatevoidUpdateInFo(ModeDatafunction)
    {
playerGradeView.UpdateInfo(function);
    }
}

PlayerInfoController

usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
//MVC中的C 👉 1、Controller负责相关逻辑 👉 2、界面事件监听等 处理对应的业务逻辑  👉 3、界面更新……publicclassPlayerInfoController : MonoBehaviour{
//在Controller获取View 简单理解 👉 C控制VprivatePlayerInfoViewplayerInfoView;
privatestaticPlayerInfoControllerplayerInfoControllerC=null;
publicstaticPlayerInfoControllerPlayerInfoControllerC { get=>playerInfoControllerC; }
privatevoidStart()
    {
//获取View脚本 👉  第一次更新界面  👉 监听事件处理相关逻辑//获取View脚本playerInfoView=GetComponent<PlayerInfoView>();
//更新界面playerInfoView.UpdateInfo(ModeData.Instance);
//添加委托事件ModeData.Instance.AddEvent(UpdateInFo);
//事件监听playerInfoView.upgrade.onClick.AddListener(() =>        {
ModeData.Instance.UpLev();
        });
playerInfoView.hideBag.onClick.AddListener(() =>        {
HideMe();
        });
    }
//见面的显示与隐藏publicstaticvoidShowMe()
    {
if (playerInfoControllerC==null)
        {
//实例化UI对象GameObjectres=Resources.Load<GameObject>("UI/PlayerInfoS");
GameObjectobj=Instantiate(res);
//设置其位置到Canvasobj.transform.SetParent(GameObject.Find("Canvas").transform, false);
//判断是否实例过playerInfoControllerC=obj.GetComponent<PlayerInfoController>();
        }
playerInfoControllerC.gameObject.SetActive(true);
    }
privatestaticvoidHideMe()
    {
//方式一 :直接删除//if (playerGradeManager != null)//{//    Destroy(playerGradeManager.gameObject);//    playerGradeManager = null;//}//方式二 :隐藏if (playerInfoControllerC!=null)
playerInfoControllerC.gameObject.SetActive(false);
    }
//更新同步数据privatevoidUpdateInFo(ModeDatafunction)
    {
playerInfoView.UpdateInfo(function);
    }
}

2、ModelData


ModeData

usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
usingUnityEngine.Events;
//MVC中的M 👉 储存数据publicclassModeData{
//MVC 👉 M一般流程 如👇://1、数据内容 ?? 2、数据相关操作&&初始化 ……?? 3、更新数据 ?? 4、储存数据 ……//1、数据内容privateintplayerLve;
privateintlev;
privateintattackValue;
privateinthp;
privateintdefense;
publicintPlayerLve { get=>playerLve; }
publicintLev { get=>lev;}
publicintAttackValue { get=>attackValue;}
publicintHp { get=>hp;}
publicintDefense { get=>defense;}
//使用单例用于外部调用 (M一般情况:自己是个静态单例 或者 存在一个单例模式对象中)privatestaticModeDatainstance=null;
publicstaticModeDataInstance {
get        {
if (instance==null)
            {
instance=newModeData();
instance.Init();
            }
returninstance;
        }
    }
//使用MVC思想不能从M去调用 其他的事件…… (使用事件)privateeventUnityAction<ModeData>updateDataEvent;
//2、数据相关操作 (初始化……)publicvoidInit()
    {
//初始化数据playerLve=PlayerPrefs.GetInt("LevValue", 1);
lev=PlayerPrefs.GetInt("LevValue", 1);
attackValue=PlayerPrefs.GetInt("AttackValue", 888);
hp=PlayerPrefs.GetInt("HpValue", 888);
defense=PlayerPrefs.GetInt("DefenseValue", 888);
    }
//3、更新本地数据publicvoidUpLev()
    {
intadd=50;
playerLve+=add;
lev+=add;
attackValue+=add;
hp+=add;
defense+=add;
Save();
    }
//4、储存数据publicvoidSave()
    {
PlayerPrefs.SetInt("LevValue", lev);
PlayerPrefs.SetInt("LevValue", lev);
PlayerPrefs.SetInt("AttackValue", attackValue);
PlayerPrefs.SetInt("HpValue", hp);
PlayerPrefs.SetInt("DefenseValue", defense);
UpdateInFo();
    }
//添加事件publicvoidAddEvent(UnityAction<ModeData>function)
    {
updateDataEvent+=function;
    }
//移除事件publicvoidRemoveEvent(UnityAction<ModeData>function)
    {
updateDataEvent-=function;
    }
//使用事件通知外部更新数据privatevoidUpdateInFo()
    {
//第一种写法 👇//if (updateDataEvent != null)//{//    updateDataEvent(this);//}//第二种写法  👇updateDataEvent?.Invoke(this);
    }
}

3、View


PlayerGradeView

usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
usingUnityEngine.UI;
//MVC中的V 👉 1、完成控件的查找  👉 2、提供UI更新的方法给外部publicclassPlayerGradeView : MonoBehaviour{
//1、完成控件的查找publicTexttxtLev;
publicButtonplayerBut;
//2、提供UI更新的方法给外部publicvoidUpdateInfo(ModeDatamodeData)
    {
txtLev.text="等级:"+modeData.PlayerLve.ToString();
    }
}

PlayerInfoView

usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
usingUnityEngine.UI;
//MVC中的V 👉 1、完成控件的查找 👉 2、提供UI更新的方法给外部……publicclassPlayerInfoView : MonoBehaviour{
//1、完成控件的查找publicTexttxtLev;
publicTextplayerAttack;
publicTexthp;
publicTextdefense;
publicButtonupgrade;
publicButtonhideBag;
//2、提供UI更新的方法给外部publicvoidUpdateInfo(ModeDatamodeData)
    {
txtLev.text=modeData.Lev.ToString();
playerAttack.text=modeData.AttackValue.ToString();
hp.text=modeData.Hp.ToString();
defense.text=modeData.Defense.ToString();
    }
}

最后


image.png

下篇文章再见ヾ( ̄▽ ̄)ByeBye

image.png

相关文章
|
4月前
|
语音技术 开发工具 图形学
Unity与IOS⭐一、百度语音IOS版Demo调试方法
Unity与IOS⭐一、百度语音IOS版Demo调试方法
|
1月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
33 1
|
1月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
31 1
|
1月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
25 0
|
2月前
|
前端开发 Java
【案例+源码】详解MVC框架模式及其应用
【案例+源码】详解MVC框架模式及其应用
119 0
|
3月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
131 4
|
4月前
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
3月前
|
图形学 开发者
【独家揭秘】Unity游戏开发秘籍:从基础到进阶,掌握材质与纹理的艺术,打造超现实游戏视效的全过程剖析——案例教你如何让每一面墙都会“说话”
【8月更文挑战第31天】Unity 是全球领先的跨平台游戏开发引擎,以其高效性能和丰富的工具集著称,尤其在提升游戏视觉效果方面表现突出。本文通过具体案例分析,介绍如何利用 Unity 中的材质与纹理技术打造逼真且具艺术感的游戏世界。材质定义物体表面属性,如颜色、光滑度等;纹理则用于模拟真实细节。结合使用两者可显著增强场景真实感。以 FPS 游戏为例,通过调整材质参数和编写脚本动态改变属性,可实现自然视觉效果。此外,Unity 还提供了多种高级技术和优化方法供开发者探索。
57 0
|
4月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
92 0
|
4月前
|
设计模式 存储 前端开发
MVC 框架的主要问题是什么?
【8月更文挑战第30天】
86 0