找回密码
 立即注册
查看: 891|回复: 0

[笔记] JEngine:开箱即用的Unity资源和C#代码热更框架

[复制链接]
发表于 2020-12-15 09:14 | 显示全部楼层 |阅读模式
大家好,我是 Jason,独立游戏开发者,目前在澳洲留学,今天为大家介绍我开发的JEngine。
曾经我做过2款游戏,都上过知名游戏平台热门榜前10,新品前5,与此同时,我面临了游戏开发的一大问题:更新频繁,审核过慢。
于是,我找到了解决方案,就是使用热更新。
当时的我,是热更新方面的小白,于是乎选择了某成熟方案,效果达到了我的期盼,可惜接入流程过于繁琐,且一个游戏,一年需要交付5万,这让身为独立开发者的我不太愿意接受。
最终,我开始研究热更新,并开始了自己的框架研发之旅。
JEngine,就是我的作品,以下是JEngine演示视频:
透过视频,可以看到,JEngine支持开发模式和真机模式,开发模式可以从Unity内获取资源,进行加载,而真机模式,需要打包AssetBundles,并上传至资源服务器,才可以运行。
而且,根据视频中控制台的输出,显而易见,JEngine具备了热更性代码完全可以做到热更。
有了JEngine,也就没有必要去花冤枉钱买贵的要命的热更新解决方案了!
那么,JEngine,到底是一个什么样的框架呢?
JEngine 集成了 XAsset 和 ILRuntime,提供了开箱即用的C#代码和资源热更环境。
JEngine是这样处理热更新的:
JEngine热更流程
通过这个流程图,可以看到,JEngine 主要是整合了 XASSET 和 ILRuntime 达成C#代码热更的基础功能,然而,这仅仅是JEngine的开始。
我们游戏开发者最怕的是什么?莫过于游戏源代码泄露了!
    而热更DLL,最容易被别人下载下来后反编译,以查看源代码了,要知道,这可是很危险的!
于是,JEngine对热更DLL做了一层加密
    C#热更代码生成的DLL会通过AES-128-ECB模式加密进AssetBundle,运行游戏时动态解密
热更DLL加密
这个AES加密什么意思呢?有兴趣的可以百度一下,是目前最安全的一种加密方式,穷举法破解,要破解至少几年,所以别人就算想破解你源代码,也得破解几年,到那时候,游戏还在不在都是个问题!更何况,过了几年,源码也不一样了,换个秘钥,又得破解好几年!
够意思吧?
    而且,XAsset还支持对AssetBundle,进行VFS处理,进了VFS,AssetStudio这种工具也无法获取你的热更资源,所以你的热更DLL可谓是嵌上了2层龟壳!
有人可能会问,就这样使用XAsset和ILRuntime,经过这2个项目作者的许可了吗?
    放心,JEngine是开源的其次,XAsset和ILRuntime是MIT协议,什么意思呢,就是可以随便进行更改使用最后,作者也是XAsset以及ILRuntimeU3D项目的贡献开发者成员之一,嘿嘿
Unity热更新还会在开发的时候遇到一个问题,就是,不热更的脚本,可以在Inspector拖拽,进行可视化的GameObject编辑,但是热更代码的脚本,是不允许拖拽到Inspector,进行可视化编辑的,因为热更代码的脚本不存在主工程里,热更新后会引发丢失。
通常来讲,我们想要动态将热更新的脚本添加,并进行操作,要这样进行:
  1. var XXX = GameObject.Find("xxxx").AddComponent<XX>();//手动添加脚本
  2. XXX.enabled = false;//不让脚本执行
  3. XXX.xxxField1 = xxxxxx;//手动赋值*1
  4. XXX.xxxField2 = xxxxxx;//手动赋值*2
  5. XXX.xxxField3 = xxxxxx;//手动赋值*3
  6. //...
  7. XXX.enabled = true;//激活
  8. XXX.Awake();//重新执行Awake
复制代码
这样,通常添加一个脚本,就要十几~几十行代码,添加n个,就是不小的负担,这让很多已经上线的项目,不可能移植到热更新框架,代价很大
但是,JEngine就做出了解决方案,可以通过C#反射动态绑定脚本且赋值
废话不多说,直接上图:
自动绑定赋值热更脚本
只需要给热更场景中的GameObject,或Prefab,加上AutoBind脚本,配置热更脚本的命名空间、类名、想要赋值的参数的数值,即可,支持获取任何场景中物体的组件,非常的方便,这样一配置,就能节约上百行,甚至更多的代码!
这样一来,JEngine可以轻松接入项目,再大的项目,几天就能完全接入,具备热更性能,而小项目,一天以内就能接入热更!
好了,JEngine热更新功能的介绍到此为止,下面说说JEngine的一些其他特性。
JEngine除了热更,还有很多很多功能,只有你想不到的,没有JEngine不可能实现的(只要作者接触过有案例的)
Action队列解决方案
    更少的代码,实现更多功能,效率大幅度提高!轻松执行、延时、等待、定期循环、条件循环、同步/异步运行、取消队列可选择在主线程运行代码(子线程无法运行Unity内部API)
  1. JAction j = new JAction();
  2. j.Do(() => something toDo)
  3.   .Until(() => something is done)
  4.   .Repeat(() => something toDo, repeatCounts)
  5.   .RepeatWhen(() => something toDo,
  6.               () => condition)
  7.   .Delay(some times)
  8.   .Execute();
复制代码
是不是很酷很强大?
该设计的目的,在于让开发者可以用更少的代码做更强的功能。
我们可以用异步来进行条件等待,可以用for循环,也可以Task.Delay来延时,但是这样写,需要很多代码,且并不是那么美观JAction,底层用几百行代码,封装了这些功能,提供了精简的API,可以让开发者轻松完成这些功能
同样的效果,JAction仅需十几行,而其他方式(例如写async void / async Task),需要JAction的两倍及以上!


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

  1. //循环更新
  2. var JUI = Showcase.AddComponent<JUI>()
  3.   .onLoop(t1 =>
  4.           {
  5.             ...
  6.           })
  7.   .Activate();
  8. //调整频率
  9. t.FrameMode = false;//Run in ms
  10. t.Frequency = 1000;//Loop each 1s
  11. //数据绑定
  12. var JUI = b.AddComponent<JUI>()
  13.   .Bind(data.b)
  14. .onMessage(t1 =>
  15.              {
  16.              ...
  17.              })
  18. .Activate();
复制代码
有的时候,UI需要定期循环,放在Update里,是非常不好的习惯,Update可谓Unity的性能杀手,而JUI,可以轻松设置循环模式和频率,可以毫秒循环,也可以循环。
与此同时,JUI还可以将UI控件与数据绑定,当数据更新,会唤起JUI相对于的更新方法,这样一来,最为优化性能


基于MonoBehaviour扩展的生命周期
    轻松管理生命周期
      类似JUI,可以调整循环频率,或者不循环

  1. public class JBehaviourExample : JBehaviour
  2. {
  3.   public override void Init()
  4.   {...}
  5.   public override void Run()
  6.   {...}
  7.   public override void Loop()
  8.   {...}
  9.   
  10.   public override void End()
  11.   {...}
  12. }
复制代码
JBehaviour基于MonoBehaviour,却对Mono的循环进行了一次优化抛弃Update内部运用异步完成了循环,支持帧循环毫秒循环,也可以轻松定频率


基于XAsset的资源加载方案
    支持同步/异步加载资源泛型方法,轻松使用
  1. //同步阻塞加载
  2. TextAsset txt = JResource.LoadRes<TextAsset>("Text.txt");
  3. Log.Print("Get Resource with Sync method: " + txt.text);
  4. //异步回调加载
  5. JResource.LoadResAsync<TextAsset>("Text.txt",(txt)=>
  6. {
  7.   Log.Print("Get Resource with Async method: " + txt.text);
  8. });
复制代码
XAsset提供的资源加载,非常的好用,可能唯一的美中不足就是不支持泛型了,在这里,JEngine对XAsset进行了封装,使其支持泛型


对象池解决方案
    支持针对Prefab生成对象池大幅度提升性能及内存开销,相比于常规Instantiate操作无需重复创建新对象!智能算法,贪心算法匹配GameObject,对象池满可自动添加!
有没有遇到过必须循环Instantiate的情况?比如生成子弹?
如果有,是否关注过内存开销,是不是会被吓一跳?
在这里,就不得不用对象池了,使用对象池,内存开销少一半!


Redis可视化管理工具
    SSH连接,安全高效!可常规连接,IP+端口连接支持常规Key-Value数据增删改查
演示视频:
有的时候,游戏需要联网,并且数据会存进数据库,这里提供了一个基础的可视化面板,管理Redis数据库,支持SSH和基础连接,可对数据进行增删改查,非常的方便!
怎么样,对JEngine的功能满意不
还不满意?没关系,快进QQ群,和作者讨论还需要什么功能吧!
QQ群号:921271552
怕大家忘了项目地址,再附上一个,项目地址里有中英文双语文档,且大部分功能的介绍,API,都一应俱全
如果觉得JEngine有用,欢迎给该项目Star哦~
目前JEngine的star已破百,我将会在近期进行一次直播,以介绍框架完整流程为主,并会介绍JEngine的各种骚操作,让大家更了解该框架,详情可进群关注!
在最后,和大家推荐一下我的另外一个作品。
XASSET 5.1的官网,XASSET 5.1是XASSET开源项目的商业版,提供了更强大资源分包和热更功能,目前我也在使用这个开发自己的独立游戏。
下面是它的首页,真的很棒!
XAsset新官网
感谢各位的阅读!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-23 12:56 , Processed in 0.094953 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表