lua代码如何访问C#代码的变量方法呢?本篇文章做了比较详细的介绍
C#代码部分如下
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
namespace Framework
{
[LuaCallCSharp]
public enum ChannelType
{
None,
QQ,
WeChat,
WeiBo,
}
[LuaCallCSharp]
public class BaseObject
{
/// <summary>
/// 静态属性
/// </summary>
public static float v1 = 3.14f;
/// <summary>
/// 静态方法
/// </summary>
public static void BaseFunc1()
{
Debug.Log("Unity BaseObject static BaseFunc1");
}
/// <summary>
/// 成员属性
/// </summary>
public int v2 = 2;
/// <summary>
/// 成员方法
/// </summary>
public void BaseFunc2()
{
Debug.Log("Unity BaseObject BaseFunc2");
}
}
public struct Param
{
public int x;
public string y;
}
[LuaCallCSharp]
public class SpecialObject : BaseObject
{
public int v3 = 5;
public void SpecFunc1()
{
Debug.Log("Unity SpeicalObject SpecFunc1");
}
/// <summary>
/// 复杂方法调用
/// </summary>
/// <param name="param"></param>
/// <param name="param2"></param>
/// <param name="param3"></param>
/// <param name="luaFunc"></param>
/// <param name="csFunc"></param>
/// <returns></returns>
public double SpecFunc2(Param param, ref int param2, out string param3, Action luaFunc, out Action csFunc)
{
Debug.Log("Unity SpecFunc2 param.x=" + param.x + " param.y=" + param.y + " param2=" + param2);
luaFunc();
param3 = "Hello World!";
csFunc = () =>
{
Debug.Log("SpecFunc2 ======csFunc===");
};
return 1.5f;
}
/// <summary>
/// 重载方法1
/// </summary>
/// <param name="i"></param>
public void TestFunc(int i)
{
Debug.Log("Unity TestFunc ===int(i)");
}
/// <summary>
/// 重载方法2
/// </summary>
/// <param name="i"></param>
public void TestFunc(string i)
{
Debug.Log("Unity TestFunc ===string(i)");
}
/ <summary>
/ 默认值方法
/ </summary>
/ <param name="a"></param>
/ <param name="b"></param>
/ <param name="c"></param>
//public void DefaultValueFunc(int a = 100, string b = "cccc", string c = null)
//{
// Debug.Log("Unity DefaultValueFunc a=" + a + " b=" + b + " c=" + c);
//}
/// <summary>
/// 可变参数方法
/// </summary>
/// <param name="p"></param>
/// <param name="args"></param>
public void VariableParamFunc(int p, params string[] args)
{
Debug.Log("VariableParamFunc:p=" + p);
foreach (var arg in args)
{
Debug.Log("arg=" + arg);
}
}
/// <summary>
/// 泛型方法
/// </summary>
/// <typeparam name="T"></typeparam>
public void ModuleMethod<T>()
{
Debug.Log("ModuleMethod 泛型方法:<"+typeof(T)+">");
}
/// <summary>
/// 枚举类型值方法
/// </summary>
/// <param name="channelType"></param>
/// <returns></returns>
public ChannelType SetChannelType(ChannelType channelType)
{
Debug.Log("SetChannelType 枚举类型测试:"+channelType);
return ChannelType.WeChat;
}
/// <summary>
/// 委托方法
/// </summary>
public Action<string> DelegateMethod = (param) =>
{
Debug.Log("DelegateMethod is in C#");
};
/// <summary>
/// 事件注册
/// </summary>
public event Action EventHandler;
/// <summary>
/// 事件调用
/// </summary>
public void CallEvent()
{
EventHandler();
}
}
[LuaCallCSharp]
public static class SpecialObjectExtensions
{
/// <summary>
/// lua代码访问C#的泛型方法
/// </summary>
/// <param name="obj"></param>
public static void ModuleMethodOfString(this SpecialObject obj)
{
obj.ModuleMethod<string>();
}
}
[LuaCallCSharp]
public class LuaCallCSTest : MonoBehaviour
{
public int Num = 10;
public string Res = "Hello World!";
public void Add(int a, int b)
{
int sum = a + b;
Debug.Log("Unity Add===结果:" + sum);
}
private LuaEnv luaEnv = null;
void Awake()
{
luaEnv = new LuaEnv();
luaEnv.DoString("require 'LuaCallCS'");
}
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
if (luaEnv != null)
luaEnv.Tick();
}
void OnDestroy()
{
if (luaEnv != null)
luaEnv.Dispose();
}
}
}
Lua代码部分如下:
--[[new 对象]]--
local gameObject = CS.UnityEngine.GameObject("Hello");
--[[访问静态属性、方法]]--
print('TimeDeltatime==='..CS.UnityEngine.Time.deltaTime);
--修改静态属性
CS.UnityEngine.Time.timeScale = 0.5;
--访问静态方法
print('Hello 游戏对象==='..CS.UnityEngine.GameObject.Find("Hello").name);
--[[访问成员属性和方法]]--
local specialObject = CS.Framework.SpecialObject;
local specObj = specialObject();
print('v3===='..specObj.v3);
specObj:SpecFunc1();
--[[访问基类的属性和方法]]--
print('v1====='..specialObject.v1);--基类静态属性
specialObject.BaseFunc1();--基类静态方法
print('v2===='..specObj.v2);--基类成员属性
specObj:BaseFunc2();--基类成员方法
--[[复杂方法的调用]]--
local ret, p2, p3, csfunc = specObj:SpecFunc2({x=3, y = 'john'}, 100, function()
print('i am lua callback')
end);
print('SpecFunc2 ret:', ret, p2, p3, csfunc);
csfunc();
--[[重载方法的调用]]--
specObj:TestFunc(100);
specObj:TestFunc('WangLunQiang');
--[[默认值方法调用]]--
--specObj:DefaultValueFunc(3);
--specObj:DefaultValueFunc(3,"arg1","arg2");
--[[可变参数方法调用]]--
specObj:VariableParamFunc(6,'Hello','World');
--[[泛型方法调用]]--
specObj:ModuleMethodOfString() --通过Extension methods实现访问泛化方法
--[[枚举类型方法调用]]--
local enumV = specObj:SetChannelType(CS.Framework.ChannelType.QQ);
print(enumV);
print(CS.Framework.ChannelType.__CastFrom('WeiBo'));
--[[委托注册调用]]--
local function luaDelegate(str)
print('luaDelegate in lua:',str);
end
--lua委托添加
specObj.DelegateMethod = specObj.DelegateMethod + luaDelegate;
specObj.DelegateMethod('HaHa');
--lua委托移除
specObj.DelegateMethod = specObj.DelegateMethod - luaDelegate;
specObj.DelegateMethod('HaHa');
--[[事件注册调用]]--
local function luaEventCallBack()
print('lua event call back');
end
specObj:EventHandler('+',luaEventCallBack);
specObj:CallEvent();
specObj:EventHandler('-',luaEventCallBack);
--[[typeof获取类型]]--
gameObject:AddComponent(typeof(CS.UnityEngine.ParticleSystem));
运行结果如下