【Unity 框架】QFramework v1.0 使用指南 架构篇:03. 引入 Command | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

这篇具有很好参考价值的文章主要介绍了【Unity 框架】QFramework v1.0 使用指南 架构篇:03. 引入 Command | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

03. 引入 Command

我们回顾一下目前的代码,如下;

using UnityEngine;
using UnityEngine.UI;

namespace QFramework.Example
{
    
    // 1. 定义一个 Model 对象
    public class CounterAppModel : AbstractModel
    {
        public int Count;
        
        protected override void OnInit()
        {
            Count = 0;
        }
    }


    // 2.定义一个架构(提供 MVC、分层、模块管理等)
    public class CounterApp : Architecture<CounterApp>
    {
        protected override void Init()
        {
            // 注册 Model
            this.RegisterModel(new CounterAppModel());
        }
    }

    // Controller
    public class CounterAppController : MonoBehaviour , IController /* 3.实现 IController 接口 */
    {
        // View
        private Button mBtnAdd;
        private Button mBtnSub;
        private Text mCountText;
        
        // 4. Model
        private CounterAppModel mModel;

        void Start()
        {
            // 5. 获取模型
            mModel = this.GetModel<CounterAppModel>();
            
            // View 组件获取
            mBtnAdd = transform.Find("BtnAdd").GetComponent<Button>();
            mBtnSub = transform.Find("BtnSub").GetComponent<Button>();
            mCountText = transform.Find("CountText").GetComponent<Text>();
            
            
            // 监听输入
            mBtnAdd.onClick.AddListener(() =>
            {
                // 6. 交互逻辑
                mModel.Count++;
                // 表现逻辑
                UpdateView();        
            });
            
            mBtnSub.onClick.AddListener(() =>
            {
                // 7. 交互逻辑
                mModel.Count--;
                // 表现逻辑
                UpdateView();
            });
            
            UpdateView();
        }
        
        void UpdateView()
        {
            mCountText.text = mModel.Count.ToString();
        }

        // 3.
        public IArchitecture GetArchitecture()
        {
            return CounterApp.Interface;
        }

        private void OnDestroy()
        {
            // 8. 将 Model 设置为空
            mModel = null;
        }
    }
}

现在,数据共享的问题通过 引入 Model 解决了。

这里再次强调一下,需要共享的数据放 Model 里,不需要共享的,能不放就不放。

虽然引入了 Model,但是这套代码随着项目规模的发展还是有很多的问题。

其中最严重也最常见的就是 Controller 会越来越臃肿。

我们简单分析一下为什么 Controller 会越来越臃肿,我们先看下监听用户输入部分的代码,如下:

// 监听输入
mBtnAdd.onClick.AddListener(() =>
{
    // 交互逻辑
    mModel.Count++;
    // 表现逻辑
    UpdateView();        
});
            
mBtnSub.onClick.AddListener(() =>
{
    // 交互逻辑
    mModel.Count--;
    // 表现逻辑
    UpdateView();
});

在处理用户输入的代码中,笔者写了注释,交互逻辑 和 表现逻辑。

什么是交互逻辑 和 表现逻辑?

非常简单。

交互逻辑,就是从用户输入开始到数据变更的逻辑

顺序是 View->Controller->Model

表现逻辑,就是数据变更到在界面显示的逻辑

顺序是 Model->Controller->View

如下图所示:

【Unity 框架】QFramework v1.0 使用指南 架构篇:03. 引入 Command | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

虽然交互逻辑和表现逻辑理解起来简单,但是它们非常重要,因为 QFramework 接下来的概念都是围绕这两个概念展开的。

View、Model 以及 Controller 的交互逻辑和表现逻辑形成了一个闭环。构成了完整的 MVC 闭环。

而 Controller 本身之所以臃肿,是因为,它负责了两种职责,即改变 Model 数据 的交互逻辑,以及 Model 数据变更之后更新到界面的表现逻辑。

而在一个有一定规模的项目中,表现逻辑和交互逻辑非常多。而一个 Controller 很容易就做到上千行代码。

而大部分的 MVC 方案,解决 Controller 臃肿用的是引入 Command 的方式,即引入命令模式,通过命令来分担 Controller 的交互逻辑的职责。

QFramework 也是使用了同样的方式解决 Controller 臃肿的问题。

我们将代码改成如下:

using UnityEngine;
using UnityEngine.UI;

namespace QFramework.Example
{
    
    // 1. 定义一个 Model 对象
    public class CounterAppModel : AbstractModel
    {
        public int Count;
        
        protected override void OnInit()
        {
            Count = 0;
        }
    }


    // 2.定义一个架构(提供 MVC、分层、模块管理等)
    public class CounterApp : Architecture<CounterApp>
    {
        protected override void Init()
        {
            // 注册 Model
            this.RegisterModel(new CounterAppModel());
        }
    }
    
    // 引入 Command
    public class IncreaseCountCommand : AbstractCommand // ++
    {
        protected override void OnExecute()
        {
            this.GetModel<CounterAppModel>().Count++;
        }
    }
    
    public class DecreaseCountCommand : AbstractCommand // ++
    {
        protected override void OnExecute()
        {
            this.GetModel<CounterAppModel>().Count--;
        }
    }

    // Controller
    public class CounterAppController : MonoBehaviour , IController /* 3.实现 IController 接口 */
    {
        // View
        private Button mBtnAdd;
        private Button mBtnSub;
        private Text mCountText;
        
        // 4. Model
        private CounterAppModel mModel;

        void Start()
        {
            // 5. 获取模型
            mModel = this.GetModel<CounterAppModel>();
            
            // View 组件获取
            mBtnAdd = transform.Find("BtnAdd").GetComponent<Button>();
            mBtnSub = transform.Find("BtnSub").GetComponent<Button>();
            mCountText = transform.Find("CountText").GetComponent<Text>();
            
            
            // 监听输入
            mBtnAdd.onClick.AddListener(() =>
            {
                // 交互逻辑
                this.SendCommand<IncreaseCountCommand>();
                // 表现逻辑
                UpdateView();        
            });
            
            mBtnSub.onClick.AddListener(() =>
            {
                // 交互逻辑
                this.SendCommand<DecreaseCountCommand>();
                // 表现逻辑
                UpdateView();
            });
            
            UpdateView();
        }
        
        void UpdateView()
        {
            mCountText.text = mModel.Count.ToString();
        }

        // 3.
        public IArchitecture GetArchitecture()
        {
            return CounterApp.Interface;
        }

        private void OnDestroy()
        {
            // 8. 将 Model 设置为空
            mModel = null;
        }
    }
}

代码很简单,我们用流程图表示如下:

【Unity 框架】QFramework v1.0 使用指南 架构篇:03. 引入 Command | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

运行 Unity,结果如下:

【Unity 框架】QFramework v1.0 使用指南 架构篇:03. 引入 Command | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

没有变化,运行正确。

大家可能会问,一个简单的数据加减操作,至于创建一个 Command 对象来承担么?看不出来好处呀,反而代码更多了。

如果整个项目只有一个简单的数据加减操作,那使用 Command 有点多此一举,但是一般的项目的交互逻辑,是非常复杂的,代码量也非常多,整个时候使用 Command 词汇发挥作用。

具体发挥什么作用,使用 Command 可以带来很多便利,比如:

  • Command 可以复用,Command 也可以调用 Command
  • Command 可以比较方便实现撤销功能,如果 App 或者 游戏需要的话
  • 如果遵循一定规范,可以实现使用 Command 跑自动化测试。
  • Command 可以定制 Command 队列,也可以让 Command 按照特定的方式执行
  • 一个 Command 也可以封装成一个 Http 或者 TCP 里的一次数据请求
  • Command 可以实现 Command 中间件模式
  • 等等

OK,通过引入 Command,帮助分担了 Controller 的交互逻辑。使得 Controller 成为一个薄薄的一层,在需要修改 Model 的时候,Controller 只要调用一句简单的 Command 即可。

Command 最明显的好处就是:

  • 就算代码再乱,也只是在一个 Command 对象里乱,而不会影响其他的对象。
  • 讲方法封装成命令对象,可以实现对命令对象的组织、排序、延时等操作。

更多好处会随着大家的实践慢慢体会到。

当前的 MVC 流程如下:

【Unity 框架】QFramework v1.0 使用指南 架构篇:03. 引入 Command | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

这篇内容就这些。文章来源地址https://www.toymoban.com/news/detail-459012.html

更多内容

  • 转载请注明地址:liangxiegame.com (首发) 微信公众号:凉鞋的笔记
  • QFramework 主页:qframework.cn
  • QFramework 交流群: 623597263
  • QFramework Github 地址: https://github.com/liangxiegame/qframework
  • QFramework Gitee 地址:https://gitee.com/liangxiegame/QFramework
  • GamePix 独立游戏学院 & Unity 进阶小班地址:https://www.gamepixedu.com/

到了这里,关于【Unity 框架】QFramework v1.0 使用指南 架构篇:03. 引入 Command | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • openGauss5.0企业版使用指南之系统架构

    openGauss5.0企业版使用指南之系统架构

    背景:今年3月openGauss 5.0发布,升级了资源池化内核能力和DataKit数据全生命周期管理工具,整体在性能、安全性与易用性方面均有大幅提升。本次大会上,共7家数据库伙伴、企业用户基于openGauss 5.0发布商业版和自用版,其中,openGauss嵌入式商业发行版首次发布。至此,open

    2024年02月08日
    浏览(8)
  • 小程序开发:开发框架与工具的使用指南

    小程序开发:开发框架与工具的使用指南

    本文以微信小程序为例介绍了小程序开发框架与工具的使用,通过本文的阅读,相信大家能够简单了解小程序开发的基本流程和常用工具,从而快速上手小程序开发。 1.1 小程序开发框架 小程序开发框架是一套用于快速构建小程序的开发框架,提供了丰富的组件和API,使得开

    2024年02月14日
    浏览(9)
  • 【教程】Unity 官配 JsonUtility 使用指南

    开发平台:Unity 2020 编程平台:Visual Studio 2020 编程语言:CSharp     处理 Json 数据,在目前多元化的 Json 处理插件上显得简单易用。而 JsonUtility 作为 Unity 官方坐镇的 Json 数据处理软件。必然有其存在的原因。   支持数字数据类型: int 、 float 、 double 、 decimal 、 long 包括

    2024年01月21日
    浏览(7)
  • 人工智能 框架 paddlepaddle 飞桨 使用指南& 使用例子 线性回归模型demo 1

    人工智能 框架 paddlepaddle 飞桨 使用指南& 使用例子 线性回归模型demo 1

    安装过程使用指南线性回归模型 使用例子 本来预想 是安装 到 conda 版本的 11.7的 但是电脑没有gpu 所以 安装过程稍有变动,下面简单讲下  由于想安装11.7版本 py 是3.9 所以虚拟环境名称也是 paddle_env117 检查环境即可 本文档为您介绍 conda 安装方式

    2024年04月15日
    浏览(11)
  • FastAPI 库(Python 的 Web 框架)基本使用指南(二)

    FastAPI 中定义路由的方式主要有两种,一种是使用 FastAPI 应用实例的方法(例如 app.get() ),一种是使用装饰器(例如 @app.get() ),它们的用法和作用略有不同。 方式1:使用 FastAPI 应用实例的方法 app.get() 、 app.post() 等方法用于直接在应用实例上定义路由。 这些方法接受路径

    2024年02月05日
    浏览(14)
  • FastAPI 库(Python 的 Web 框架)基本使用指南(一)

    参考文档: 中文文档 轻松上手Python的Web神器:FastAPI教程 FastAPI 是一个基于 Python 的现代 Web 框架,它具有快速构建高性能 API 的特点。 FastAPI 关键特性: 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。 高效编码:提高功能开发

    2024年02月04日
    浏览(35)
  • 安全之剑:深度解析 Apache Shiro 框架原理与使用指南

    安全之剑:深度解析 Apache Shiro 框架原理与使用指南

    在现代软件开发中,安全性一直是至关重要的一个方面。随着网络攻击和数据泄露的不断增加,我们迫切需要一种强大而灵活的安全框架来保护我们的应用。Shiro框架就是这样一把利剑,它能够轻松地集成到你的项目中,为你的应用提供可靠的安全性保护。 Apache Shiro是一个强

    2024年04月09日
    浏览(11)
  • 《人工智能时代使用大模型重塑电商人、货、场系统架构指南》

    《人工智能时代使用大模型重塑电商人、货、场系统架构指南》

    本文介绍人工智能大语言模型,以帮助您更好地了解如何使用大模型重塑电商系统架构。

    2024年02月06日
    浏览(40)
  • Unity中使用AVPro Video播放视频的完全指南

    Unity中使用AVPro Video播放视频的完全指南

    Unity AVPro是一款强大的视频播放解决方案,它支持多种视频格式和编解码器,能够在Unity中实现高质量的视频播放。本教程将指导你如何在Unity项目中使用AVPro播放视频。 1、安装AVPro Video 2、在UI上显示视频 3、在3D物体上显示视频,介绍两种播放到物体的方法 4、编写脚本,用按

    2024年04月16日
    浏览(90)
  • 【IDEA使用指南】使用Hibernate框架的Java项目,如何通过数据库表自动生成实体模型?

    【IDEA使用指南】使用Hibernate框架的Java项目,如何通过数据库表自动生成实体模型?

    步骤1:找到并打开“Persistence”工具栏。 如下图所示,找到 “View - Tool Windows - Persistence”,点击“Persistence”。 步骤2:找到并打开“Import Database Schema” 窗口。 在开发工具左下角会弹出持久化配置的工具栏“Persistence”,如下图所示。单击之后有一个弹框,找到弹框中的项

    2024年02月05日
    浏览(19)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包