如何在Unity中实现MVC模式?

news2024/11/15 13:58:13

MVC是什么?

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

MVC

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

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

实现MVC模式

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

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

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

  • 在Unity中搭建UI界面

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)
    }
}

最后

游戏开发写代码之前先整体考虑一下同类游戏的功能点,做个大概的结构规划再开始。需求不同,考虑问题的方式,解决问题的方式,游戏的整体框架规划等,都应该做些改变。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字化转型迫在眉睫,企业应该如何面对?

火热的数字化转型,在国企、央企公布数字化转型规划后,进一步向各行各业开始扩散,吸引了很多对于数字化并不熟悉的企业。这些企业大多没有一个确定的目标,只是想要让企业完成转型改革,所以对于怎样做没有什么好的规划。…

Unity3d C#实现基于SocketIOUnity的与后端(node.js为例)Socket通信功能(含工程)

#前言 该功能主要是项目上的需求,按后端的需求就是我们通过SocketIO进行通信,之前游戏通信功能大多是基于原始的Socket进行封装,需要对包体进行设计,还需要粘包拆包等系列操作,属实有点麻烦。这次尝试了SocketIOUnity的…

Exynos_4412——RTC实验

目录 一、ADC小作业 二、RTC简介 三、Exynos_4412下的RTC控制器 四、RTC中的寄存器 五、RTC编程 六、RTC小作业 一、ADC小作业 电压在1501mv~1800mv时,LED2、LED3、LED4、LED5点亮 电压在1001mv~1500mv时,LED2、LED3、LED4点亮 电压在501mv~1000m…

什么是芯片老化测试?芯片老化测试系统NSAT-2000解决方案

随着半导体电子技术的进步,老化测试已成为保证产品质量的关键流程。除了半导体元件外,PCB、IC 和处理器部件也都需要在老化条件下进行测试。本篇文章纳米软件Namisoft小编将带大家分享一下关于芯片老化测试系统的相关知识。 一、什么是芯片老化测试&…

开发工具篇第十二讲:常用开发库 - Lombok工具库详解

开发工具篇第十二讲:常用开发库 - Lombok工具库详解 Lombok是一款非常实用Java工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。实际上我并不推荐使用Lombok(不主动使用它&…

CANoe测试TC8

OPEN联盟发布的TC8是目前行业内关于车载以太网的标准测试规范之一。 CANoe环境需要硬件和软件: 硬件是CANoe设备,用来连接电脑和DUT,TC8测试的是以太,那么CANoe设备必须支持以太才行,目前VN5640以上都是支持的。 软件需要安装CANo…

对git rebase 和git merge的理解

一、是什么 在使用 git 进行版本管理的项目中,当完成一个特性的开发并将其合并到 master 分支时,会有两种方式: git mergegit rebase git rebase 与 git merge都有相同的作用,都是将一个分支的提交合并到另一分支上,…

物联网技术在地下综合管廊智能化建设中的应用实例分析

摘 要:物联网是21世纪传感技术、通信技术、信息技术的应用大集成利用物联网技术实现地下综合管廊的智能化管理符合经济和城市规划发展的需要分析了物联网技术的特点及地下综合管廊建设中物联网技术的应用并结合物联网技术在地下综合管廊建设的应用实例对物联网技术在地下综合…

Qt扫盲-Windows任务栏使用总结

Qt扫盲-Windows任务栏使用总结一、概述二、覆盖图标和进度指示器三、跳转列表四、缩略图工具栏一、概述 任务栏为用户提供了访问桌面上打开的应用程序的权限。Windows自动在任务栏上创建用于访问应用程序窗口的按钮。 从 Windows 7到Windows10 都有效果。就是在任务栏上的一个…

基于springboot框架个人博客管理系统

一、项目简介 本项目是一套基于springboot框架实现的个人博客管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试&a…

头歌:UDP Ping程序实现 客户端创建UDP套接字

头歌平台:头歌实践教学平台 (educoder.net)创建数据包套接字套接字 Socket 实质上提供了主机间进程通信的连接点。进程通信之前,双方首先必须各自创建一个连接点,否则是没有办法建立联系并相互通信的。一个完整的 Socket {协议,本地地址,本地端口,远程地…

在 React 中使用 i18next

1. 安装依赖 npm i i18next react-i18next i18next-browser-languagedetectori18next 提供了翻译的基本能力。react-i18next 是 i18next 的一个插件,用来降低 react 的使用成本。i18next-browser-languagedetector 是用来检测浏览器语言的插件。 2. 在src下创建i18…

.net core 中使用confluent kafka构建生产者

创建.net 6 API安装依赖包 创建kafka生产者 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Confluent.Kafka; using Confluent.Kafka.Admin; using KafkaHelper.Config; using Microsoft.Exte…

Cuk拓扑产生负压

1、基础拓扑的输入输出电流连续情况 1>Buck电路 图中绿色波形为输入端的电流(测的图中MOS上的电流),蓝色的输出端的电流(图中电感L4的电流),可以看出输入端电流不连续,输出端电流连续。 2&…

Revit中项目特别大如何将项目完整的体现在图纸中?

一、Revit中项目特别大如何将项目完整的体现在图纸中? 遇到项目特别大,在一张图纸是放置不下时,如图1所示,怎样才能将项目完整的体现在图纸当中? 在遇到特别大的项目可能会在图纸中放不下,在这种情况下我们要用拼接线来处理。在…

【JavaEE】SSM框架

文章目录一、Spring1、Spring相关概念1.1 Spring Framework系统架构1.2 核心概念(lOC、lOC容器、Bean、DI)2、入门案例2.1 IOC入门案例2.2 DI入门案例3、lOC相关内容3.1 bean配置3.2 bean实例化3.3 bean的生命周期3.3.1 控制bean生命周期执行的方法3.3.2 bean销毁时机4、DI相关…

AI智能分析在智慧电厂的典型应用

电力供应是整个社会生产、人民生活的基本保证之一。智慧电力作为城市智能化发展的客观需求,是智慧城市的重要基础,也是智慧城市建设的一项重要内容。 智慧能源用最前沿技术淋漓尽致地表达着对未来能源发展趋势的理解与实践。智慧电力将多项创新成果应用于…

【前端】Vue项目:旅游App-(6)city:隐藏TabBar的2种方法

文章目录目标过程与代码方法1:通过路由隐藏方法2:用样式隐藏对方法2封装总代码修改的文件common.cssindex.jscity.vue目标 city页是点击上篇“广州”位置所跳转的页面。此页面要隐藏TabBar。 过程与代码 city页要隐藏TabBar。我们这里有两种隐藏的方法…

【Effective Objective - C】—— 读书笔记(五)

【Effective Objective - C】—— 读书笔记(五) 内存管理 文章目录【Effective Objective - C】—— 读书笔记(五)内存管理29.理解引用计数引用计数工作原理属性存取方法中的内存管理自动释放池保留环要点30.以ARC简化引用计数使…

Qt扫盲-QSystemTrayIcon理论总结

QSystemTrayIcon理论总结一、概述二、使用对象三、使用四、常用函数介绍1. 静态函数2. 公共槽函数3. 信号一、概述 现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区域,长期运行的应用程序可以在这里显示图标和短消息。什么意思呢&…