码迷,mamicode.com
首页 > 其他好文 > 详细

SLua

时间:2016-08-01 21:18:51      阅读:2223      评论:0      收藏:0      [点我收藏+]

标签:

安装

  1.下载最新版,将Assets目录里的所有内容复制到工程中,对于最终产品,可以删除例子,文档等内容,如果是开发阶段则无所谓。

  2.等待unity编译完毕,如果一切顺利的话,将出现SLua菜单,点击SLua菜单中All->Make命令,手动生成针对当前版本的U3d接口文件。

  3.每次更新SLua版本,务必记得All->Clear,然后All->Make,否则可能运行不正确。

 

LuaState状态机对象执行Lua字符串

using UnityEngine;
using System.Collections;
using SLua;

public class AppDelegate : MonoBehaviour {

    private static LuaState ls_state = new LuaState();

    void Start () {
        ls_state.doString("print(\"SLua Hello!\")");
    }

}

 

使用LuaState状态机对象执行Lua脚本文件HelloLua.lua

  在Resources文件夹下添加HelloLua.lua文件  

print("Lua Script:HelloLua")  

  设置LuaState.loaderDelegate启动文件委托代理

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

public class AppDelegate : MonoBehaviour {

    void Start () {

       //设置脚本启动代理
        LuaState.loaderDelegate = ((string fn)=>{

            //获取脚本启动代理
            string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn;

            Debug.Log("file_path:" + file_path);

            return File.ReadAllBytes(file_path);
        });

    }

}

  通过LuaState对象执行HelloLua.lua脚本

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

public class AppDelegate : MonoBehaviour {

    void Start () {

       //设置脚本启动代理
        LuaState.loaderDelegate = ((string fn)=>{

            //获取脚本启动代理
            string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn;

            Debug.Log("file_path:" + file_path);

            return File.ReadAllBytes(file_path);
        });

        //设置执行脚本
        LuaState ls_state = new LuaState();
        ls_state.doFile("HelloLua.lua");
    }

}

 通过LuaState对象获取并执行HelloLua.lua脚本中的一个函数

  HelloLua.lua

function sum( v1, v2)

    return v1 + v2
end

function mul( v1, v2)

    return v1 * v2
end

  AppDelegate.cs

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

public class AppDelegate : MonoBehaviour {

    //添加LuaState初始化时的回调函数特性函数
    [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
    protected static int init(IntPtr L)
    {
        //设置初始化LuaObject对象
        LuaObject.init(L);
        return 0;
    }

    void Start () {

        //创建状态机对象 
        LuaState ls_state = new LuaState();

       //设置脚本启动代理
        LuaState.loaderDelegate = ((string fn)=>{

            //获取脚本启动代理
            string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn;

            Debug.Log("file_path:" + file_path);

            return File.ReadAllBytes(file_path);
        });

        //初始化LuaState状态机与c#的转换对象
        LuaState.pcall(ls_state.L, init);

        //设置执行脚本   
        ls_state.doFile("HelloLua.lua");

        //获取脚本中的mul函数
        LuaFunction mul = ls_state.getFunction("mul");

        //调用该函数并且接收返回值
        double result = (double)mul.call(-2, 3);

        Debug.Log(result);
    }

}

   注:如出现`SLua.LuaState.pcall(System.IntPtr, LuaInterface.LuaCSFunction)‘ is inaccessible due to its protection level异常,进去看下pcall的定义,把internal修改为public即可。

自定义c#队形LOHuman.cs,在Hello.lua中

  LOHuman.cs

using LuaInterface;
using SLua;
using System;
using UnityEngine;
using System.Collections;

[CustomLuaClassAttribute]
public class HHHuman : MonoBehaviour
{
    //年龄成员
    protected int age = 0;

    //姓名成员
    protected string name = "";

    //添加Lua代码中的静态函数
    [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
    [StaticExport]
    static public int CreateHuman(IntPtr l)
    {
        HHHuman item = new HHHuman();
        LuaObject.pushObject(l, item);

        return 1;
    }

    public string speak(string str)
    {
        string speakStr = "speak:";
        if (str!=null)
            speakStr += str;
        return speakStr;
    }

    public int Age
    {
        set;
        get;
    }

    public string Name
    {
        set;
        get;
    }
}

   通过点击菜单栏中的SLua->Custom->Clear将旧版本的自定义类删除。

  通过点击菜单栏中的SLua->Custom->Make重新制作适用于SLua的新的自定义类Lua_HHHuman.cs。

  默认存放目录Assets->SLua->LuaObject->Custom->。

  在HelloLua.lua脚本中,调用c#中的自定义类的静态函数CreateHuman()。

function main()

    local human = HHHuman.CreateHuman()

    print("human.Age: ",human.Age)
    print("human.speak: ",human:speak("hi"))
end

  在AppDelegate.cs的Start函数中,调用HelloLua.lua脚本中的main函数

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

public class AppDelegate : MonoBehaviour {

 
    LuaSvr l;
    void Start () {

        l = new LuaSvr();
        l.start("HelloLua");

    }

}

 

SLua

标签:

原文地址:http://www.cnblogs.com/-soy/p/5724827.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!