21.Lua调用CSharp-系统代码交互
21.1 知识点
准备工作
启动Lua脚本
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Lesson21_Lua调用CSharp_系统代码交互");
创建一个Slider对象

知识回顾
- Lua 与 C# 交互时常用到两个特性:
[CSharpCallLua]与[LuaCallCSharp] [CSharpCallLua]会在 C# 使用委托装载Lua函数、接口映射Lua表使用[LuaCallCSharp]会在扩展方法、Lua调用C#类使用- 但是对应系统写好的或者别的库写好的代码,我们无法添加上述特性
- 比如我们想在UGUI拖动条的值变化事件添加Lua函数,这个事件的类型是
UnityAction<float>,需要在UnityAction<float>事件前添加[CSharpCallLua]才能用该事件装载我们的Lua函数 - 但是我们没法修改系统定义好的
UnityAction<float>代码
系统代码添加Lua和CSharp交互特性
C#脚本定义静态交互类和静态列表
//静态类定义Type类型的静态列表成员 静态列表添加Lua和CSharp交互特性 列表初始化传入要交互的类 重新生成代码
public static class Lesson21_Test
{
[CSharpCallLua]
public static List<Type> csharpCallLuaList = new List<Type>() {
typeof(UnityAction<float>),
typeof(UnityAction<int>)
};
[LuaCallCSharp]
public static List<Type> luaCallCsharpList = new List<Type>() {
typeof(GameObject)
};
}
Lua脚本得到Slider对象,添加回调函数
GameObject = CS.UnityEngine.GameObject
UI = CS.UnityEngine.UI
local sliderGameObject = GameObject.Find("Slider")
print(sliderGameObject)--LUA: Slider (UnityEngine.GameObject): -14066
local sliderComponent = sliderGameObject:GetComponent(typeof(UI.Slider))
print(sliderComponent)--LUA: Slider (UnityEngine.UI.Slider): -14072
--需要在C#静态类定义Type类型的静态列表成员 静态列表添加Lua和CSharp交互特性 列表初始化UnityAction<float> 才能执行Lua函数回调
sliderComponent.onValueChanged:AddListener(function(sliderValue)
print("Lua函数打印拖动条的值:"..sliderValue)
end)

21.2 知识点代码
Lesson21_Lua调用CSharp_系统代码交互.lua
print('我是Lua脚本 Lesson21_Lua调用CSharp_系统代码交互')
print("**********知识回顾************")
--Lua和CSharp交互时会使用两个特性 [CSharpCallLua] [LuaCallCSharp]
--[CSharpCallLua] 会在 C#使用委托装载Lua函数 接口映射Lua表 使用
--[LuaCallCSharp] 会在 扩展方法 Lua调用C#类 使用
--但是对应系统写好的或者别的库写好的代码 我们无法添加上述特性
--比如我们想在UGUI拖动条的值变化事件添加Lua函数
--这个事件的类型是UnityAction<float> 需要在UnityAction<float>事件前添加[CSharpCallLua] 才能用该事件装载我们的Lua函数
--但是我们没法修改系统定义好的UnityAction<float>代码
print("**********知识一 系统代码添加Lua和CSharp交互特性************")
GameObject = CS.UnityEngine.GameObject
UI = CS.UnityEngine.UI
local sliderGameObject = GameObject.Find("Slider")
print(sliderGameObject)--LUA: Slider (UnityEngine.GameObject): -14066
local sliderComponent = sliderGameObject:GetComponent(typeof(UI.Slider))
print(sliderComponent)--LUA: Slider (UnityEngine.UI.Slider): -14072
--需要在C#静态类定义Type类型的静态列表成员 静态列表添加Lua和CSharp交互特性 列表初始化UnityAction<float> 才能执行Lua函数回调
sliderComponent.onValueChanged:AddListener(function(sliderValue)
print("Lua函数打印拖动条的值:"..sliderValue)
end)
Lesson21_Lua调用CSharp_系统代码交互
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using XLua;
public class Lesson21_Lua调用CSharp_系统代码交互 : MonoBehaviour
{
void Start()
{
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Lesson21_Lua调用CSharp_系统代码交互");
}
}
//静态类定义Type类型的静态列表成员 静态列表添加Lua和CSharp交互特性 列表初始化传入要交互的类 重新生成代码
//这样的好处是可以把要Lua和CSharp交互的成员统一管理
public static class Lesson21_Test
{
[CSharpCallLua]
public static List<Type> csharpCallLuaList = new List<Type>() {
typeof(UnityAction<float>),
typeof(UnityAction<int>)
};
[LuaCallCSharp]
public static List<Type> luaCallCsharpList = new List<Type>() {
typeof(GameObject)
};
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com