【Unity/QFramework】QFramework学习笔记

文章目录

    • 基础流程
    • 示例程序【PointGame】
      • Architecture
      • Storage
        • PlayerPrefsStorage : IStorage
      • Model
        • GameModel : AbstractModel, IGameModel
      • Controller
        • Game : MonoBehaviour, IController
        • Enemy : MonoBehaviour, IController
        • MissArea : MonoBehaviour, IController
      • Command
        • StartGameCommand : AbstractCommand
        • KillEnemyCommand : AbstractCommand
        • MissCommand : AbstractCommand
        • BuyLifeCommand : AbstractCommand
      • Event
      • System
        • ScoreSystem : AbstractSystem, IScoreSystem
        • CountDownSystem : AbstractSystem, ICountDownSystem
        • AchievementSystem : AbstractSystem, IAchievementSystem
      • UI

QFramework是一个轻量级的游戏框架,并且整合了许多有用工具。源码只有800行不到,这既意味着其源代码足够凝练,不会束手束脚,也意味着在制作自己的游戏的时候,需要扩展和增加一下框架的功能。

QFramework整体基于MVC架构,实现了数据,操作,视图的解耦分层。在中间穿插了Command,Event,Architecture ,System这样的类作为扩展。

基础流程

  1. 全局单例:Architecture类是一个抽象类,使用时使用泛型继承,并重载其Init方法,在里面进行各个模块的注册(System,Model,Utility等)。这里即体现了IOC的思想。
  2. 底层存储:负责进行具体存储的存储类继承自IStorage接口,这是为了方便后续扩展不同的存储类,即面向接口编程(依赖倒置原则)。IStorage接口继承了IUtility接口,这是因为注册和获取时都需要通过RegisterUtility和GetUtility函数。
  3. 上层存储(Model):实现IModel接口,这一层是MVC层中的Model层,Storage层就是从这一层中分离出来的,目的是能够应用各种不同的存储方式和策略。该层会被Command,Controller等层广泛获取,用于存储和修改全局变量。
  4. 控制器(Controller):实现IController接口,该层负责发送Command,触发即使用Monobehavior的函数,如玩家输入,鼠标事件,UI按钮等,具体执行的操作在Command中定义,Event也在Command中进行触发。除此之外该层还负责绑定Event事件到视图更新上。
  5. 视图(View):该层通过绑定Event事件来触发更新
  6. 命令(Command):该类是Controller层发出的,每个Command都继承自AbstractCommand,并重写OnExecute来执行业务逻辑,并按条件触发不同的事件。
  7. 事件(Event):事件是一个什么也不继承的纯结构体,使用扩展泛型方法RegisterEvent进行绑定,CancelEvent进行取消绑定,或者使用链式编程在绑定时即使用CancelOnDestroy(gameObject)简化这一过程。
  8. 系统(System):系统继承自具体的系统接口IxxxSystem和AbstractSystem,这些具体的系统接口继承自ISystem,系统层用于扩展不同的业务功能,比如输入,成就,任务,计时等等高级逻辑。系统层基本基于Event事件触发。

示例程序【PointGame】

该示例程序可以在QFramework的官方Github页面找到,链接如下
github.com/onehundredlines/FrameworkDesign

Architecture

PointGame : Architecture

该层负责注册模块:

  • AchievementSystem : AbstractSystem, IAchievementSystem
  • CountDownSystem : AbstractSystem, ICountDownSystem
  • ScoreSystem : AbstractSystem, IScoreSystem
  • GameModel : AbstractModel, IGameModel
  • PlayerPrefsStorage : IStorage

Storage

PlayerPrefsStorage : IStorage

该层负责具体的存储策略,Demo使用最简单的PlayerPrefs的方法存储数据,并且只提供了按Key读取和存储int类型的接口


Model

GameModel : AbstractModel, IGameModel

该层负责提供全局变量,负责在数据变化时将需要持久化存储的数据通过IStorage进行存储。

内部数据不需要存储的包括:KillCount,Score,HighScore

需要存储的包括:BestScore,Life,Gold


Controller

该层主要负责发送Command,接收Event。

Game : MonoBehaviour, IController

该类负责管理点击的方块的整体显隐和初始化每个方块的显隐状态,基本就相当于游戏场景的开始流程。控制显隐的时机通过注册对应的Event事件来触发。

Enemy : MonoBehaviour, IController

使用OnMouseDown,隐藏自身并发送一个KillEnemyCommand,很合理。

MissArea : MonoBehaviour, IController

使用OnMouseDown,隐藏自身并发送一个MissCommand,很合理。


Command

该层是从Controller层级中抽离出来的具体业务逻辑,其会对Model层进行更改,并发送Event事件供System,View,Controller层响应

StartGameCommand : AbstractCommand

清空GameModel中的KillCount和Score,发送OnGameStartEvent事件。

KillEnemyCommand : AbstractCommand

增加GameModel中的KillCount。并有30%概率为GameModel中的Gold随机增加1~3

发送OnKillEnemyEvent事件,并在KillCount大于等于9时发生OnGamePassEvent事件。

MissCommand : AbstractCommand

减少Gamemodel中的Life值,若该值小于等于0,发送OnMissEvent。

BuyLifeCommand : AbstractCommand

减少Gold值,增加Life值,汇率1:1


Event

该层可被Controller,View,System层进行监听,该Demo所有Event都为struct并且都没有参数,仅做触发使用,并都在上述Command中提及。


System

该层负责较为高级的业务逻辑,具体到该Demo中,包括得分系统,计时系统,成就系统。

ScoreSystem : AbstractSystem, IScoreSystem

重写OnInit(),监听OnKillEnemyEvent和OnMissEvent,增加和减少GameModel的Score值。

监听OnGamePassEvent,更新GameModel的BestScore

CountDownSystem : AbstractSystem, ICountDownSystem

重写OnInit(),监听OnGameStartEvent和OnGamePassEvent,用于设置mStarted这个Flag值以及记录开始游戏时的时间。

成员函数Update,内部在mStarted为true的情况下循环判断游戏时长是否超过十秒,超过则发送OnCountDownEndEvent事件并将mStarted设为false。该Update依赖于Monobehavior的生命周期函数,Demo里直接在UI部分的GamePanel中的Update中调用此函数,有那么一丝丝的简单粗暴。

AchievementSystem : AbstractSystem, IAchievementSystem

这个成就系统是以局为单位的,每局都会重置,也没有持久化存储。就是通过定义了一个AchievementItem类,内部有名称,是否解锁,检查是否完成的函数委托(Func)。

在Init时动态添加到成就列表中,成就条件基本就是把Model中的值掏出来判断一下是否达到,或者绑定事件记录一些flag辅助检查成就。

监听OnGamePassEvent,异步等待0.1f秒,然后遍历成就列表确认哪些满足条件且未解锁过,将其设置为解锁并打印出来


UI

这部分的类都是Monobehavior类,因为需要对UI进行初始化,找到某些按钮组件等,需要借助transform,并且没有使用框架,因此写的有点抽象,但是it just works。

总的来说这一块和Controller没什么不同,寻找按钮然后绑定发送Command,然后监听Event寻找文本进行更新(Demo里有的通过Event有的通过BindableProperty的方式来监听更新,都行)

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

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

相关文章

内网安全-代理技术-socket协议

小迪安全网络架构图: 背景:当前获取window7 出网主机的shell。 1.使用msf上线,查看路由 run autoroute -p 添加路由: run post/multi/manage/autoroute 使用socks模块开启节点,作为流量跳板 msf6 exploit(multi/ha…

如何使用.bat实现电脑自动重启?

1、在电脑桌面新建一个记事本文档,将如下内容写进去: echo off shutdown /r /t 02、然后,保存一下,再把桌面此文件重命名为电脑重启.bat 3、双击此程序,可以立刻重启电脑。 PS:① 此程序会不保存任何当前…

YOLOv11融合CVPR[2024]自适应扩张卷积FADC模块及相关改进思路|YOLO改进最简教程

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《Frequency-Adaptive Dilated Convolution for Semantic Segmentation》 一、 模块介绍 论文链接:https://arxiv.org/abs/2403.05369 代码…

Python 数据文件读写教程

Python 数据文件读写教程 在数据科学和软件开发中,文件的读写操作是至关重要的。Python 作为一门功能强大的编程语言,提供了多种方式来处理文件,包括文本文件、CSV 文件、JSON 文件等。在本教程中,我们将深入探讨 Python 中的数据…

模拟实现优先级队列

目录 定义 特点 构造函数 常用方法 关于扩容的问题 关于建堆的问题 向上调整和向下调整的比较 (向上调整)代码 (向下调整)代码 关于入队列和出队列问题 模拟实现优先级队列代码 关于堆排序的问题 堆排序代码 关于对…

Autosar CP DDS规范导读

Autosar CP DDS 主要用途 数据通信 中间件协议:作为一种中间件协议,DDS实现了应用程序之间的高效数据通信,能够在不同的软件组件和ECU之间传输数据,确保数据的实时性和可靠性。跨平台通信:支持在AUTOSAR CP平台上的不同…

数字IC实践项目(10)—基于System Verilog的DDR4 Model/Tb 及基础Verification IP的设计与验证(付费项目)

数字IC实践项目(10)—基于System Verilog的DDR4 Model/Tb 及基础Verification IP的设计与验证(付费项目) 前言项目框图1)DDR4 Verification IP2)DDR4 JEDEC Model & Tb 项目文件1)DDR4 Veri…

Jmeter中的监听器(三)

9--断言结果 功能特点 显示断言结果:列出所有断言的结果,包括通过和失败的断言。详细信息:显示每个断言的详细信息,如断言类型、实际结果和期望结果。错误信息:显示断言失败时的错误信息,帮助调试。颜色编…

人工智能大比拼(3)

已知x-,y-6,且下述表达式的值与x的取值无关,求y -10x2y7xy 上述这个很简单的数学题,可是在各家AI之间出现了争议,本期我使用了四个AI:kimi,商量,文心一言,chatyy 先来看一下kimi的表…

Xilinx Aurora 8B/10B IP介绍以及下板验证

文章目录 一、什么是Aurora协议?二、Aurora 8B/10B IP核的结构原理三、Aurora 8B/10B IP核 延迟开销四、用户数据接口格式4.1 AXI4-Stream 位排序4.2 帧传输用户端口说明4.3 帧传输数据流程4.4 Aurora 8B/10B 帧格式4.5 帧格式数据传输时序4.5.1 简单数据传输4.5.2 …

Redis8:商户查询缓存2

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…

Camera Tuning中AE/AWB/AF基础知识介绍

3A定义 3A是Camera ISP控制算法的一个重要组成部分,通常分为自动曝光(AE)、自动聚焦(AF)、自动白平衡(AWB)三个组件。 自动曝光(Auto Exposure) AE基本概念 曝光概念…

数据库中的用户管理和权限管理

​ 我们进行数据库操作的地方其实是数据库的客户端,是我们在客户端将操作发送给数据库的服务器(MySQL的服务器是mysqld),由数据库处理之后发送回来处理结果(其实就是一种网络服务)。所以可以存在多个客户端…

ubuntu24.04安装matlab失败

又是摸鱼摆烂的一天,好难过~ 官方教程:https://ww2.mathworks.cn/help/install/ug/install-products-with-internet-connection.html 问题描述:https://ww2.mathworks.cn/matlabcentral/answers/2158925-cannot-install-matlab-r2…

Hive1.2.1与Hbase1.4.13集成---版本不兼容问题

hive与hbase集成失败,汗流夹背了吧老弟......哈哈哈哈,刷到这篇文章,那你可真是太幸运啦~ 常见错误一: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/h…

项目1:井字棋 --- 《跟着小王学Python》

项目1:井字棋 — 《跟着小王学Python新手》 文章目录 项目1:井字棋 --- 《跟着小王学Python新手》目标功能设计1. 数据结构2. 功能模块3. 用户界面 实现步骤代码实现测试注意事项小结 目标 本技术文章旨在指导读者如何使用 Python 编程语言来实现一个简…

Python 的 Pygame 库,编写简单的 Flappy Bird 游戏

Pygame 是一个用 Python 编写的开源游戏开发框架,专门用于编写 2D 游戏。它提供了丰富的工具和功能,使得开发者能够快速实现游戏中的图形渲染、声音播放、输入处理和动画效果等功能。Pygame 非常适合初学者和想要快速创建游戏原型的开发者。 Pygame 的主…

LeetCode-222.完全二叉树的节点个数

. - 力扣(LeetCode) 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一…

【MongoDB】MongoDB的核心-索引原理及索引优化、及查询聚合优化实战案例(超详细)

文章目录 一、数据库查询效率问题引出索引需求二、索引的基本原理及作用(一)索引的创建及数据组织(二)不同类型的索引(三)索引的额外属性 三、索引的优化与查询计划分析(一)通过prof…

企业如何实现无缝数据中心进行大数据迁移呢?

数据中心迁移是企业面临的一个复杂而关键的挑战,涉及到大量的数据移动和系统的重新部署。随着业务的扩展和技术的进步,企业可能需要将数据中心迁移到新的位置或升级到更先进的设备。在进行数据迁移时,必须精心规划和执行,以确保数…