Unity3D 使用xLua

一、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脚本,如下有对脚本的部分解释

      //指定Lua脚本
        public TextAsset luaScript;
        public Injection[] injections;
        //Lua虚拟机运行的一个上下文对象
        internal static LuaEnv luaEnv = new LuaEnv(); //all lua behaviour shared one luaenv only!
        internal static float lastGCTime = 0;
        internal const float GCInterval = 1;//1 second 

        private Action luaStart;
        private Action luaUpdate;
        private Action luaOnDestroy;
        //当前脚本执行环境
        private LuaTable scriptEnv;

        void Awake()
        {
            scriptEnv = luaEnv.NewTable();

            // 为每个脚本设置一个独立的环境,可一定程度上防止脚本间全局变量、函数冲突
            LuaTable meta = luaEnv.NewTable();
            meta.Set("__index", luaEnv.Global);
            scriptEnv.SetMetaTable(meta);
            meta.Dispose();
            //这里添加注册后,在Lua中使用self即为this
            scriptEnv.Set("self", this);
            //注册绑定其他对象
            foreach (var injection in injections)
            {
                scriptEnv.Set(injection.name, injection.value);
            }

            //执行Lua脚本代码
            luaEnv.DoString(luaScript.text, "LuaTestScript", scriptEnv);

            //添加生命周期函数
            Action luaAwake = scriptEnv.Get<Action>("awake");
            scriptEnv.Get("start", out luaStart);
            scriptEnv.Get("update", out luaUpdate);
            scriptEnv.Get("ondestroy", out luaOnDestroy);

            if (luaAwake != null)
            {
                luaAwake();
            }
        }

上面已经有添加生命周期函数,所以我们可以加在Lua脚本加上这些方法函数

function awake()
print("awake")
end

function start()
print("Hellow")
end

保存后,运行输出结果

调用Unity组件

把空物体改为一个Cube

在 LuaBehaviourscript中有注册self指代this

scriptEnv.Set("self", this);

所以在Lua中使用self即可访问当前对象

接下来就在Lua代码添加update函数,并实现立方体旋转的逻辑

function update()
local speed = CS.UnityEngine.Time.deltaTime * 100
self.transform:Rotate(0,speed,0)
end

注意:Lua中调用方法使用的是“:”

这样立方体就转起来了。

我们也可以添加指代对象,如下

在Lua中输出

function start()
print(myName)
end

即能打印出当前物体的名称

访问其它物体对象

LuaBehaviourscript中定义了一个如下结构体

    public class Injection
    {
        public string name;
        public GameObject value;
    }

在组件上添加好要调用的物体和使用的名字即可通过该名字在Lua中访问改物体了。

例如,创建一个播放音频的对象

指定到Cube的LuaBehaviourscript组件中,如图

接下来在Lua中实现播放音频的方法

function start()
print(myName)
Audio:GetComponent("AudioSource"):Play()
end

保存运行就能实现音频播放了。

四、小结

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

 

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用XLua可以在Unity中实现Lua脚本的编写,同时也可以让Lua脚本与C#代码进行交互。 以下是基本的使用步骤: 1. 下载XLua插件并导入到Unity中。 2. 在Unity中创建一个新的Lua文件,编写Lua脚本代码。 3. 在C#代码中使用XLua的API来加载并运行Lua脚本,例如: ``` using XLua; public class LuaManager : MonoBehaviour { private LuaEnv luaEnv; void Awake() { luaEnv = new LuaEnv(); luaEnv.DoString("require 'main'"); // 加载并执行Lua脚本 } void Update() { luaEnv.Tick(); // 更新Lua环境 } void OnDestroy() { luaEnv.Dispose(); // 释放Lua环境 } } ``` 在上面的例子中,`Awake()`方法中创建了一个Lua环境,然后通过`DoString()`方法加载并执行了Lua脚本。`Update()`方法中每帧都调用了`Tick()`方法来更新Lua环境,`OnDestroy()`方法中释放了Lua环境。需要注意的是,在实际的项目中,可能需要更加复杂的逻辑和管理方式来处理Lua脚本的加载和运行。 4. 在Lua脚本中使用XLua提供的API来调用C#代码或者导出Lua模块,例如: ``` -- 导出一个Lua模块 local module = {} module.foo = function() print("Hello from Lua!") end return module -- 调用C#代码 local gameObject = CS.UnityEngine.GameObject("LuaObject") local transform = gameObject.transform transform.position = CS.UnityEngine.Vector3(1, 2, 3) ``` 在上面的例子中,导出了一个名为`module`的Lua模块,并定义了其中的一个函数`foo()`。同时,也调用了C#代码的API来创建了一个新的GameObject,并修改了它的Transform组件的位置。 XLua还提供了其他的功能,例如自定义导出规则、GC优化等。在使用XLua之前,建议先了解一些基本的Lua语法和C#Lua交互的机制,以便更好地使用XLua
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值