插件下载:https://github.com/Tencent/xlua
- 01_Helloworld: 快速入门的例子。
- 02_U3DScripting: 展示怎么用lua来写MonoBehaviour。
- 03_UIEvent: 展示怎么用lua来写UI逻辑。
- 04_LuaObjectOrented: 展示lua面向对象和C#的配合。
- 05_NoGc: 展示怎么去避免值类型的GC。
- 06_Coroutine: 展示lua协程怎么和Unity协程相配合。
- 07_AsyncTest: 展示怎么用lua协程来把异步逻辑同步化。
- 08_Hotfix: 热补丁的示例(需要开启热补丁特性,如何开启请看指南)。
- 09_GenericMethod: 泛化函数支持的演示。
- 10_SignatureLoader: 展示如何读取经数字签名的lua脚本,参见数字签名的文档介绍。
- 11_RawObject: 当C#参数是object时,如何把一个lua number指定以boxing后的int传递过去。
- 12_ReImplementInLua: 展示如何将复杂值类型改为lua实现
目录
一、HelloWorld
using UnityEngine;
using XLua;
public class Helloworld : MonoBehaviour
{
// Use this for initialization
void Start()
{
//创建一个Lua运行的环境,可以去执行我们的lua代码
LuaEnv luaenv = new LuaEnv();
//打印
luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");
//销毁我的执行环境
luaenv.Dispose();
}
}
二、U3DScripting
1.Cube(LuaBehaviour):
Injections是一个Injection类型的数组
Size:是数组的长度
lightObject是数组里面的元素
Name:依赖注入(每一个name对应一个物体,lua脚本只要用这个Name既可以找到物体)(例如有一个物体身上有灯组件:①Name: A, ②把物体拖进Value ③通过A:GetCompent(typeof(CS.UnityEngine.Light))获取)
Value::把物体拖进去
LuaBehavior:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using XLua;
using System;
[System.Serializable]
public class Injection
{
public string name;
public GameObject value;
}
[LuaCallCSharp]
public class LuaBehaviour : MonoBehaviour
{
public TextAsset luaScript;
public Injection[] injections;
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;
//lua中有表类型,而C#中没有表类型,LuaTable和Lua中的表相对应,后续实现转换
private LuaTable scriptEnv;
void Awake()
{
scriptEnv = luaEnv.NewTable();
//为每个脚本设置一个独立的环境,可一定程度上防止脚本间全局变量、函数冲突
LuaTable meta = luaEnv.NewTable();
//元表 对lua数据结构(表)进行功能上的扩充
//"__add"\"__sub"\"_mul.....";
meta.Set("__index", luaEnv.Global);
scriptEnv.SetMetaTable(meta);
meta.Dispose();
scriptEnv.Set("self", this);
foreach (var injection in injections)
{
scriptEnv.Set(injection.name, injection.value);
}
luaEnv.DoString(luaScript.text, "LuaBehaviour", 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();
}
}
// Use this for initialization
void Start()
{
if (luaStart != null)
{
luaStart();
}
}
// Update is called once per frame
void Update()
{
if (luaUpdate != null)
{
luaUpdate();
}
if (Time.time - LuaBehaviour.lastGCTime > GCInterval)
{
luaEnv.Tick();
LuaBehaviour.lastGCTime = Time.time;
}
}
void OnDestroy()
{
if (luaOnDestroy != null)
{
luaOnDestroy();
}
luaOnDestroy = null;
luaUpdate = null;
luaStart = null;
scriptEnv.Dispose();
injections = null;
}
}
LuaTestScripts:
local speed = 10
local lightCpnt = nil
function start()
print("lua start...")
print("injected object", lightObject)
--找到lightObject,获取它身上的Light组件
lightCpnt= lightObject:GetComponent(typeof(CS.UnityEngine.Light))
end
function update()
local r = CS.UnityEngine.Vector3.up * CS.UnityEngine.Time.deltaTime * speed
--让cube旋转
self.transform:Rotate(r)
--改变light的颜色
lightCpnt.color = CS.UnityEngine.Color(CS.UnityEngine.Mathf.Sin(CS.UnityEngine.Time.time) / 2 + 0.5, 0, 0, 1)
end
function ondestroy()
print("lua destroy")
end
2.LuaCallCSharp
①新建一个脚本Test.cs
using XLua;
[LuaCallCSharp]
public class Test
{
public int index;
public int Add(int a, int b)
{
return a + b;
}
}
②新建一个luaTest.lua.txt(在文件夹修改后缀)
function start()
--找到C#脚本
local Test=CS.Test
--实例化
local test=Test()
--属性赋值
test.index=66
print("index"..test.index)
--调用方法
print("打印返回值"..test.Add(test,1,4))
//冒号与点的区别,点,要把对象传进去,冒号则不需要
print("打印返回值"..test:Add(1,4))
end