Slua的基本操作

注意事项:LuaState 尽量声明为静态,可以用单例模式。
首先是 LuaSvr, LuaSvr 其实是对 Lua_State 的一个封装, 而 Lua_State 在这篇博客有详细的解释,主要是管理一个lua虚拟机的执行环境, 通过名为 L 的 int 指针作为 ref。
如果用LuaState,如果需要初始化,需要自己写出初始化函数,而LuaSvr则是有封装好的Init函数。

1.利用slua状态机对象来执行lua字符串

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SLua;

public class AppDelegate0 : MonoBehaviour {

    private  static LuaState lua_state;
	void Start () {
        lua_state = new LuaState();
        lua_state.doString("print(\"hello lua\")");
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

值得注意的是LuaState()的初始化不能在声明上做,否则会报错,这可能是slua里面的规定。
错误提示:get_transform is not allowed to be called from a MonoBehaviour constructor (or instance field initia

2.利用slua状态机对象来执行lua脚本


private static LuaState lua_State;

    // Use this for initialization
    void Start()
    {
        lua_State = new LuaState();
        lua_State.loaderDelegate= ((string fn, ref string absoluteFn) =>
        {
            string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn;
            Debug.Log(file_path);
            return File.ReadAllBytes(file_path);
        }
        );
        lua_State.doFile("helloworld.lua");
    }

值得注意的是 lua_State.loaderDelegate是必须要有两个参数的(最新版本),而网上的一些教程中只涉及到一个参数,而且
lua_State.loaderDelegate也应该是已有的状态机对象调用。

3.利用slua中的LuaSvr来调用lua文件中的函数。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SLua;
using System;
using System.IO;

public class AppDelegate2 : MonoBehaviour
{
    public LuaSvr lua_Svr;
    LuaTable self;
    LuaFunction mul;
    void Start()
    {
        lua_Svr = new LuaSvr();       
        LuaSvr.MainState lua_State2 = LuaSvr.mainState;
        lua_Svr.init(null, () => 
        {
            lua_State2.loaderDelegate += LuaLoder;
            self=(LuaTable)lua_Svr.start("helloworld.lua");
            mul = lua_State2.getFunction("mul");
        });
        Debug.Log(mul.call(1,2));

    }
    public byte[] LuaLoder(string fn,ref string absoluteFn)
    {
        string file_path = Directory.GetCurrentDirectory() + "/Assets/Lua/" + fn;
        return File.ReadAllBytes(file_path);
    }
}

值得注意的是如果还像前两个示例一样用luaState的话,初始化会更复杂的一点,具体方法百度,而且有坑。
如果不初始化的话,会报一个没实例化物体的错误,在luaState这坑蹲了好久。
若想在lua中调用C#类,需在C#类中加入[CustomLuaClass]或[CustomLuaClassAttribute]属性。

你可能感兴趣的:(lua)