xLua的Lua调用C#的2,3,4
使用Lua在Unity中创建游戏对象,组件:
相关代码如下:
Lua
--Lua实例化类
--C# Npc obj=new Npc()
--通过调用构造函数创建对象
local obj=CS.Npc()
obj.HP=100
print(obj.HP)
local obj1=CS.Npc("admin")
print(obj1.Name)--表方法希望调用表成员变量(表:函数())
--为什么是冒号,对象引用成员变量时,会隐性调用this,等同于Lua中的self
print(obj1:Output())--Lua实例化GameObject
--C#GameObject obj=new GameObject("LuaCreateGO")
CS.UnityEngine.GameObject("LuaCreateGO")
local go =CS.UnityEngine.GameObject("LuaCreateGO")
go:AddComponent(typeof(CS.UnityEngine.BoxCollider))
C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Npc
{public string Name;public int HP{get;set;}public Npc(){}public Npc(string name){Name= name;}public string Output(){return this.Name;}
}
public class LuaCallObject : MonoBehaviour
{void Start(){//GameObject obj = new GameObject("LuaCreate");xLuaEnv.Instance.DoString("require('C2L/LuaCallObject')");}private void OnDestroy(){xLuaEnv.Instance.Free();}
}
运行时如下所示:

Lua语言测试结构体:
//C#代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public struct TestStruct
{public string Name;public string Output(){return Name;}
}public class LuaCallStruct : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('C2L/LuaCallStruct')");}void OnDestroy(){xLuaEnv.Instance.Free();}
}
Lua相关代码:
--和对象调用保持一致
local obj=CS.TestStruct()
obj.Name="adminStruct"
print(obj.Name)
print(obj:Output())
Lua语言测试枚举:
//C#相关代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public enum TestEnum
{LOL=0,Dota2
}
public class LuaCallEnum : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('C2L/LuaCallEnum')");}private void OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua相关代码
--C# TestEnum.LOL
--CS.命名空间.枚举名.枚举值
--枚举获得是userdata自定义数据类型,
获得其他语言数据类型时,就是userdata
print(CS.TestEnum.LOL)
print(CS.TestEnum.Dota2)--转换获得枚举值
print(CS.TestEnum.__CastFrom(0))
print(CS.TestEnum.__CastFrom("Dota2"))

在Lua语言中实现重载:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestOverLoad
{public static void Test(int id){Debug.Log("数字类型:" + id);}public static void Test(string name){Debug.Log("字符串类类型:" + name);}public static void Test(int id,string name){Debug.Log("两个数值:" + id + "," + name);}
}
public class LuaCallOverLoad : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('C2L/LuaCallOverLoad')");}private void OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua语言代码
--数字重载函数
CS.TestOverLoad.Test(99)--字符串重载函数
CS.TestOverLoad.Test("admin")--不同参数的重载函数
CS.TestOverLoad.Test(100,"root")

在Lua语言中实现继承(相关代码如下所示):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Father
{public string Name = "father";public void Talk(){Debug.Log("这是父类中的方法");}public virtual void Overide(){Debug.Log("这是父类中的虚方法");}
}
public class Child : Father
{public override void Overide(){Debug.Log("这是子类中的重写方法"); }
}
public class LuaCallBase : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('C2L/LuaCallBase')");}private void OnDestroy(){xLuaEnv.Instance.Free();}
}
--调用Father
local father=CS.Father()
print(father.Name)father:Overide()--调用Child
local child=CS.Child()
print(child.Name)
child:Talk()
child:Overide()
运行如下所示:

Lua语言实现类扩展:
//C#代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public class TestExtend
{public void Output(){Debug.Log("类本身带的方法");}
}
//类扩展,需要给扩展方法编写的静态类添加[LuaCallCSharp],
//否则Lua无法调用到
[LuaCallCSharp]
public static class MyExtend
{public static void Show(this TestExtend obj){Debug.Log("类扩展实现的方法");}
}
public class LuaCallExtend : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('C2L/LuaCallExtend')");}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua相关代码
--获取对象
local obj=CS.TestExtend()
obj:Output()
obj:Show()
运行效果:

Lua语言实现委托:
相关代码如下:
//C#相关代码如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public delegate void DelegateLua();
public class TestDelegate
{public static DelegateLua Static;public DelegateLua Dynamic;public static void StaticFunc(){Debug.Log("C#静态成员函数");}
}
public class LuaCallDelegate : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('C2L/LuaCallDelegate')");}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua相关代码如下
--C#给委托赋值
--TestDelegate.Static=TestDelegate.StaticFunc
--TestDelegate.Static+=TestDelegate.StaticFunc
--TestDelegate.Static-=TestDelegate.StaticFunc
--TestDelegate.Static()CS.TestDelegate.Static=CS.TestDelegate.StaticFunc
CS.TestDelegate.Static()
--Lua中如果添加了函数到静态委托变量中后,在委托不在使用后,
--记得释放添加的委托函数
CS.TestDelegate.Static=nil
------------------------------------------------------
local func=function()print("这是Lua的函数")
end
--覆盖添加委托
--CS.TestDelegate.Static=func
--加减操作前一定要确定已经添加过回调函数
--CS.TestDelegate.Static=CS.TestDelegate.Static+func
--CS.TestDelegate.Static=CS.TestDelegate.Static-func
--调用以前应确定委托有值
--CS.TestDelegate.Static()--CS.TestDelegate.Static=nil
-------------------------------------------------------
--调用前判定
if(CS.TestDelegate.Static~=nil)
thenCS.TestDelegate.Static()
end--根据委托判定赋值方法
if(CS.TestDelegate.Static==nil)
thenCS.TestDelegate.Static=func
elseCS.TestDelegate.Static=CS.TestDelegate.Static+func
end
-------------------------------------------------------
local obj=CS.TestDelegate()
obj.Dynamic=func
obj.Dynamic()obj.Dynamic=nil
运行效果如下所示:
Lua语言实现事件:
相关代码如下所示:
//C#相关代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public delegate void EventLua();
public class TestEvent
{public static event EventLua Static;public static void StaticFunc(){Debug.Log("这是静态函数");}public static void CallStatic(){if (Static!= null){Static();}}public event EventLua Dynamic;public void CallDynamic(){if (Dynamic != null){Dynamic();}}
}
public class LuaCallEvent : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('C2L/LuaCallEvent')");}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua相关代码
--C#添加事件 TestEvent.Static+=TestEvent.StaticFunc
--Lua添加事件
CS.TestEvent.Static("+",CS.TestEvent.StaticFunc)
CS.TestEvent.CallStatic()
CS.TestEvent.Static("-",CS.TestEvent.StaticFunc)--添加动态成员变量
local func=function()print("来自于Lua的回调函数")
endlocal obj = CS.TestEvent()
obj:Dynamic("+",func)
obj:CallDynamic()
obj:Dynamic("-",func)
运行效果如图:

Lua语言测试泛型:
//C#相关代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestGenericType
{public void Output<T>(T data){Debug.Log("泛型方法:"+data.ToString());}public void Output(float data){Output<float>(data);}public void Output(string data){Output<string>(data);}
}
public class LuaCallGenericType : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('C2L/LuaCallGenericType')");}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua相关代码
local obj=CS.TestGenericType()
obj:Output(99)
obj:Output("admin")
运行效果如下:
Lua语言测试out,ref关键字
//C#相关代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestOutRef
{public static string Func1(){return "Func1";}public static string Func2(string str1,out string str2){str2 = "Func2 out";return "Func2";}public static string Func3(string str1, ref string str2){str2 = "Func3 Ref";return "Func3";}public static string Func4(ref string str1, string str2){str1 = "Func4 Ref";return "Func4";}
}
public class LuaCallOutRef : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('C2L/LuaCallOutRef')");}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua相关代码
local r1=CS.TestOutRef.Func1()
print(r1)--C# out返回的变量,会赋值给Lua的第二个接受返回值变量
local out2
local r2,out1=CS.TestOutRef.Func2("admin",out2)
print(r2,out1,out2)--C# ref返回的变量,会赋值给Lua的第二个接受返回值变量
local ref2
local r3,ref1=CS.TestOutRef.Func3("root",ref2)
print(r3,ref1,ref2)--即使out ref作为第一个参数,其结果依然会以Lua的多个返回值进行返回
local ref4
local r4,ref3=CS.TestOutRef.Func4(ref4,"test")
print(r4,ref3,ref4)
运行测试结果如下所示:

该系列专栏为网课课程笔记,仅用于学习参考。
相关文章:
xLua的Lua调用C#的2,3,4
使用Lua在Unity中创建游戏对象,组件: 相关代码如下: Lua --Lua实例化类 --C# Npc objnew Npc() --通过调用构造函数创建对象 local objCS.Npc() obj.HP100 print(obj.HP) local obj1CS.Npc("admin") print(obj1.Name)--表方法希…...
Debian系统_主板作为路由器_测试局域网设备间网速
Debian系统_主板作为路由器_测试局域网设备间网速 一、360软件测网速 360测出来的网速实际上是宽带的速度,并不是路由器LAN口到电脑这一段的网速 二、使用iperf3 进行双向带宽测试 1、开发板端下载软件 //Debian系统或者/Ubuntu sudo apt update && sudo…...
从 macos 切换到 windows 上安装的工具类软件
起因 用了很多年的macos, 已经习惯了macos上的操作, 期望能在windows上获得类似的体验, 于是花了一些时间来找windows上相对应的软件. 截图软件 snipaste windows和macos都有的软件, 截图非常好用 文件同步软件 oneDrive: 尝试了不同的同步软件, 还是微软在各…...
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
目录 JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码) 一、什么时候该使用Array.map()࿰…...
去除Mysql表中的空格、回车、换行符和特殊字符
系列文章目录 文章目录 系列文章目录前言一、示例1.sql层面2.java层面 前言 一、示例 1.sql层面 参考 ## 例子1 ## CHAR(10) 表示换行符 ## CHAR(13) 表示回车UPDATE 表名 SET 列名 REPLACE(REPLACE(列名, CHAR(10), ), CHAR(13), )## 例子2 ## 删除字段中的空格、换行符、…...
P9242 [蓝桥杯 2023 省 B] 接龙数列
这道题说要求最少删多少个使剩下的序列是接龙序列,这个问题可以转换为序列中最长的接龙序列是多少,然后用总长度减去最长接龙序列的长度就可以了,在第一个暴力版本的代码中我用了两个for循环求出了所有的接龙序列的长度,但是会超时…...
macos下 ragflow二次开发环境搭建
参考官网链接 https://ragflow.io/docs/dev/launch_ragflow_from_source虚拟环境 git clone https://github.com/infiniflow/ragflow.git cd ragflow/ # if not pipx, please install it at first pip3 install pipxpipx install uv uv sync --python 3.10 --all-extras 安装 …...
SQL优化技术分享:从 321 秒到 0.2 秒的性能飞跃 —— 基于 PawSQL 的 TPCH 查询优化实战
在数据库性能优化领域,TPC-H 测试集是一个经典的基准测试工具,常用于评估数据库系统的查询性能。本文将基于 TPCH 测试集中的第 20个查询,结合 PawSQL 自动化优化工具,详细分析如何通过 SQL 重写和索引设计,将查询性能…...
密码学基础——DES算法
前面的密码学基础——密码学文章中介绍了密码学相关的概念,其中简要地对称密码体制(也叫单钥密码体制、秘密密钥体制)进行了解释,我们可以知道单钥体制的加密密钥和解密密钥相同,单钥密码分为流密码和分组密码。 流密码࿰…...
在 Linux 终端中轻松设置 Chromium 的 User-Agent:模拟手机模式与自定义浏览体验
在 Linux 系统中,通过终端灵活控制 Chromium 的行为可以大幅提升工作效率。本文将详细介绍如何通过命令行参数和环境变量自定义 Chromium 的 User-Agent,并结合手机模式模拟,实现更灵活的浏览体验。 为什么需要自定义 User-Agent?…...
ChatGPT 4:引领 AI 创作新时代
文章目录 前言一、ChatGPT 4 的技术革新二、AI 文案创作:精准生成与个性化定制三、AI 绘画艺术:从文字到图像的神奇转化四、AI 视频制作:自动化剪辑与创意实现五、知识库与 ChatGPT 4 的深度融合六、全新的变革和机遇七、相关书籍推荐《ChatG…...
http页面的加载过程
HTTP/2 核心概念 1.1 流(Stream) • 定义:HTTP/2 连接中的逻辑通道,用于传输数据,每个流有唯一标识符(Stream ID)。 • 特点: ◦ 支持多路复用(多个流并行传输&#…...
MySQL【8.0.41版】安装详细教程--无需手动配置环境
一、MySQL 介绍 1. 概述 MySQL 是一个开源的关系型数据库管理系统,由瑞典公司 MySQL AB 开发,现属于 Oracle 旗下。它基于 SQL(结构化查询语言)进行数据管理,支持多用户、多线程操作,广泛应用于 Web 应用、…...
鸿蒙ArkTS实战:从零打造智能表达式计算器(附状态管理+路由传参核心实现)
还在为组件状态混乱、页面跳转丢参数而头疼? 这篇博客将揭秘如何用鸿蒙ArkTS打造一个漂亮美观的智能计算器: ✅ 输入完整表达式,秒出结果——字符串切割简单计算 ✅ 状态管理黑科技——Provide/Consume 实现跨组件实时响应 ✅ 路由传参实战—…...
【58】编程技巧:单片机编程命名规范
【58】编程技巧:单片机编程命名规范 引言 在大型嵌入式项目开发中,变量和常量的命名混乱会导致代码难以维护。本文系统阐述变量、常量、指针、结构体等命名规范,通过统一规则提升代码可读性与协作效率。目标是帮助开发者建立清晰的命名习惯&…...
Windows 部署项目 apache + mod_wsgi,nginx + waitress
文章目录 1、apache mod_wsgi,nginx waitress两种部署方式的区别2、以nginx waitress为例 有些项目必须部署在windows上,有IIS wfastcgi、apache mod_wsgi,nginx waitress部署方式 1、apache mod_wsgi,nginx waitress两种…...
车辆视频检测器linux版对于密码中包含敏感字符的处理方法
由于密码中含有敏感字符,导致前端页面异常,图标变灰,坐标拾取打不开图像等,主要原因是:密码比较前后不一致,左边是Abc_110,右边是:Abc_110%2B,对于此问题,特别…...
Java服务端开发基石:深入理解Spring IoC与依赖注入 (DI)
今天,我们从现代Java开发,尤其是企业级应用中,几乎无处不在的Spring框架的核心概念开始:控制反转(Inversion of Control, IoC) 与 依赖注入(Dependency Injection, DI)。理解它们&am…...
【人工智能】大语言模型多义词解析技术揭秘——以“项目“歧义消解为例
今天田辛老师和小伙伴探讨了一个有趣的多义词问题, 在人工智能技术日新月异的今天,大语言模型(LLM)对自然语言的理解能力已经达到令人惊叹的水平。大模型到底是如何去区分多义词的? 比如:当用户提到"…...
贪心算法(17)(java)可被三整除的最大整数和
给你一个整数数组 nums,请你找出并返回能被三整除的元素 最大和。 示例 1: 输入:nums [3,6,5,1,8] 输出:18 解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。 …...
qq邮箱群发程序
1.界面设计 1.1 环境配置 在外部工具位置进行配置 1.2 UI界面设计 1.2.1 进入QT的UI设计界面 在pycharm中按顺序点击,进入UI编辑界面: 点击第三步后进入QT的UI设计界面,通过点击按钮进行界面设计,设计后进行保存到当前Pycharm…...
K8S学习之基础七十九:关闭istio功能
关闭istio功能 kubectl get ns --show-labels kubectl label ns default istio-injection-有istio-injectionenabled的命名空间,pod都会开启istio功能 反之,如果要开启istio,在对应命名空间打上该标签即可...
上门预约洗鞋店小程序都具备哪些功能?
现在大家对洗鞋子的清洗条件越来越高,在家里不想去,那就要拿去洗鞋店去洗。如果有的客户没时间去洗鞋店,这个时候,有个洗鞋店小程序就可以进行上门取件,帮助没时间的客户去取需要清洗的鞋子,这样岂不是既帮…...
在Ubuntu 22.04上配置【C/C++编译环境】
在Ubuntu 22.04上配置C/C编译环境 如果你想在Ubuntu 22.04上编译和运行C或C程序,首先需要安装一个合适的编译器和相关工具。本文将为你提供详细的安装建议和操作步骤,帮助你快速搭建开发环境。 准备工作 在开始之前,确保你的系统可以通过终…...
蓝桥杯——走迷宫(Java-BFS)
这是一个经典的BFS算法 1. BFS算法保证最短路径 核心机制:广度优先搜索按层遍历所有可能的路径,首次到达终点的路径长度即为最短步数。这是BFS的核心优势。队列的作用:通过队列按先进先出的顺序处理节点,确保每一步探索的都是当…...
Spring MVC与Spring Boot文件上传配置差异对比及文件上传关键类详细说明与对比
一、Spring MVC与Spring Boot文件上传配置差异对比 1. 配置方式差异 框架配置方式依赖管理自动配置Spring MVC需手动配置MultipartResolver(如StandardServletMultipartResolver)需自行引入commons-fileupload等依赖无,默认不启用文件上传支…...
LLM 的model.generate() 参数说明
LLM 的model.generate() 参数说明 目录 LLM 的model.generate() 参数说明生成长度控制参数采样策略参数重复惩罚参数束搜索参数其他参数model.generate() 方法是 Hugging Face Transformers 库中用于文本生成的核心方法,它有众多参数可用于控制生成过程 生成长度控制参数 min…...
下载firefox.tar.xz后如何将其加入到Gnome启动器
起因:近期(2025-04-07)发现firefox公布了130.0 版本,可以对pdf文档进行签名了,想试一下,所以卸载了我的Debian12上的firefox-esr,直接下载了新版本的tar.xz 包。 经过一番摸索,实现了将其加入Gn…...
Flutter性能优化终极指南:从JIT到AOT的深度调优
一、Impeller渲染引擎调优策略 1.1 JIT预热智能预编译 // 配置Impeller预编译策略 void configureImpeller() {ImpellerEngine.precacheShaders(shaders: [lib/shaders/skinned_mesh.vert,lib/shaders/particle_system.frag],warmupFrames: 30, // 首屏渲染前预编译帧数cach…...
加密≠安全:文件夹密码遗忘背后的数据丢失风险与应对
在数字化时代,保护个人隐私和数据安全变得尤为重要。许多人选择对重要文件夹进行加密,以防止未经授权的访问。然而,一个常见且令人头疼的问题也随之而来——文件夹加密密码遗忘。当你突然发现自己无法访问那些加密的文件夹时,那种…...
