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

Unity3D 使用xLua

[复制链接]
发表于 2021-8-12 16:52 | 显示全部楼层 |阅读模式
一、Lua

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
相比C# Lua不需要编辑即可执行,所以Lua可以很好地用在Unity3D程序的热更新。

二、xLua

xLua是腾讯开发的开源Lua插件,它为Unity,.Net,Mono等C#环境增加Lua脚本编程的能力,借助xLua可以使lua代码与C#相互调用。
所以xLua可以很方便地实现Lua在Unity3D中的使用。
xLua下载地址 https://github.com/Tencent/xLua

三、使用

配置环境

1.创建一个新的Unity工程
2.打开下载好的xLua文件,如图


把Assets文件拷贝替换到新建的Unity工程即可。
这样Unity工程里就包含的xLua。
3.创建一个Txt文本作为Lua脚本,如图


Lua代码实现打印输出

创建一个空物体挂上LuaBehaviour脚本组件,并把刚创建好的lua txt文本拖到LuaScript上,如图


打开LuaBehaviour脚本,如下有对脚本的部分解释
  1.       //指定Lua脚本
  2.         public TextAsset luaScript;
  3.         public Injection[] injections;
  4.         //Lua虚拟机运行的一个上下文对象
  5.         internal static LuaEnv luaEnv = new LuaEnv(); //all lua behaviour shared one luaenv only!
  6.         internal static float lastGCTime = 0;
  7.         internal const float GCInterval = 1;//1 second
  8.         private Action luaStart;
  9.         private Action luaUpdate;
  10.         private Action luaOnDestroy;
  11.         //当前脚本执行环境
  12.         private LuaTable scriptEnv;
  13.         void Awake()
  14.         {
  15.             scriptEnv = luaEnv.NewTable();
  16.             // 为每个脚本设置一个独立的环境,可一定程度上防止脚本间全局变量、函数冲突
  17.             LuaTable meta = luaEnv.NewTable();
  18.             meta.Set("__index", luaEnv.Global);
  19.             scriptEnv.SetMetaTable(meta);
  20.             meta.Dispose();
  21.             //这里添加注册后,在Lua中使用self即为this
  22.             scriptEnv.Set("self", this);
  23.             //注册绑定其他对象
  24.             foreach (var injection in injections)
  25.             {
  26.                 scriptEnv.Set(injection.name, injection.value);
  27.             }
  28.             //执行Lua脚本代码
  29.             luaEnv.DoString(luaScript.text, "LuaTestScript", scriptEnv);
  30.             //添加生命周期函数
  31.             Action luaAwake = scriptEnv.Get<Action>("awake");
  32.             scriptEnv.Get("start", out luaStart);
  33.             scriptEnv.Get("update", out luaUpdate);
  34.             scriptEnv.Get("ondestroy", out luaOnDestroy);
  35.             if (luaAwake != null)
  36.             {
  37.                 luaAwake();
  38.             }
  39.         }
复制代码
上面已经有添加生命周期函数,所以我们可以加在Lua脚本加上这些方法函数
  1. function awake()
  2. print("awake")
  3. end
  4. function start()
  5. print("Hellow")
  6. end
复制代码
保存后,运行输出结果


调用Unity组件

把空物体改为一个Cube
在 LuaBehaviourscript中有注册self指代this
  1. scriptEnv.Set("self", this);
复制代码
所以在Lua中使用self即可访问当前对象
接下来就在Lua代码添加update函数,并实现立方体旋转的逻辑
  1. function update()
  2. local speed = CS.UnityEngine.Time.deltaTime * 100
  3. self.transform:Rotate(0,speed,0)
  4. end
复制代码
注意:Lua中调用方法使用的是“:”
这样立方体就转起来了。
我们也可以添加指代对象,如下


在Lua中输出
  1. function start()
  2. print(myName)
  3. end
复制代码
即能打印出当前物体的名称
访问其它物体对象

LuaBehaviourscript中定义了一个如下结构体
  1.     public class Injection
  2.     {
  3.         public string name;
  4.         public GameObject value;
  5.     }
复制代码
在组件上添加好要调用的物体和使用的名字即可通过该名字在Lua中访问改物体了。
例如,创建一个播放音频的对象
指定到Cube的LuaBehaviourscript组件中,如图


接下来在Lua中实现播放音频的方法
  1. function start()
  2. print(myName)
  3. Audio:GetComponent("AudioSource"):Play()
  4. end
复制代码
保存运行就能实现音频播放了。
四、小结

xLua的初步使用大概就是这样了,要更熟练掌握的话除了更深入了解xLua插件外,还需要学习Lua的基本语法,它和C#还是有很多不一样的地方。

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-24 09:25 , Processed in 0.089750 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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