如何在Unity中实现MVC模式?

这篇具有很好参考价值的文章主要介绍了如何在Unity中实现MVC模式?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MVC是什么?

​ MVC即Model View Controller,是模型(model)【数据层】-视图(view)【表现层】-控制器(controller)【逻辑层】的缩写。主要应用于网站开发,在游戏开发方面,因为不同游戏的需求、功能不尽相同,所以一般来说游戏不使用统一架构开发游戏。

如何在Unity中实现MVC模式?

MVC

  • M——数据层:就是各种资源(图片,声音,动画)在游戏引擎中形成的对象集合。美术提供的这些是最原始的,需要封装成一组可控的代码。这些对象在整个游戏中可以划分为数据层。在捕鱼2中,多处的功能模块设计使用这样的方法。比如多国语言的本地化。所有的字段的翻译通过一个plist文件存储,形成一张二维表。当需要切换语言时,只需要改变某个key相对的Value就行了。逻辑层不需要做任何改变。
  • V——表现层:类与玩家交互且可看到的内容,掌控着游戏的大背景,并负责将程序中的各个数据元素各种状态及时显示。
  • C——逻辑层:可以划分为数据接口层,游戏AI层,操作控制层。数据接口层是负责从数据层中提供相应的数据对象进行封装组合。在这个层次上,类似与面向对象中类的属性定义,并提供控制(Set/Get)接口。这一层既可以是无结构化(原始数据类型定义),也可以是结构化(表,树,集合)。游戏AI层是逻辑层之核心,定义了其下面的各种数据元素的状态变化(金币数量,武器等级,动画播放……)。根据不同的状态变量,控制着数据元素的状态表现,是游戏的大脑,指挥控制中心。操作控制层,负责处理用户的输入,并注册或绑定相应的AI事件。在逻辑层中,数据接口层向下面对数据层,操作控制层向上面对用户行为事件,而游戏AI层统筹这两层。

​ MVC的好处在于三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供方法,供上面一层调用,而模型层和视图层之间、视图与控制之间也提供了委托(事件)来回调方法。这样可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。

实现MVC模式

MVC在游戏开发中属于什么位置?

如何在Unity中实现MVC模式?

(MVC在游戏开发中属于什么位置)

如何实现MVC模式,以游戏UI为例

  • 在Unity中搭建UI界面

如何在Unity中实现MVC模式?

Unity中搭建UI界面

​ 如图所示,假设需要搭建的UI有:人物等级、经验条、button按钮。

  • 构建MVC模式中的View层
//UI组件
public Text TExperience;//经验
public Text PlayerLevel;//人物等级
public Button Tbutton;//按钮
//初始化经验、人物等级
void Awake()
{
TExperience.text=PlayerMsgModel.GetInstance().TExperience.ToString()+"/"+PlayerMsgModel.GetInstance( ).TFullExperience.ToString();
PlayerLevel.text=PlayerMsgModel.GetInstance().PlayerLevel.ToString();
}
void Start()

{
    //委托事件绑定
    //等级
    PlayerMsgModel.GetInstance().OnLevelChange+=SetLevel;
    //经验
    PlayerMsgModel.GetInstance().OnExperienceChange+=SetExperience;
    //满级经验
    PlayerMsgModel.GetInstance().OnFullExperienceChange+=SetFullExperience;

    //绑定按钮控制功能
    Tbutton.onClick.AddListener( PlayerMsgModel.conteroller.OnTButtonClick );
}
//修改等级值
public void SetLevel(int level)
{
    PlayerLevel.text=level.ToString();
}
//修改经验值
public void SetExperience(int experience)
{
    string [ ] str=TExperience.text.Split(new char[ ]{'/'});
    TExperience.text=experience+"/"+str[1];
}
//修改满级经验值
public void SetFullExperience(int fullExperience)
{
    string [ ] str=TExperience.text.Split(new char[ ]{'/'});
    TExperience.text=str[0]+"/"+fullExperience;
}
  • 构建MVC模式中的Model层
//定义当用户信息发生变化时执行此委托的方法
public delegate void OnValueChange(int value);
public class PlayerMsgModel
{
    private int PlayerLevel=1;//人物等级
    private int TExperience=0;//经验
    private int FullExperience=10;//升级经验
    //声明委托对象,发生变化触发事件
    public OnValueChange OnLevelChange;
    public OnValueChange OnExperienceChange;
    public OnValueChange OnFullExperienceChange;

    //属性代码
}
//单例
private static PlayerMsgModel instance;
public static PlayerMsgModel GetInstance()
{
    if(instance==null)
    {
        instance=new PlayerMsgModel();
    }
    return instance;
}
private PlayerMsgModel
{ }
//属性
public int PlayerLevel
{
    get{return playerLevel;}
    set
    {
        playerLevel=value;
        //委托不为空,执行委托
        if(OnLevelChange!=null)
        {OnLevelChange(playerLevel)}
    }
}
public int TExperience
{
    get{return tExperience;}
    set
        {
            tExperience=value;
            //委托不为空,执行委托
            if(OnExperienceChange!=null)
            {OnExperienceChange(tExperience)}
        }
}
public int FullExperience
{
    get{return fullExperience;}
    set
        {
            fullExperience=value;
            //委托不为空,执行委托
            if(OnFullExperienceChange!=null)
            {OnFullExperienceChange(fullExperience)}
        }
}
  • 构建MVC模式中的Controller层
public static PlayerMsgModel controller;
void Awake()
{
    controller=this;
}
//按钮点击事件
public void OnTButtonClick()
{
    PlayerMsgModel.GetInstance().TExperience+=5;
    if(PlayerMsgModel.GetInstance().TExperience>=PlayerMsgModel.GetInstance().FullExperience)
    {
        PlayerMsgModel.GetInstance().PlayerLevel++;
        PlayerMsgModel.GetInstance().TExperience-=PlayerMsgModel.GetInstance().FullExperience;
        PlayerMsgModel.GetInstance().FullExperience=(int)(PlayerMsgModel.GetInstance().FullExperience*PlayerMsgModel.GetInstance().PlayerLevel-0.8f)
    }
}

最后

游戏开发写代码之前先整体考虑一下同类游戏的功能点,做个大概的结构规划再开始。需求不同,考虑问题的方式,解决问题的方式,游戏的整体框架规划等,都应该做些改变。文章来源地址https://www.toymoban.com/news/detail-453044.html

到了这里,关于如何在Unity中实现MVC模式?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity3D日常开发】Unity3D中实现单例模式详解

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 首先,说一下,什么是 单例模式(Singleton) 。 单例模式是设计模式中常见的一种设计模式,目的是为了

    2024年02月02日
    浏览(65)
  • 什么是MVVM?MVC、MVP与MVVM模式的区别?

    MVVM(Model-View-ViewModel)是一种软件架构模式,用于将用户界面(View)与业务逻辑(Model)分离,并通过ViewModel来连接两者。MVVM的目标是实现可测试性、可维护性和可复用性。 MVC(Model-View-Controller)是另一种常见的软件架构模式,它将应用程序分为三个主要部分:模型(Mode

    2024年02月20日
    浏览(40)
  • 【Unity实战100例】人物状态栏UI数据刷新—MVC观察者模式

    目录 一.创建Model层数据模型 二.创建View层关联UI组件 三.创建Controller层使得V和M数据关联 源码:

    2024年02月13日
    浏览(31)
  • 什么是分段路由?如何在网络中实施分段路由?

    在计算机网络中,分段路由(Subnetting)是一种将一个大的网络划分为多个较小子网的技术。它允许网络管理员更有效地分配 IP 地址和管理网络流量。本文将详细介绍分段路由的概念、原理以及如何在网络中实施分段路由。 分段路由是一种 将一个大的 IP 网络划分为多个较小

    2024年02月07日
    浏览(47)
  • 什么是DevOps监控以及如何在组织中实施?

    如今的软件开发商经常面临两大挑战——快速交付和大规模创新。DevOps通过在软件开发生命周期(SDLC)中引入自动化来开发和交付高质量的软件,从而帮助解决这些挑战。 持续集成(CI)/持续部署(CD)是DevOps实践中自动化的关键组件。它可以自动化代码构建、测试和部署,因此企

    2024年02月16日
    浏览(52)
  • Linux: 进程地址空间究竟是什么?进程地址空间存在意义何在?

     在C/C++中,我们常将内存分为: 代码区、常量区、全局区(静态区)、堆、栈 等等。相关内存区域划分如下:(X86, 32位平台) 如何验证C/C++中各区域的相对位置呢?  我们可以在每个区域中选择一个地址来验证C/C++中各区域的相对位置!!具体如下: 【源代码】: 【运行

    2024年04月08日
    浏览(75)
  • 什么是响应式图片?如何在网页中实现响应式图片?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月11日
    浏览(64)
  • java常见面试题:什么是迭代器模式(Iterator Pattern)?如何实现迭代器模式?

    迭代器模式(Iterator Pattern)是设计模式中的一种,它提供了一种顺序访问一个聚合对象(如列表、集合等)中各个元素的方法,而又不需要暴露该对象的内部表示。使用迭代器模式,可以方便地遍历一个聚合对象的所有元素,而不需要了解该对象的底层结构。 迭代器模式主

    2024年01月18日
    浏览(55)
  • 【VR】【unity】如何在VR中实现远程投屏功能?

    目前主流的VD应用,用于娱乐很棒,但是用于工作还是无法效率地操作键鼠。用虚拟键盘工作则显然是不现实的。为了让自己的头显能够起到小面积代替多显示屏的作用,自己动手开发投屏VR应用。 先实现C#的投屏应用。 研究如何将C#投屏应用用Unity 3D项目转写。 将Unity3D项目

    2024年02月08日
    浏览(64)
  • Sping MVC Model

    1. SpringMVCModelSampleApplication.java File-New-Spring Starter Project  Finish   2.HelloModelController.java.  /SpringMVCModelSample/src/main/java/com/example/demo/controller/    3. helloThymeleaf.html /SpringMVCModelSample/src/main/resources/templates/ 4. http://localhost:8080/hello/model  

    2024年02月14日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包