XGundam05 发表于 2021-8-15 13:07

Xlua之简单热更新

总结的是简单的热更新:(更新cube的属性)
刚开始cube是静止不动的,通过xlua更新使cube进行一直绕Y轴旋转
1:需要到github官网下载xlua,然后解压(该解压文件和本例子工程在我的资源里面可以下载:名字为Xlua热更新)
2:打开unity:新建工程
3:需要将两个文件拖到该工程的Asset下:



4:然后需要把Tools文件夹复制到Asset平行文件夹下(不复制过来会报错)
tools文件夹所在位置是xlua下


需要复制到你的工程下


5:这一步千万不能忘:设置宏
.宏定义:添加 HOTFIX_ENABLE 到 ‘Edit > Project Settings > Player > Other Settings > Scripting Define Symbols’。
(注意:各平台需要分别设置)


设置完一定要enter键确定,等编译完后,这个地方就会有了


6:这个步骤也很重要,生成代码
按顺序点击:CLear Generated Code----Generate Code----Hotfix Inject In Editor
需要注意一点(点击的时候一定要等编译完再点下一个,(看unity右下角是否有转圈的齿轮,有的话就是正在编译,没有的话,就是编译成功))
生成成功的标志是:


7:接下来就是编写脚本了,:总共需要两个脚本,一个是lua脚本,一个是C#脚本
C#脚本放在了Camera上,名字为Test,需要引入命名空间xlua(需要注意的是类的上方需要加)就是需要用xlua更新的代码所在的类上都要写这个
整个代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

public class Test : MonoBehaviour
{
#region 自定义Loader
//就是将lua文件放到自定义文件夹下去加载
LuaEnv luaenv = null;
void Start()
{
    luaenv = new LuaEnv();
}
public void PrintString()
{
    Debug.Log("C#------------------------");
}
void OnGUI()
{
    if (GUILayout.Button("click"))
    {
      //使用lamuda表达式定义委托方法,或者在其他地方定义一个方法,将方法名字填进来就可以了
      //luaenv.AddLoader(LoadFunction)
      luaenv.AddLoader((ref string filename) =>
      {
            //去项目中的StreamingAssets下找文件
            //string Path = Application.streamingAssetsPath + "/" + filename + ".lua.txt";
            string Path = @"D:\" + filename + ".lua.txt";//去自己定义的文件夹找lua文件
            return System.Text.Encoding.UTF8.GetBytes(System.IO.File.ReadAllText(Path));//这个格式转换要记清楚
      });
      luaenv.DoString("require 'HotLuaFix'");
    }
}
void Update()
{
    PrintString();
    if (luaenv != null)
    {
      luaenv.Tick();
    }
}
void OnDestroy()
{
    luaenv.Dispose();
}
//private byte[] LoadFunction(ref string filename)
//{

//    string Path = Application.streamingAssetsPath + "/" + filename + ".lua.txt";
//    Debug.Log(Path);
//    return System.Text.Encoding.UTF8.GetBytes(System.IO.File.ReadAllText(Path));

//}
#endregion}




lua脚本我放在了D盘,因为上面我用的是自定义loader,(在addLoader那里,判断一下这个文件是否存在会更好)


lua脚本如下:


local GameObject=CS.UnityEngine.GameObject
local deltime=CS.UnityEngine.Time.deltime
local cube=GameObject.Find(‘Cube’)
xlua.hotfix(CS.Test, ‘PrintString’, function(self)
print(cube.name)
cube.transform.rotation=cube.transform.rotation*CS.UnityEngine.Quaternion.Euler(0,1,0)
print(cube.transform.rotation)
print(‘lua-----123456’)
end)
这个时候运行后点击ClickBUtton,会出现这个错误


原因是你在生成代码后修改了一些脚本,这个时候需要重新生成代码(也就是再次执行第6个步骤)
这个时候就可以更新C#中的方法,使Cube旋转起来了。
–最后总结:上面的lua脚本截图有个地方错了,就是找不到Hotluatest这个lua脚本,只需要像下面的代码一样改成CS.Test就可以了。
还有用到lua脚本同样放到了该工程下,下载后直接在里面找就行了。
还有lua脚本的后缀是这样的



最后小小宣传下:一个致力于unity游戏,模型,等资源的淘宝店铺,店里有unity3d成品游戏(源工程,源代码),场景资源,模型资源等,一切资源都特别优惠,店铺链接:【unity3D素材包/unity3d中世纪村庄包Medieval Village Pack】https://m.tb.cn/h.eaENjDH?sm=2b946c 点击链接,再选择浏览器咑閞;或復·制这段描述¥kIKkbAV3c3C¥后到?淘♂寳♀?
页: [1]
查看完整版本: Xlua之简单热更新