欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

InjectFix 代码热更

程序员文章站 2022-07-12 15:47:41
...

InjectFix 是腾讯最近刚开源的新的热更方案,XLua的升级版。无需写Lua代码。可以直接在Unity工程上修改C#即可更新,老项目无需修改原有代码即可使用。符合苹果热更新条款。

下载地址:https://github.com/Tencent/InjectFix

下载解压后,找到VSProj 文件夹下的

InjectFix 代码热更

打开编辑,修改UNITY_HOME变量的值修改为指向本机unity安装目录

InjectFix 代码热更

保存之后 ,双击bat文件。运行成功后在UnityProj文件夹下的plugins 文件夹下会有一个IFix.Core.dll文件。

将下载的UnityProj 下面的IFixToolKit 文件夹 拷贝到项目工程 和Assets 同级目录下。

InjectFix 代码热更

以及这两个文件夹放到Assets下。

创建一个自己工程的热更配置类,IFix\Editor文件夹下。对热更的类进行预处理。

下面是对某个命名空间下所有类型(除了匿名类),动态配置方式,省去一个个配。

[Configure]
public class MyConfig 
{
    [IFix]
    static IEnumerable<Type> ToProcess
    {
        get
        {
            return (from type in Assembly.Load("Assembly-CSharp").GetTypes()
                    where type.Namespace == "MyGame" && !type.Name.Contains("<")
                    select type);
        }
    }
}

创建示例Demo

namespace MyGame
{
    public class TestScr : MonoBehaviour
    {

        private void Start()
        {
            this.GetComponent<MeshRenderer>().material.color = Color.cyan;
        }

        private void Update()
        {
            transform.Rotate(Vector3.up, Time.deltaTime * 360);
        }

    }
}

让一个Cube 一开始 改变颜色,并旋转。此时我们想要修改一开始的颜色,并且旋转速度 也不需要那么快。

我们使用InjectFix 来修改。

namespace MyGame
{
    public class TestScr : MonoBehaviour
    {
        [Patch]
        private void Start()
        {
            //this.GetComponent<MeshRenderer>().material.color = Color.cyan;
            this.GetComponent<MeshRenderer>().material.color = Color.red;
        }
        [Patch]
        private void Update()
        {
            // transform.Rotate(Vector3.up, Time.deltaTime * 360);
            transform.Rotate(Vector3.up, Time.deltaTime * 45);
        }

    }
}

修改之后 此时 我们要生成 我们的补丁包,方便后续加载。

InjectFix 代码热更

InjectFix 代码热更

此时代表补丁文件生成成功。

InjectFix 代码热更

将其复制到Editor-->Resources 下面即可。该路径可修改

InjectFix 代码热更

此时新建 热更管理类,用于热更管理

public class HotFixManager : MonoBehaviour
{
    string patchPath = "./Assets/IFix/Resources/Assembly-CSharp.patch.bytes";
    private void Awake()
    {
        if (File.Exists(patchPath))
        {
            PatchManager.Load(new FileStream(patchPath, FileMode.Open));
        }
    }
}

此时将代码 回退到线上版本(有问题的版本),执行Inject。

InjectFix 代码热更

此时运行Unity。效果 已经是修改过代码之后的 

InjectFix 代码热更

原先代码 是

InjectFix 代码热更

删除热更文件,回退到原先版本。