xLua笔记

Generate Code干了什么

肉眼可见的,在Asset文件夹生成了XLua/Gen文件夹,里面有一些脚本。然后对加了[CSharpCallLua]的变量寻找引用,发现它被XLua/Gen/DelegatesGensBridge引用了。也可以在这里查哪些类型加了[CSharpCallLua]。

public override Delegate GetDelegateByType(Type type){if (type == typeof(NoParamNoReturn)){return new NoParamNoReturn(__Gen_Delegate_Imp0);}if (type == typeof(DelegateLua)){return new DelegateLua(__Gen_Delegate_Imp0);}if (type == typeof(MyActionIntInt)){return new MyActionIntInt(__Gen_Delegate_Imp1);}return null;}

没加[CSharpCallLua]或没生成代码的变量被使用就报错:

C#调用lua

1.新建LuaEnv类;

luaEnv=new LuaEnv();

2.执行luaEnv.AddLoader()。输入是一个返回byte[]的函数,这个函数把一个lua脚本读取出全部字节返回。当luaEnv.DoString()执行require一个lua脚本时,它调用这个函数,把需要的lua脚本名传入,这个函数把脚本里的代码读出。

luaEnv.AddLoader(ProjectLoader);
byte[] ProjectLoader(ref string filePath){string path=string.Concat(luaPath,filePath,".lua");if(File.Exists(path)){return File.ReadAllBytes(path);}else{return null;}}

3.执行luaEnv.DoString(luaCode);执行单句lua代码,一般是"require('xxx')"执行一个lua脚本。

4.要使用Lua里的任何变量,通过luaEnv.Global获取;

public LuaTable Global{get{return luaEnv.Global;}}

 要获取table,在C#里定义一个有table同名成员的结构体或类。要获取函数,在C#里定义一个参数列表和返回类型相同的委托。在Global.Get<xxx>里填自定义的类型。

XLuaManager.Instance.Global.Get<xxx>("yyy");

Lua调用C#

静态方法用.,实例的方法用:

local obj=CS.UnityEngine.GameObject.Find("xxx")
obj.transform:FindChild(0)

C#里一大堆方便语法不能用,需要用相应的函数。

没有泛型<>,要用传入type的重载;

创建数组不能用new,要用

CS.System.Array.CreateInstance(typeof(CS.System.Int32),长度);

创建列表用

local List_String=CS.System.Collections.Generic.List(CS.System.String)local list=List_String()

创建字典用

local Dic1=CS.System.Collections.Generic.Dictionary(CS.System.String,CS.xxx)
local dic1=Dic1()

读取C#的字典元素可以用[],读取Lua创建的字典元素用

dic:get_Item(xxx)

写入字典元素用

dic:set_Item(xxx)

区别就是数组用CS.System一大串就直接创建了,List和Dictionary用CS.System一大串先得到类型xxx,再用xxx()创建实例。

二维数组读取元素需要用GetValue(x,y); 

对象==null需要用.Equals(nil);

+=需要用xxx=xxx+yyy;

out和ref参数是多返回值;

委托第一次要用=赋值,后面加函数;

事件用myEvent("+",xxx)加函数;

总结:没有new,部分类型(Lua创建的字典、二维数组)没有[],没有+=,没有++,没有<>。需要掌握相应的替代语法。

热补丁

xLua热补丁报错在Lua里找不到xLua变量

原因:在lua脚本里把xlua打成了xLua。 

热补丁协程报错This type must add to CSharpCallLua: System.Collections.IEnumerator

问题

 'AppDomain' does not contain a definition for 'DefineDynamicAssembly':找不到AppDomain下的DefineDynamicAssembly方法

解决方法:把报错扔给百度查,得到下面的文章。

C#反射中使用到Emit时,发现AppDomain.CurrentDomain.DefineDynamicAssembly()方法并不存在 - 名字已被使用N次 - 博客园 (cnblogs.com)

里面让把AppDomain.CurrentDomain替换成AssemblyBuilder,照做,解决。原因应该是微软把这个方法移动地方了,且改成了静态方法。

百度查DefineDynamicAssembly,能看到官方文档里有两个类里出现这个方法。

AppDomain的适用版本:

AssemblyBuilder的适用版本:

创建运行环境报错xlua assembly:<unknown assembly> type:<unknown type> member:(null)

原因:没把Plugin文件夹拷过来

Lua里调用C#的委托报错InvalidOperationException: not a generic method definition

C#代码

Lua代码

报错:not a generic method definition

C#里添加并执行委托没错,Lua直接执行Func1()也没错。如果改成一个根本不存在的成员:

报错会不一样:

说明xLua是能找到这个成员的,但是不允许把函数赋给它。打印MyStaticDelegate,是nil,类型也是nil。给它赋一个整数,不报错,打印,还是nil,执行,报错说不能执行nil。

这是C#里定义的一个类:

在lua里遍历它:

结果:

发现它含有NPC里的静态成员,但是静态字符串name和静态委托MyStaticDelegate不见了,但是有一个UnderlyingSystemType,类型是NPC。

然后试图把NPC实例化一个对象,对这个对象遍历:

得到报错:ob是NPC类型,不是table,不能遍历:

遍历了一下CS,以为会有很多东西:

结果:

连我定义的NPC类也没有。

解决方法:在C#定义的无参无返回值委托、传入自身的委托前面加[CSharpCallLua],不管是在Lua使用C#委托,还是C#委托接收Lua函数,都要加。有参且不为表自身的委托(如传入字符串、整数)可以不加。

不要用print(CS.成员)验证一个成员存不存在,就算不存在,也会添加这个成员,类型是table。下图:print CS里一个根本不存在的成员,发现它有值,而且遍历显示这个成员已经被创建出来了:

Lua添加按钮回调报错:LuaException: c# exception:System.InvalidOperationException: not a generic method definition

原因:AddListener的输入类型UnityAction没加CSharpCallLua特性!

解决方法:加上下面一段代码,xLua重新生成。

public static class CSLuaTypes{//记录C#和Lua会调用对方的类型[CSharpCallLua]public static List<Type> cSharpCallLuaTypes=new List<Type>(){typeof(UnityAction),typeof(UnityAction<float>),typeof(UnityAction<bool>)};[LuaCallCSharp]public static List<Type> LuaCallCSharpTypes=new List<Type>(){};
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【tcp连接windows redis】

tcp连接windows redis 修改redis.conf 修改redis.conf bind * -::*表示禁用保护模式&#xff0c;允许外部网络连接 protected-mode no

【序列贪心】摆动序列 / 最长递增子序列 / 递增的三元子序列 / 最长连续递增序列

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;贪心算法 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 摆动序列最长递增子序列递增的三元子序列最长连续递增序列 摆动序列 摆动序列 贪心策略&#xff1a;统计出所有的极大值和极小…

STM32F103C8T6使用MLX90614模块

首先说明&#xff1a; 1.SMBus和I2C的区别 我曾尝试用江科大的I2C底层去直接读取该模块&#xff0c;但是无法成功&#xff0c;之后AI生成的的代码也无法成功。 思来想去最大的可能就是SMBus这个协议的问题&#xff0c;根据百度得到的结果如下&#xff1a; SMBus和I2C的区别 链…

tp5 php获取农历年月日干支甲午

# 切换为国内镜像源 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/# 再次尝试安装 composer require overtrue/chinese-calendar核心写法一个农历转公历&#xff0c;一个公历转农历 农历闰月可能被错误标记&#xff08;例如 闰四月 应表示…

Ubuntu搭建Conda+Python开发环境

目录 一、环境说明 1、测试环境为ubuntu24.04.1 2、更新系统环境 3、安装wget工具 4、下载miniconda安装脚本 二、安装步骤 1、安装miniconda 2、source conda 3、验证版本 4、配置pip源 三、conda用法 1、常用指令 一、环境说明 1、测试环境为ubuntu24.04.1 2、更…

Vscode+git笔记

1.U是untracked m是modify modified修改了的。 2.check out 查看观察 3 status changed 暂存区 4.fetch v 取来拿来 5.orangion 起源代表远程分支 git checkout就是可以理解为进入的意思。

模拟SIP终端向Freeswitch注册用户

1、简介 使用go语言编写一个程序&#xff0c;模拟SIP-T58终端在Freeswitch上注册用户 2、思路 以客户端向服务端Freeswitch发起REGISTER请求&#xff0c;告知服务器当前的联系地址构造SIP REGISTER请求 创建UDP连接&#xff0c;连接到Freeswitch的5060端口发送初始的REGISTER请…

DeepSeek实战--LLM微调

1.为什么是微调 &#xff1f; 微调LLM&#xff08;Fine-tuning Large Language Models&#xff09; 是指基于预训练好的大型语言模型&#xff08;如GPT、LLaMA、PaLM等&#xff09;&#xff0c;通过特定领域或任务的数据进一步训练&#xff0c;使其适应具体需求的过程。它是将…

Docker与WSL2如何清理

文章目录 Docker与WSL2如何清理一、docker占据磁盘空间核心原因分析1. WSL2 虚拟磁盘的动态扩展特性2. Docker 镜像分层缓存与未清理资源 二、解决方案步骤 1&#xff1a;清理 Docker 未使用的资源步骤 2&#xff1a;手动压缩 WSL2 虚拟磁盘1. 关闭 WSL2 和 Docker Desktop2. 定…

在 IDEA 中写 Spark 程序:从入门到实践

在大数据处理领域&#xff0c;Apache Spark 凭借其出色的性能和丰富的功能受到广泛欢迎。而 IntelliJ IDEA 作为一款功能强大的 Java 集成开发环境&#xff0c;为编写 Spark 程序提供了极大的便利。本文将详细介绍如何在 IDEA 中搭建 Spark 开发环境并编写运行 Spark 程序&…

Unity 使用 ADB 实时查看手机运行性能

Unity 使用 ADB 实时查看手机运行性能 前言操作步骤ADB工具下载ADB工具配置手机进入开发者模式并开启USB调试使用ADB连接手机Unity打包设置使用Profiler实时查看性能情况优化建议 常见问题 前言 通过 ADB&#xff08;Android Debug Bridge&#xff09;连接安卓设备&#xff0c…

深入理解 HttpExchange_Java 中构建 HTTP 服务的基础组件

1. 引言 1.1 Java 中的轻量级 HTTP 服务需求 随着微服务、工具类应用和嵌入式系统的兴起,开发者对轻量级 HTTP 服务的需求日益增长。相比引入庞大的框架(如 Spring Boot),使用 JDK 原生 API 构建 HTTP 服务成为一种快速、低依赖的替代方案。 JDK 提供了 com.sun.net.htt…

【RocketMQ NameServer】- NameServer 启动源码

文章目录 1. 前言2. RocketMQ 通信架构3. NameServer 启动流程3.1 创建 NameServerController3.2 启动 NameServerController3.3 NamesrvController#initialize3.3.1 Netty 通信的整体流程3.3.2 创建 NettyRemotingServer 3.4 this.remotingServer.start()3.4.1 this.remotingS…

【算法题】荷兰国旗问题[力扣75题颜色分类] - JAVA

一、题目 二、文字解释 1.1 前言 本题是经典的「荷兰国旗问题」&#xff0c;由计算机科学家 Edsger W. Dijkstra 首先提出。如同图中所示的荷兰国旗&#xff0c;其由红、白、蓝三色水平排列组成。在算法领域&#xff0c;该问题可类比为将一个由特定的三种元素&#xff08;可抽…

MySQL数据操作全攻略:DML增删改与DQL高级查询实战指南

知识点4【MySQL的DDL】 DDL&#xff1a;主要管理数据库、表、列等操作。 库→表&#xff08;二维&#xff09;→列&#xff08;一维&#xff09; 数据表的第一行是 列名称 数据库是由一张或多张表组成 我们先学习在数据库中创建数据表 0、常见的数据类型&#xff1a; 1、…

AtCoder AT_abc404_g [ABC404G] Specified Range Sums

前言 赛时想到了差分约束&#xff0c;随手写了个 SPFA 结果挂的很惨……还是太菜了&#xff0c;赛后 Bellman-Ford 又调了半天。 题目大意 给定整数 N , M N,M N,M 和长度为 M M M 的三个整数序列 L ( L 1 , L 2 , … , L M ) , R ( R 1 , R 2 , … , R M ) , S ( S 1…

如何基于HAL库进行STM32开发

一、初识HAL库 STM32 开发中常说的 HAL 库开发&#xff0c;指的是利用 HAL 库固件包里封装好的 C 语言编写的驱动文件&#xff0c;来实现对 STM32 内部和外围设备的控制。但只有 HAL 库还不能直接驱动一个 STM32 的芯片&#xff0c;其它的组件已经由 ARM 与众多芯片硬件、软件厂…

Qt:(创建项目)

目录 1. 使⽤QtCreator新建项⽬ 1.1 新建项⽬ 1.2 选择项⽬模板 1.3 选择项⽬路径 1.4 选择构建系统 1.5 填写类信息设置界⾯ ​编辑 1.6 选择语⾔和翻译⽂件 1.6 选择Qt套件 1.7 选择版本控制系统 1.8 最终效果 1. 使⽤QtCreator新建项⽬ 1.1 新建项⽬ 打开Qt…

WPF之Slider控件详解

文章目录 1. 概述2. 基本属性2.1 值范围属性2.2 滑动步长属性2.3 刻度显示属性2.4 方向属性2.5 选择范围属性 3. 事件处理3.1 值变化事件3.2 滑块拖动事件 4. 样式和模板自定义4.1 基本样式设置4.2 控件模板自定义 5. 数据绑定5.1 绑定到ViewModel5.2 同步多个控件 6. 实际应用…

mysql索引及数据库引擎

顺序io&#xff08;不需要每次都磁盘寻址&#xff0c;效率高&#xff09;&#xff0c;随机io&#xff08;需要每次都磁盘寻址&#xff0c;效率低&#xff09; 如何正确的创建合适的索引&#xff1f; 索引是一种分散存储的数据结构 磁盘io特性&#xff1a;每次交互是以页为单位&…