|
之前有写过资源的热更新,但是没有去涉及到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;[Hotfix]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'"); } [LuaCallCSharp] public void OnClickEvent() { obj= Instantiate(CubePre, new Vector3(0, 1, 0),Quaternion.identity); } [LuaCallCSharp] 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:
[C]: in field 'access'
[string "Init"]:88: in field 'hotfix'
所以还要开启一个宏: INJECT_WITHOUT_TOOL,采用内嵌到编辑器的方式注入。添加了该宏之后,在菜单栏XLUA里才能够进行【Hotfix inject in Editor】的操作;
之后再次打包到移动端,测试没问题
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|