众所周知,目前 ILRuntime 已经成为新项目主流的热更方案,相比于传统各种Lua的热更方案来说,ILRuntime有着更高的开发效率和更低的学习成本,同时通过编译成dll热更新,比起lua脚本来说,封装更加整洁和可控。目前ILRuntime已经成为Unity主推的一款热更方案。
安装和demo路径直接参考前人的教程,这里不多赘述
HelloWorld在运行测试完官方demo中的HelloWorld项目之后(如果没测试完,请按照上面的链接继续看),开始进行测试
- 在热更内容中创建自定义类
public static void StaticFunTest()
{
//UnityEngine.Debug.Log("!!! InstanceClass.StaticFunTest()");
StaticTest();
var testA = new TestAClass();
testA. log();
}
class TestAClass
{
public void Log()
{
UnityEngine.Debug.LogWarning("LOGLOGLOG");
}
}
- 在热更类中引用UnityEngine和UnityEngine.UI命名空间,并获取创建UI
这里要注意的是,button的点击事件类型是UnityAction,直接使用ILRuntime会报错(KeyNotFound),需要去ILRuntime中注册UnityAction委托的转换器,具体教程也在上面链接中。
public static void StaticFunTest()
{
//UnityEngine.Debug.Log("!!! InstanceClass.StaticFunTest()");
StaticTest();
var testA = new TestAClass();
testA.CreatUI();
}
public void CreatUI()
{
var obj = GameObject.Find("UIManager");
var containerA = obj.GetComponent();//自定义容器类,存放组件
var canvnsA = GameObject.Instantiate((GameObject)containerA.Canvns,containerA.transform);
canvnsA.GetComponent
- 在热更内部使用ref和out
public static void StaticFunTest()
{
var testA = new TestAClass();
int a = 5;
int b;
testA.RefCheck(ref a, out b);
Debug.LogFormat("{0} AND {1}!",a,b);
}
public void RefCheck(ref int A,out int B)
{
B = A;
}
顺带一提,ILRuntime的跨域继承只能支持一个有Unity主工程的类或者接口,但是可以有随便多少个热更DLL中的接口,所以尽可能的减少跨域访问(可能需要自己写委托或者类型的适配器)和继承,以免带来不必要的麻烦。
结论综合上面结论,理想情况就是所有需要热更的代码(主要是UI和各种游戏系统相关逻辑,表现层东西为主)都封装在一个dll里面,然后给出统一的运行接口由ILRuntime来驱动,调用unity层控件。相关需要的逻辑就在热更dll里面自洽(内部你怎么玩都没大问题)。unity层脚本只作为工具控件类,不要去主动调用热更层。



