Unity中C#访问lua(四)

该代码是基于XLua,XLua插件下载链接:https://github.com/Tencent/xLua

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
using System;

public class CSharpCallLua : MonoBehaviour {

    private LuaEnv m_luaEnv;

    class Person
    {
        public string name;
        public int age;
        public int age2;
    }

    //使用接口类时必须加特性[CSharpCallLua]
    [CSharpCallLua]
    interface IPerson
    {
        string name { get; set; }
        int age { get; set; }
        void state(int a, int b);
    }

	// Use this for initialization
	void Start () {

        m_luaEnv = new LuaEnv();

        m_luaEnv.DoString("require 'CSharpCallLua'");

        //获取lua脚本中的全局变量
        int a = m_luaEnv.Global.Get<int>("a");    //当a为小数时,此时用float或者double类型
        string str = m_luaEnv.Global.Get<string>("str");
        bool isLove = m_luaEnv.Global.Get<bool>("isLove");
        //int b = m_luaEnv.Global.Get<int>("b");   //当获取lua脚本中的变量不存在时报的错为 Error: can not assign nil to System.Int32
        print(a + str + isLove);

        print("值拷贝 :");

        //获取lua脚本中的table(映射到class,struct) 这个过程是值拷贝,如果class比较复杂代价比较大,
        //而且修改class字段值不会同步到lua脚本中,反过来也不会(推荐使用)
        Person person = m_luaEnv.Global.Get<Person>("Person");
        person.name = "shenxichen";
        m_luaEnv.DoString("print(Person.name)");

        print("引用 :");

        //获取lua脚本中的table(映射到interface) 这个过程是引用(推荐使用)
        IPerson iperson = m_luaEnv.Global.Get<IPerson>("Person");
        iperson.name = "shenxichen";
        iperson.state(15, 16);   // iperson.state(iperson, 15, 16)
        m_luaEnv.DoString("print(Person.name)");

        print("Dictionary :");

        //访问lua脚本中的Dictionary或者List
        Dictionary<string, object> dic = m_luaEnv.Global.Get<Dictionary<string, object>>("Person");
        foreach (string key in dic.Keys)
        {
            print(key + "-" + dic[key]);
        }

        print("List :");

        List<object> objList = m_luaEnv.Global.Get<List<object>>("Person");
        foreach (object obj in objList)
        {
            print(obj);
        }

        print("LuaTable :");

        //通过LuaTable访问Table,性能比较慢,不推荐使用
        LuaTable luaTable = m_luaEnv.Global.Get<LuaTable>("Person");
        print(luaTable.Get<int>("age"));
        print(luaTable.Get<string>("name"));

        print("001 :");

        //访问Lua中的全局function
        Action action1 = m_luaEnv.Global.Get<Action>("add");  //不带参的方式
        action1();
        action1 = null;    //这里action为引用,不置空m_luaEnv无法释放

        Sum sum = m_luaEnv.Global.Get<Sum>("Sum");   //带参的方式
        int s = sum(12, 23);
        sum = null;
        print(s);

        print("LuaFunction :");

        //通过LuaFunction访问Lua中的function,不推荐使用,耗性能
        LuaFunction luaFunction = m_luaEnv.Global.Get<LuaFunction>("Sum");
        object[] objAry = luaFunction.Call(12, 23);
        foreach (object obj in objAry)
        {
            print(obj);
        }
    }

    //通过委托映射时必须加特性[CSharpCallLua]
    [CSharpCallLua]
    delegate int Sum(int a, int b);   //delegate int Sum(int a, int b, out int resa, out int resb),用out或者ref接收多余的返回值

    // Update is called once per frame
    void Update () {
		
	}

    private void OnDestroy()
    {
        m_luaEnv.Dispose();
    }
}

Lua脚本如下:

print("My Love")
a = 1017
str = "sy"
isLove = false

Person = 
{
	name = "shenyang",
	age = 123,
	
	2,3,4,5,12122,false,3.3,"sy",
	
	state = function(self, a, b)  --lua函数里第一个参数代表自身,必填
	print(a + b);
	print("我爱你");
	end
}

--[["
function Person: state(a, b)  --默认带一个self参数,代表当前table

	print(a + b);
	print("我爱你");

end
"]]

--[["
function Person.state(self, a, b)

	print(a + b);
	print("我爱你");

end
"]]

function add()

	print("add");

end

function Sum(a,b)   --Lua可以允许多个返回值

	print(a+b);
	return a+b,a,b;

end

猜你喜欢

转载自blog.csdn.net/qq_34818497/article/details/79465256