InjectFix 代码热更

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

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

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

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

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

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

以及这两个文件夹放到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);
        }

    }
}

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

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

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

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

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。

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

原先代码 是

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

发布了76 篇原创文章 · 获赞 43 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/hnzmdlhc/article/details/102984177