Unity HybridCLR + Xlua + Addressable 要点记要

  • Post author:
  • Post category:其他




接入缘由

老工程原本是C#,想做热更,于是接入了Xlua和Addressable。由于工程老,人手也不够,只是新代码使用Xlua,老功能(尤其是核心战斗还是C#)。大半年后觉得并不能达到预期需求。于是通过再接入Hybrid来解决最终问题。

HybridCLR 的接入,以及原理这里就不重复说明了,在官网上有非常详细的教程

Github:https://github.com/focus-creative-games/hybridclr


接入过程中出现的错误,第一时间查看官网的“常见错误”。能解决绝大多数问题



Xlua相关注意事项:

  • Hybrid 不支持 GetCompent(“xxxx”) 的使用方式,需要统一改成GetCompnent(typeof(CS.xxx.xxx))
  • 所有的外部方法(extern) 都不能作为热更代码。

    很多插件,包括XLua,在调用IOS原生代码时,都会使用外部方法。如果这些代码被打包进热更代码,这些外部方法都会被裁减掉。处理其他插件时,只需要把整个插件移入非热更程序集(AOT)中就行了。但是XLua由于Warp文件的特殊原因,不能直接这么做。



    处理方式:

  • 将xLua原生代码拆分成两部分,编辑器脚本放在主工程,其他部分放在Hotfix工程.
  • 修改LuaDLL.cs,原生LuaDLL.cs放在主工程并将namespace修改为其他名称(比如XLuaBase),新的LuaDLL.cs放在Hotfix工程,其中,Hotfix工程里的LuaDLL.cs调用主工程里的函数.
  • 修改xLua相关的模板文件(*.tpl.txt),将using LuaCSFunction = XLua.LuaDLL.lua_CSFunction; 全局替换为 using LuaCSFunction = XLuaBase.lua_CSFunction;
  • 一些方法中不可见的枚举值参数,直接修改为int



HybridCLR + XLua 示例项目

https://gitee.com/ldr123/HybridCLRXlua



Addressable注意事项

  • addressable 不能直接加载以为Dll或者bytes后缀的文件。

    所有通过Hybrid打出热更dll后,需要将其改为txt后缀,再通过Addressables.LoadAssetAsync加载。并且,可以对热更dll进行加密,来增加安全性。
TextAsset hotfixDll = Addressables.LoadAssetAsync<TextAsset>($"ExtensionRes/Extension_{i}").WaitForCompletion();
byte[] encryptBytes = hotfixDll.bytes; // 得到加密的代码数据
byte[] decryptBytes = Security.XXTEA.Decrypt(encryptBytes, PreloadConst.GetDK()); //解密代码
var gameAss = System.Reflection.Assembly.Load(decryptBytes);// 加载到内存中
  • 不能完全依靠addressable 的Check for Content Update功能。

    如果你修改了某个代码文件,并打好了热更资源。然后使用此功能。所有依赖此代码资源文件(prefab、scriptobject)全会被标记已改变。经本人测试,这些资源完全没有更新必要。所以这里可能需要自己创建额外的资源管理工具来辅助检查。

  • 另外两个Addressable设置问题(





    在这里插入图片描述

  • Unique Bundle IDs 如果打勾。可能会造成丢失一些资源的引用。

  • MonoScript Bundle Naming Prefix 使用Defuat Group GUID打包。然后会生成有一个monoscript.Bundle在默认组里面。如果更新时增加新的Mono脚本,务必将monoscript.Bundle 一起更新。否则挂载新的脚本的Prefab会丢失此脚本。

暂时就这些了。发现新问题会补充。也欢迎交流哈



版权声明:本文为weixin_38027841原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。