游戏脚本代码大全_JEngine:开箱即用的Unity资源和C#代码热更框架
发布日期:2021-10-31 07:31:39 浏览次数:9 分类:技术文章

本文共 3344 字,大约阅读时间需要 11 分钟。

4d6f4b227f32b584b46cbafc73d4abcb.png

大家好,我是 Jason,独立游戏开发者,目前在澳洲留学,今天为大家介绍我开发的JEngine。

曾经我做过2款游戏,都上过知名游戏平台热门榜前10,新品前5,与此同时,我面临了游戏开发的一大问题:更新频繁,审核过慢。

于是,我找到了解决方案,就是使用热更新。

当时的我,是热更新方面的小白,于是乎选择了某成熟方案,效果达到了我的期盼,可惜接入流程过于繁琐,且一个游戏,一年需要交付5万,这让身为独立开发者的我不太愿意接受。

最终,我开始研究热更新,并开始了自己的框架研发之旅。

JEngine,就是我的作品,以下是JEngine演示视频:

知乎视频​www.zhihu.com

透过视频,可以看到,JEngine支持开发模式和真机模式,开发模式可以从Unity内获取资源,进行加载,而真机模式,需要打包AssetBundles,并上传至资源服务器,才可以运行。

而且,根据视频中控制台的输出,显而易见,JEngine具备了热更性代码完全可以做到热更。

有了JEngine,也就没有必要去花冤枉钱买贵的要命的热更新解决方案了!

那么,JEngine,到底是一个什么样的框架呢?


JEngine项目地址​github.com

JEngine 集成了 XAsset 和 ILRuntime,提供了开箱即用的C#代码和资源热更环境。

JEngine是这样处理热更新的:

d119960dbbbf10759e2a09fa52f421bb.png
JEngine热更流程

通过这个流程图,可以看到,JEngine 主要是整合了 XASSET 和 ILRuntime 达成C#代码热更的基础功能,然而,这仅仅是JEngine的开始。

我们游戏开发者最怕的是什么?莫过于游戏源代码泄露了!

  • 而热更DLL,最容易被别人下载下来后反编译,以查看源代码了,要知道,这可是很危险的!

于是,JEngine对热更DLL做了一层加密

  • C#热更代码生成的DLL会通过AES-128-ECB模式加密进AssetBundle,运行游戏时动态解密

6249cd1e129890ba579ff8c73f160c40.png
热更DLL加密

这个AES加密什么意思呢?有兴趣的可以百度一下,是目前最安全的一种加密方式,穷举法破解,要破解至少几年,所以别人就算想破解你源代码,也得破解几年,到那时候,游戏还在不在都是个问题!更何况,过了几年,源码也不一样了,换个秘钥,又得破解好几年!

够意思吧?

  • 而且,XAsset还支持对AssetBundle,进行VFS处理,进了VFS,AssetStudio这种工具也无法获取你的热更资源,所以你的热更DLL可谓是嵌上了2层龟壳!

有人可能会问,就这样使用XAsset和ILRuntime,经过这2个项目作者的许可了吗?

  • 放心,JEngine是开源的
  • 其次,XAsset和ILRuntime是MIT协议,什么意思呢,就是可以随便进行更改使用
  • 最后,作者也是XAsset以及ILRuntimeU3D项目的贡献开发者成员之一,嘿嘿

Unity热更新还会在开发的时候遇到一个问题,就是,不热更的脚本,可以在Inspector拖拽,进行可视化的GameObject编辑,但是热更代码的脚本,是不允许拖拽到Inspector,进行可视化编辑的,因为热更代码的脚本不存在主工程里,热更新后会引发丢失。

通常来讲,我们想要动态将热更新的脚本添加,并进行操作,要这样进行:

var

这样,通常添加一个脚本,就要十几~几十行代码,添加n个,就是不小的负担,这让很多已经上线的项目,不可能移植到热更新框架,代价很大

但是,JEngine就做出了解决方案,可以通过C#反射动态绑定脚本且赋值

废话不多说,直接上图:

4d12ac35a8c989d61f12198d75ed54ad.png
自动绑定赋值热更脚本

只需要给热更场景中的GameObject,或Prefab,加上AutoBind脚本,配置热更脚本的命名空间、类名、想要赋值的参数的数值,即可,支持获取任何场景中物体的组件,非常的方便,这样一配置,就能节约上百行,甚至更多的代码!

这样一来,JEngine可以轻松接入项目,再大的项目,几天就能完全接入,具备热更性能,而小项目,一天以内就能接入热更!

好了,JEngine热更新功能的介绍到此为止,下面说说JEngine的一些其他特性。


JEngine除了热更,还有很多很多功能,只有你想不到的,没有JEngine不可能实现的(只要作者接触过有案例的)

Action队列解决方案

  • 更少的代码,实现更多功能,效率大幅度提高
  • 轻松执行、延时、等待、定期循环、条件循环、同步/异步运行、取消队列
  • 可选择在主线程运行代码(子线程无法运行Unity内部API)
JAction

是不是很酷很强大?

该设计的目的,在于让开发者可以用更少的代码做更强的功能。

我们可以用异步来进行条件等待,可以用for循环,也可以Task.Delay来延时,但是这样写,需要很多代码,且并不是那么美观JAction,底层用几百行代码,封装了这些功能,提供了精简的API,可以让开发者轻松完成这些功能

同样的效果,JAction仅需十几行,而其他方式(例如写async void / async Task),需要JAction的两倍及以上!

UI解决方案

  • 轻松管理UI周期链式编程让代码更美观
  • UI定期循环更新?再也不是问题!
    • 可以选择毫秒更新或帧更新,可以指定更新频率
  • UI绑定数据?轻松搞定!
    • UI和数据绑定,当数据更新,即可执行绑定的方法
//循环更新

有的时候,UI需要定期循环,放在Update里,是非常不好的习惯,Update可谓Unity的性能杀手,而JUI,可以轻松设置循环模式和频率,可以毫秒循环,也可以循环。

与此同时,JUI还可以将UI控件与数据绑定,当数据更新,会唤起JUI相对于的更新方法,这样一来,最为优化性能

基于MonoBehaviour扩展的生命周期

  • 轻松管理生命周期
    • 类似JUI,可以调整循环频率,或者不循环
public

JBehaviour基于MonoBehaviour,却对Mono的循环进行了一次优化抛弃Update内部运用异步完成了循环,支持帧循环毫秒循环,也可以轻松定频率

基于XAsset的资源加载方案

  • 支持同步/异步加载资源
  • 泛型方法,轻松使用
//同步阻塞加载

XAsset提供的资源加载,非常的好用,可能唯一的美中不足就是不支持泛型了,在这里,JEngine对XAsset进行了封装,使其支持泛型

对象池解决方案

  • 支持针对Prefab生成对象池
  • 大幅度提升性能及内存开销,相比于常规Instantiate操作
  • 无需重复创建新对象!
  • 智能算法,贪心算法匹配GameObject,对象池满可自动添加!

有没有遇到过必须循环Instantiate的情况?比如生成子弹?

如果有,是否关注过内存开销,是不是会被吓一跳?

在这里,就不得不用对象池了,使用对象池,内存开销少一半!

Redis可视化管理工具

  • SSH连接,安全高效!
  • 常规连接,IP+端口连接
  • 支持常规Key-Value数据增删改查

演示视频:

知乎视频​www.zhihu.com

有的时候,游戏需要联网,并且数据会存进数据库,这里提供了一个基础的可视化面板,管理Redis数据库,支持SSH和基础连接,可对数据进行增删改查,非常的方便!


怎么样,对JEngine的功能满意不

还不满意?没关系,快进QQ群,和作者讨论还需要什么功能吧!

QQ群号:921271552

正在跳转​jq.qq.com

怕大家忘了项目地址,再附上一个,项目地址里有中英文双语文档,且大部分功能的介绍,API,都一应俱全

JEngine地址​github.com

如果觉得JEngine有用,欢迎给该项目Star哦~

目前JEngine的star已破百,我将会在近期进行一次直播,以介绍框架完整流程为主,并会介绍JEngine的各种骚操作,让大家更了解该框架,详情可进群关注!

在最后,和大家推荐一下我的另外一个作品。

XASSET 5.1的官网,XASSET 5.1是XASSET开源项目的商业版,提供了更强大资源分包和热更功能,目前我也在使用这个开发自己的独立游戏。

下面是它的首页,真的很棒!

48f82578bfcc02725525754feea3accd.png
XAsset新官网

感谢各位的阅读!

转载地址:https://blog.csdn.net/weixin_39934257/article/details/109998169 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:python字符串变量_Python变量与字符串
下一篇:python第五周小测验答案_Python 第五周作业

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月14日 19时45分42秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章