【OpenSourceC#】JEngine框架

news2025/1/13 7:54:50

前言

一个完全依赖ILRuntime的框架,集成好了ILRuntime和AB资源热更,想用ILRuntime的可以很方便使用。

对着作者的文档JEngine看看框架功能都是怎么实现的。

看下文档中提到的功能如下
在这里插入图片描述

JEngine框架核心

热更资源工具

AssetMgr,框架集成了BuddleMaster来管理AB包,这是对BuddleMaster功能的封装

对象绑定工具

与xlua中的绑定脚本方式和功能类似

扩展方法工具

这名字很形象,就是一些扩展方法

内存加密方案

说过了,看这个:【反外挂】内存加密与监视

队列任务方案

JAction,挺不错的,不过要依赖ETTask和生面周期方案

生命周期方案

LifeCycleMgr

这个是实现了一个LifeCycleMgr,该脚本继承MonoBehaviour。

管理需要在生命周期调用的Item
在这里插入图片描述
可以自己看一下Update的实现方法就知道了,在Update中遍历上图中_updateItem里的Item,执行他们的action回调。

代码逻辑不复杂自己看一下就知道了。

LifeCycleItem

如果想让这个脚本管理生命周期,就实现LifeCycleItem,结构也很简单,主要是一个回调方法。
在这里插入图片描述

JBehaviour

所有继承该类的都加入JBehavioursList里
在这里插入图片描述
在静态构造中把loop加入到生命周期管理
在这里插入图片描述
其中UpdateCheck 是遍历JBehavioursList,检查挂在此脚本物体的状态,对JBahaviour做出相应的增删处理
JBehavioursLoop 是调用jb的Loop注册事件。
这个Loom是Unity工程里的,就是事件队列的常见使用方式,作用一个就是对事件的下一帧处理,另一个就是处理需要主线程处理的事件。
如果看看Loom代码就知道这里只会调用一次JBehavioursLoop 函数,我就一直纳闷这到底是怎么实现循环调用的呢???

一直以为是Loom或者JBehaviour在其他地方有注册,漏看了什么逻辑,看了好一会儿才发现原来JBehavioursLoop 这函数是个死循环…JBehavioursLoop 里可以控制Loop的间隔
![在这里插入图片描述](https://img-blog.csdnimg.cn/66ccd29c284a41338ecd40e06ac68700.png

以上只是看了个大概,具体细节先不深究

数据存储方案

就是对prefabs的一层封装

单例解决方案

单例都是必须的吧

需要注意的是mono单例有几种不同的实现方式,主要分为单例是否创建对象,这个框架是如果不存在就创建个GO挂载上去
在这里插入图片描述

事件派发方案

就是事件系统,不过这个实现的事件系统和常见的不太一样

常见的都是事件中心模式,一个事件绑定对应的Action,触发了就调用所有Action。

作者也说了是借鉴EventBus的方式,和传统方法的区别就是,传统方法是观察者模式,这个方法是发布-订阅者模式

订阅者(Subscriber)把自己想订阅的事件(Event)注册(register)到调度中心(EventBus),当发布者(Publisher)发布该事件到调度中心时,也就是该事件触发时,由调度中心统一调度订阅者注册到调度中心的处理代码(onEvent())。(发布/订阅者模式与观察者模式并不完全一样)

参考:EventBus 实战(一、使用详解篇)

这个要理解订阅着,发布者和数据,以JEngine中的实现为例(例子看EventDemo.cs)
JEvent.defaultEvent 是一个发布者,LoginSuccessData是数据,订阅者是打上Subscribe标签的类和方法。
一个订阅者可以订阅多个发布者,一个发作者可以给多个订阅者发布事件,事件在这里就是数据。
发布之后自动调用订阅者中参数为这个数据的函数。

和传统的观察者模式实现的事件系统的区别是,观察者模式是注册事件对应的响应方法。
订阅发布模式的是订阅者里主动注册。(JEngine这个Demo写的不太好,应该在各个类里面自己调用JEvent.defaultEvent.Register)订阅发布模式用事件来称呼不太好理解,用总线(Bus)就好理解了,订阅者订阅需要的n个Bus,发布者往Bus里发数据,谁订阅了谁就能收到。这里订阅者不只是一个方法,可能是一个类里的多个方法。

这么一看实际上两者区别也不大,个人感觉传统的观察者模式更简单直观些。

可绑定数据方案

BindableProperty,这个功能在QFramework中见过,基本一模一样,作者说是他原创的,可能是QFramework借鉴这个的吧,对这个不深究 o.O

之前写QFramework时讲过,就是对值变化这种情况加了个响应事件,比如ui显示,值变化了就改变ui。

预制体管理方案

自实现JPrefab,代码没多少,实际上是对GameObject包了一层,实现了个异步加载。用List统一管理该预制体物体。

感觉这个功能可以合并到对象池里。

验证器校验方案

对字符串的常用校验方式进行了封装,通过string类型的condition来指定校验方式
在这里插入图片描述
不错的工具

序列化助手方案

这个没什么说的,只是对json库和protobuf库又包了一层

对象池解决方案

就是普通对象池功能,而且写的太简单了,没有回收功能,目测使用的时候要自己通过gameObject.SetActive(false)来回收。

从池中取的时候在一个List里找没激活的返回。

不推荐使用,如果要用对象池,就应该由池来管理spawn和respawn,不然用这用这就迷了。

多语言解决方案

实际就是读表,存一个map<语种,map<key, value>>类型,切换语言时就用不同语种的map
在这里插入图片描述
需要统一管理文本,所以所有需要文本的地方都需要挂在一个LocalizedText 脚本,切换语种的时候所以文本更新一遍
在这里插入图片描述
突然发现个问题,这种方式如果文本销毁了,没有删除这个引用。

不是很推荐用这个,因为每个Text都要挂脚本,强依赖这个脚本,等Text多的时候就很乱。

如果是通过读表实现的话,实际上还是动态读表比较好,就是需要设置文本的地方,通过读表的方式获得具体文本。

长联网解决方案

自实现的一套网络socket管理方案,没什么可说的

总结

总结一下比较有特色的,可以借鉴学习的模块:脚本绑定,事件队列JAction,生命周期管理,内存加密方案。

其他都是一些小功能。

如果想用ILRuntime热更,这个框架集成好了,还集成好了BuddleMaster资源热更,比自己去集成省事,BindClass功能也挺方便。其他功能自己可以根据需求做增删。

不过ILRuntime我感觉还是挺麻烦的,还有各种限制(关于热更使用Mono,使用接口等),坑比xlua还多,没有大佬带着的话还是不自己折腾了,如果要折腾不如去看现在比较火的HybirdCLR。

目前也看了好几个框架了,
QFramwork最精简,只有核心的mvc层级控制,业务逻辑功能全部要自己写。
GameFramework最重,功能很全,但是得按照框架指定的方式写,特别是UI,用起来有点儿不舒服。
公司的框架,c# 与xlua实现的MVC模式。
xlua-framwork,想用纯lua开发的框架,但是呢,lua还是适合写一下ui和简单代码吧,这个框架自定义了类和UIComponent控制,用lua实现了事件系统等,熟悉了也能用,但问题就是不想去熟悉,而且作者貌似不维护了。
JEngine,没有游戏逻辑层框架,都是提供一些工具,话说可以和QFramwork结合使用。

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

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

相关文章

询盘回复流程及外贸11步流程

询盘回复流程&#xff1a; 从事外贸的新手经常在网上寻找各种各样的外贸干货知识。其实&#xff0c;你不仅要关注某个环节的小细节&#xff0c;还要有“宏观”的思维。分过程、分步骤地梳理外贸工作&#xff0c;是外贸工作中十分重要的一个环节。今天&#xff0c;按照一般的回…

点云中点法向量,点拟合的直线,点拟合的平面

点云中点法向量 计算步骤&#xff1a; 找到点pi相邻点集合S所有点Vi,然后去中心化,并构造协方差矩阵,公式如下: 二维点云该点曲率计算方法&#xff1a; 三维点云该点曲率计算方法&#xff1a; 最小特征值对应的特征向量就是点的法向量 Eigen::Vector2d ComputeNormal(std::v…

m基于BP神经网络的房屋价值变换趋势预测matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 住宅价格是住宅市场的核心&#xff0c;住宅市场的变化关系到广大消费者的切身利益&#xff0c;商品房价格是升是降&#xff0c;销售是冷是旺&#xff0c;是社会关注的热点问题。因此&#xff0c;…

Mybatis-Plus 入门

文章目录0. 前言1. 相关概念1.1 名称介绍1.2 官网特性介绍2. 快速入门2.1 准备工作2.2.1 准备表2.2.2 创建工程2.2 入门测试2.2.1 编写实体类2.2.2 编写Mapper2.2.3 编写测试类3. CRUD3.1 条件构造器3.1.1 AbstractWrapper&#xff08;1&#xff09; 基本比较操作&#xff08;2…

想做数码管显示,单片机IO口资源不够?看看WTV890语音芯片能做些啥

在开发许多产品时许多工程师都会遇到以下问题&#xff0c;如&#xff1a;想驱动4位或10位的LED数码管显示&#xff0c;但是单片机的IO口不够用&#xff1b;要么更换IO口资源更多的MCU来控制&#xff0c;要么更换脚位丰富的单片机&#xff0c;这无疑在MCU上&#xff0c;加了1元左…

在Linux中使用at和crontab命令在指定时间计划任务服务程序

经验丰富的系统运维工程师可以使得Linux在无需人为介入的情况下&#xff0c;在指定的时间段自动启用或停止某些服务或命令&#xff0c;从而实现运维的自动化。尽管我们现在已经有了功能彪悍的脚本程序来执行一些批处理工作&#xff0c;但是&#xff0c;如果仍然需要在每天凌晨两…

2023年电气,电子与信息工程国际会议(ISEEIE 2023)

2023年电气&#xff0c;电子与信息工程国际会议&#xff08;ISEEIE 2023&#xff09; 重要信息 会议网址&#xff1a;www.iseeie.org 会议时间&#xff1a;2023年2月24-26日 召开地点&#xff1a;新加坡 截稿时间&#xff1a;2022年12月31日 录用通知&#xff1a;投稿后2周…

Mac如何做才能彻底清理垃圾

Mac磁盘空间又爆满了&#xff1f;系统运行又卡了&#xff1f;你的Mac需要清理内存缓存垃圾啦&#xff01;本文教会你如何彻底清除Mac垃圾文件&#xff0c;释放存储空间。 现在&#xff0c;Mac电脑最顶配的硬盘可达2TB。这么大的容量&#xff0c;应该够用了吧&#xff1f;可真正…

windowsserver2016安装

vmware安装windowsserver2016: 开始安装OpcServer服务器端&#xff1a; DOM配置过程&#xff1a; 1.设置OpcServer和OpcClient相同的administrator账号和密码 administrator、wong123 2.关闭OpcServer和OpcClient的防火墙 3.开启OpcServer和OpcClient远程桌面访问 4.OpcServe…

玩以太坊链上项目的必备技能(OOP-合约继承-Solidity之旅九)

继承 我们今天不讲别的&#xff0c;就只讲合约继承相关的内容。&#xff08;您是不是感觉这话挺眼熟的&#xff0c;没错&#xff0c;您确实看过&#xff0c;前一篇开头便是今天我们不讲三国&#xff0c;来讲讲 流程控制&#xff0c;您会觉得我上头了还是怎么&#xff01;&…

Java-数据库范式与表关系

数据库范式 数据库范式简介 什么是范式&#xff08;NF NormalForm&#xff09; ● 范式是符合某一种设计要求的总结 在数据库中表的设计&#xff0c;必须保证其合理性 ● 数据库表的设计关系整个系统的架构&#xff0c;关系到后续的开发效率和运行效率 如何设计合理的数据库…

【leetcode】二叉树的最近公共祖先

一、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也…

在职位招聘数据处理中使用Loess回归曲线以及分箱、回归、聚类方法 检查离群点及光滑数据【数据挖掘机器学习】

文章目录一.需求分析二.使用局部回归&#xff08;Loess&#xff09;曲线&#xff08;增加一条光滑曲线到散布图&#xff09;方法处理数据三.使用分箱、回归、聚类方法 检查离群点及光滑数据&#xff1b;一.需求分析 本文主题&#xff1a;使用局部回归&#xff08;Loess&#x…

Jmeter(十九):nmon性能系统监控工具

一、Nmon介绍 Nmon得名于 Nigel 的监控器&#xff0c;是IBM的员工 Nigel Griffiths 为 AIX 和 Linux 系统开发的&#xff0c;使用 Nmon 可以很轻松的监控系统的CPU、内存、网络、硬盘、文件系统、NFS、高耗进程、资源和 IBM Power 系统的微分区的信息 Nmon是一款计算机性能系…

【JavaEE】HTTP + HTTPS(Part2 )

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录【HTTP响应详解】1. 认识状态码2.认识响应“报头”header3.认识响应“正文”body【通过 Java socket 构造 HTTP 请求】三、HTTPS四、Tomcat&#xff1a;http服务器THINK一个人最大的痛苦来源于对自己无能的愤怒。 【…

Pycharm SQL 警告:SQL dialect is not configured.

Pycharm SQL 警告&#xff1a;SQL dialect is not configured. 文章目录Pycharm SQL 警告&#xff1a;SQL dialect is not configured.Unable to resolve symbol XXX在我们编写python代码的时候&#xff0c;不免会在代码里面写入自己写的sql语句&#xff0c;因为很少有orm框架能…

JVM Java内存模型(JMM)

很多人将Java内存结构与Java内存模型傻傻分不清&#xff0c;Java内存模型是Java memory model&#xff08;JMM&#xff09;的意思。简单地说&#xff0c;JMM定义了一套在多线程的环境下读写共享数据&#xff08;比如成员变量、数组&#xff09;时&#xff0c;对数据的可见性、有…

浪潮开务数据库陈磊:布局数字能源,创新助力 “双碳”

​当前&#xff0c;碳中和、碳达峰无疑是国际社会最关注的热点之一。2021 年两会上&#xff0c;我国提出&#xff1a;二氧化碳排放力争于 2030 年前达到峰值&#xff0c;努力争取 2060 年前实现碳中和。“双碳” 目标的提出将推动产业转型升级&#xff0c;提高经济增长质量&…

【LeetCode题目详解】(二)206.反转链表、876.链表的中间结点

目录 一、力扣第206题&#xff1a;反转链表 1.思路一 2.思路二 二、力扣第876题&#xff1a;链表的中间结点 1.思路一 2.思路二 总结 一、力扣第206题&#xff1a;反转链表 题目链接&#xff1a;206. 反转链表 - 力扣&#xff08;Leetcode&#xff09; 题目描述&#xff1…

gitee学习笔记(使用命令行上传、拉取资料)

1、创建一个仓库(比如命名为firstgit) 2、在文件夹中准备好要上传的资料 3、单击鼠标右键&#xff0c;打开Git Bash Here 进行命令行操作&#xff08;当然&#xff0c;前提是需要安装git客户端&#xff0c;可去官网安装&#xff09; 4、上传文件 ①git init //文件初始…