zifa2003293 发表于 2021-8-12 14:59

Xlua实现代码逻辑更新

之前有写过资源的热更新,但是没有去涉及到lua代码,今天写了个小demo去简单实现一下代码逻辑的更新。
点击按钮,生成一个白色Cube,通过xlua给c#打补丁,让其生成一个蓝色的比例是原来三倍的Cube。


下载Xlua压缩包,将xlua 导入到unity工程目录下,之前的文章有讲过怎么导入。提前在发布之前,给C#中的类之后可能要修改的打上hotfix标签,方法打上LuaCallCSharp或者CSharpCallLua标签,方便之后打补丁。
下面是c#实现的简单逻辑:
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using XLua;public class TestXlua : MonoBehaviour{    public GameObject CubePre;    LuaEnv env;    private Button _testBtn;    GameObject obj;    private void Awake()    {      env = new LuaEnv();      _testBtn = GameObject.Find("Button").GetComponent<Button>();      _testBtn.onClick.AddListener(OnClickEvent);      _testBtn.onClick.AddListener(ChangeColor);      env.DoString("require 'TestDemo'");    }       public void OnClickEvent()    {       obj= Instantiate(CubePre, new Vector3(0, 1, 0),Quaternion.identity);         }        public void ChangeColor()    {      if (obj!=null)      {            obj.GetComponent<MeshRenderer>().material.color = Color.red;      }    }    private void Destroy()    {      _testBtn.onClick.RemoveAllListeners();      env.Dispose();    }}接下来是Lua代码,一些基本注意事项,要注意方法的调用: 调用不需要传入self参数,点调用要传入self参数,使用unity中的类要加CS前缀,util库 可以先执行c# 中的指定方法中的逻辑,在执行lua代码。
local util=require 'util'util.hotfix_ex(CS.TestXlua,'OnClickEvent',function(self)       self.OnClickEvent(self)       self.obj.transform.localScale =CS.UnityEngine.Vector3(3,3,3)end)xlua.hotfix(CS.TestXlua,'ChangeColor',function(self)        if self.obj~=nil then           self.obj:GetComponent('MeshRenderer').material.color =CS.UnityEngine.Color.blue;        endend)要修的两个方法。
每次修改C#代码要重新生成代码,注入。如果不想每次都去生成,可以考虑先不开启宏,等发布的时候在开启。
这里说明一下,如果只开启一个宏HOTFIX_ENABLE,在unity编辑器下是没问题的,可以生成也可以注入。但是发布到移动端就会出现问题,在切换到安卓端之后,运行就会报错
LuaException: xlua.access, no field __Hotfix0_Update
stack traceback:
   : in field 'access'
   :88: in field 'hotfix'
所以还要开启一个宏: INJECT_WITHOUT_TOOL,采用内嵌到编辑器的方式注入。添加了该宏之后,在菜单栏XLUA里才能够进行【Hotfix inject in Editor】的操作;
之后再次打包到移动端,测试没问题
页: [1]
查看完整版本: Xlua实现代码逻辑更新