前几天腾讯开源了热更新矿建XLua,今天开始第一天的学习(每天更新)
Example
1.C# 与lua的互相调用
public class Helloworld : MonoBehaviour {
// Use this for initialization
void Start () {
// 用luaenv虚拟机 来电泳lua语句, lua 语句通过已经绑定的Debug.Log 调用C#的Debug.Log
XLua.LuaEnv luaenv = new XLua.LuaEnv();
luaenv.DoString("CS.UnityEngine.Debug.Log('Hello world')");
//C#调用Lua 这边找到了 Lua的math库中的 max
var max = luaenv.Global.GetInPath<LuaMax>("math.max");
Debug.Log("max: " + max(32, 12)
//释放 luaenv
luaenv.Dispose();
}
// Update is called once per frame
void Update () {
}
}
2.展示怎么用lua来写MonoBehaviour
[System.Serializable]
public class MyInjection {
public string name;
public GameObject value;
}
[LuaCallCSharp]
public class MyLuaBehaviour : MonoBehaviour {
//在Unity Inspector面板中绑定 lua文件(.txt)
public TextAsset luaScript;
public MyInjection[] injections;
//创建一个LuaEnv 实例对应Lua虚拟机,出于开销的考虑,建议全局唯一。
internal static LuaEnv myLuaEnv = new LuaEnv();
//记录最一次GC时间
internal static float lastGCTime = 0;
internal const float GCInterval = 1;
//创建三个Action用于绑定lua脚本中的函数
private Action luaStart;
private Action luaUpdate;
private Action luaOnDestroy;
private LuaTable scriptEnv;
void Awake() {
scriptEnv = myLuaEnv.NewTable();
LuaTable meta = myLuaEnv.NewTable();
meta.Set("__index", myLuaEnv.Global);
scriptEnv.SetMetaTable(meta);
meta.Dispose();
scriptEnv.Set("self", this);
foreach (var injection in injections) {
scriptEnv.Set(injection.name, injection.value);
}
//执行脚本 给scriptEnv 赋值
myLuaEnv.DoString(luaScript.text, "MyLuaBehaviour", scriptEnv);
//对Action绑定对应的 lua函数
Action luaAwake = scriptEnv.Get<Action>("awake");
scriptEnv.Get("start", out luaStart);
scriptEnv.Get("update", out luaUpdate);
scriptEnv.Get("ondestroy", out luaOnDestroy);
//在对应函数中执行 luaAction
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();
}
//执行GC操作
if (Time.time - LuaBehaviour.lastGCTime > GCInterval) {
myLuaEnv.Tick();
LuaBehaviour.lastGCTime = Time.time;
}
}
void OnDestroy() {
if (luaOnDestroy != null) {
luaOnDestroy();
}
luaOnDestroy = null;
luaUpdate = null;
luaStart = null;
scriptEnv.Dispose();
injections = null;
}
}
凌晨一点了,周五晚上继续 XLua 的 UIEvent