21.Lua和C#对系统代码交互处理

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

×

喜欢就点赞,疼爱就打赏