找回密码
 立即注册
查看: 294|回复: 0

Xlua实现代码逻辑更新

[复制链接]
发表于 2021-8-12 14:59 | 显示全部楼层 |阅读模式
之前有写过资源的热更新,但是没有去涉及到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】的操作;
之后再次打包到移动端,测试没问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 10:03 , Processed in 0.091380 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表