Xlua06.C#访问Lua

01.访问一个全局的function
仍然是用Get方法,不同的是类型映射。
1、映射到delegate
这种是建议的方式,性能好很多,而且类型安全。缺点是要生成代码(如果没生成代码会抛InvalidCastException异常)。
delegate要怎样声明呢?
对于function的每个参数就声明一个输入类型的参数。
多返回值要怎么处理?从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数。
参数、返回值类型支持哪些呢?都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate。
delegate的使用就更简单了,直接像个函数那样用就可以了。
2、映射到LuaFunction
这种方式的优缺点刚好和第一种相反。
使用也简单,LuaFunction上有个变参的Call函数,可以传任意类型,任意个数的参数,返回值是object的数组,对应于lua的多返回值。
四、使用建议
1、访问lua全局数据,特别是table以及function,代价比较大,建议尽量少做,比如在初始化时把要调用的lua function获取一次(映射到delegate)后,保存下来,后续直接调用该delegate即可。table也类似。
2、如果lua测的实现的部分都以delegate和interface的方式提供,使用方可以完全和xLua解耦:由一个专门的模块负责xlua的初始化以及delegate、interface的映射,然后把这些delegate和interface设置到要用到它们的地方。

02.调用Lua中无参数的全局方法

Hero={name,hp,mp,attack}

function Attack1()
    print("无参方法1")
end
function Attack2(a)
    print("有参方法2"..a)
end
function Attack3(a)
    return "有一个返回值的方法:"..a*20;
end


function Hero:New()
    H={};
    MH={__index=self}
    setmetatable(H,MH);
    return H;
end

--NewPerson=Hero:New();

using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using XLua;
using System.IO;
public class GetFunction : MonoBehaviour {

	private LuaEnv luaEnv;
	void Start () {
		luaEnv=new LuaEnv();
        luaEnv.AddLoader(CustomLoaders);
		luaEnv.DoString("require'LoadLuaFour.lua.txt'");
		Action action=luaEnv.Global.Get<Action>("Attack1");//映射Lua中的无参数方法attack1
		Action<object> action2=luaEnv.Global.Get<Action<object>>("Attack2");//映射Lua中的有参数方法attack2

		//调用有参数有返回值的Lua方法,多少个返回值,就定义多少out或者ref返回值接收
        //需要自己定义委托来映射的对应的方法,并且需要加上  [CSharpCallLua]标签
		Attack3 attack3=luaEnv.Global.Get<Attack3>("Attack3");//映射Lua中的有参数方法attack2
		
		action();
        action2(100);
		string result=(string)attack3(120);
		Debug.Log("有一个返回值的方法:"+result);
	}
	

//有多个返会值的时候//要调用Lua中的方法需要添加这个标签
[CSharpCallLua]
public delegate object Attack3(object o);

	 private  byte[] CustomLoaders(ref string filepath){
       string path=Application.streamingAssetsPath+"/"+filepath;
	   return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
   }

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

Xlua06.C#访问Lua_第1张图片
03.
1、访问lua全局数据,特别是table以及function,代价比较大,建议尽量少做,比如在初始化时把要调用的lua function获取一次(映射到delegate)后,保存下来,后续直接调用该delegate即可。table也类似。
2、如果lua测的实现的部分都以delegate和interface的方式提供,使用方可以完全和xLua解耦:由一个专门的模块负责xlua的初始化以及delegate、interface的映射,然后把这些delegate和interface设置到要用到它们的地方。


function addReturn(a,b)
return a+b,a-b,a*b;
end

	//通过LuaFunction访问Lua中的全局方法
		LuaFunction luaFunction=luaEnv.Global.Get<LuaFunction>("addReturn");
		//通过Call关键字调用方法,返回值为objct[] 
		object[] objects=luaFunction.Call(100,200);
		Debug.Log(objects[0]+":"+objects[1]+":"+objects[2]);

你可能感兴趣的:(Lua)