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

Xlua之简单热更新

[复制链接]
发表于 2021-8-15 13:07 | 显示全部楼层 |阅读模式
总结的是简单的热更新:(更新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(需要注意的是类的上方需要加[Hotfix])就是需要用xlua更新的代码所在的类上都要写这个
整个代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
[Hotfix]
public class Test : MonoBehaviour
{
  1. #region 自定义Loader
  2. //就是将lua文件放到自定义文件夹下去加载
  3. LuaEnv luaenv = null;
  4. void Start()
  5. {
  6.     luaenv = new LuaEnv();
  7. }
  8. public void PrintString()
  9. {
  10.     Debug.Log("C#------------------------");
  11. }
  12. void OnGUI()
  13. {
  14.     if (GUILayout.Button("click"))
  15.     {
  16.         //使用lamuda表达式定义委托方法,或者在其他地方定义一个方法,将方法名字填进来就可以了
  17.         //luaenv.AddLoader(LoadFunction)
  18.         luaenv.AddLoader((ref string filename) =>
  19.         {
  20.             //去项目中的StreamingAssets下找文件
  21.             //string Path = Application.streamingAssetsPath + "/" + filename + ".lua.txt";
  22.             string Path = @"D:" + filename + ".lua.txt";//去自己定义的文件夹找lua文件
  23.             return System.Text.Encoding.UTF8.GetBytes(System.IO.File.ReadAllText(Path));//这个格式转换要记清楚
  24.         });
  25.         luaenv.DoString("require 'HotLuaFix'");
  26.     }
  27. }
  28. void Update()
  29. {
  30.     PrintString();
  31.     if (luaenv != null)
  32.     {
  33.         luaenv.Tick();
  34.     }
  35. }
  36. void OnDestroy()
  37. {
  38.     luaenv.Dispose();
  39. }
  40. //private byte[] LoadFunction(ref string filename)
  41. //{
  42. //    string Path = Application.streamingAssetsPath + "/" + filename + ".lua.txt";
  43. //    Debug.Log(Path);
  44. //    return System.Text.Encoding.UTF8.GetBytes(System.IO.File.ReadAllText(Path));
  45. //}
  46. #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¥后到?淘♂寳♀?

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-24 12:07 , Processed in 0.066686 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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