xlua-Lua代码访问C#

18 篇文章 0 订阅

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));

运行结果如下

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Data菌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值