Unity3D学习之Lua热更新解决方案(二)XLua

文章目录

  • [1 XLua概述](#1 XLua概述)
  • [2 xLua导入和AB包相关准备](#2 xLua导入和AB包相关准备)
  • 3 C#调用Lua
    • [3.1 Lua解析器](#3.1 Lua解析器)
    • [3.2 文件加载重定向](#3.2 文件加载重定向)
    • [3.3 Lua解析器管理器](#3.3 Lua解析器管理器)
      • [3.3.1 重定向AB包内的Lua](#3.3.1 重定向AB包内的Lua)
      • [3.3.2 获得_G大表](#3.3.2 获得_G大表)
    • [3.4 全局变量的获取](#3.4 全局变量的获取)
    • [3.5 全局函数的获取](#3.5 全局函数的获取)
      • [3.5.1 无参无返回](#3.5.1 无参无返回)
      • [3.5.2 有参有返回](#3.5.2 有参有返回)
      • [3.5.3 多返回值](#3.5.3 多返回值)
      • [3.5.4 变长参数](#3.5.4 变长参数)
    • [3.6 List和Dictionary映射table](#3.6 List和Dictionary映射table)
      • [3.6.1 同一类型List](#3.6.1 同一类型List)
      • [3.6.2 不指定类型List](#3.6.2 不指定类型List)
      • [3.6.3 指定类型的Dic](#3.6.3 指定类型的Dic)
      • [3.6.4 不指定类型的Dic](#3.6.4 不指定类型的Dic)
    • [3.7 类映射table](#3.7 类映射table)
      • [3.7.1 类中的类](#3.7.1 类中的类)
    • [3.8 接口映射table](#3.8 接口映射table)
    • [3.9 LuaTable映射table](#3.9 LuaTable映射table)
  • 4 Lua使用C#类
    • [4.1 在Main函数中调用Lua脚本](#4.1 在Main函数中调用Lua脚本)
    • [4.2 调用类](#4.2 调用类)
    • [4.3 自定义类](#4.3 自定义类)
    • [4.4 继承了MONO的类](#4.4 继承了MONO的类)
  • 5 Lua使用C#枚举
    • [5.1 自带枚举](#5.1 自带枚举)
    • [5.2 自定义枚举](#5.2 自定义枚举)
  • 6 Lua使用C#数组、list、Dictionary
  • [7 Lua使用C# ref和out函数](# ref和out函数)
    • [7.1 Ref](#7.1 Ref)
    • [7.2 Out](#7.2 Out)
    • [7.3 ref和out](#7.3 ref和out)
  • 8 Lua使用C#重载函数
  • 9 Lua使用C#委托和事件
    • [9.1 委托](#9.1 委托)
    • [9.2 事件](#9.2 事件)
  • 10 Lua使用C#二维数组
  • 11 Lua使用C#的null和nil比较
  • [12 Lua和系统类及委托相互使用](#12 Lua和系统类及委托相互使用)
  • 13 Lua使用C#协程
  • 14 Lua使用C#泛型函数

1 XLua概述

在资源服务器下载

下载完成后放入游戏客户端

2 xLua导入和AB包相关准备

Github 搜索 Xlua

拖入到unity项目中

导入AB包

3 C#调用Lua

3.1 Lua解析器

Require会自动调用resources文件夹的内容,但由于unity不能读取.lua后缀的文件

所以使用.txt的后缀

会在resources文件夹里被自动识别为

3.2 文件加载重定向

创建一个Lua文件夹,在里面放入后缀为.lua的文件

addLoader相当于加一个委托

3.3 Lua解析器管理器

添加函数进行调用XLua

初始化LuaEnv,加载Lua脚本重定向

3.3.1 重定向AB包内的Lua

AB包.lua不能识别,所以要把.lua改成txt

准备一个Lua包

创建加载指定ab包的函数

在init中新加委托

优化流程,和博客(一)中的ab包管理器联动

lua只能同步加载,不能异步加载

优化方法,让执行lua语句不需要加上require

3.3.2 获得_G大表

3.4 全局变量的获取

启动脚本Main,在Main中调用其他脚本





通过c#无法获取本地变量

3.5 全局函数的获取

3.5.1 无参无返回

3.5.2 有参有返回

如果是自定义委托

需要生成脚本


其他委托

3.5.3 多返回值

用out接

会返回第一个值,剩下的值使用 out接

用ref接

3.5.4 变长参数


3.6 List和Dictionary映射table

3.6.1 同一类型List

3.6.2 不指定类型List


3.6.3 指定类型的Dic

3.6.4 不指定类型的Dic

3.7 类映射table


3.7.1 类中的类


3.8 接口映射table


如果用接口来接Get的内容,需要使用

然后编译

接口是引用拷贝

嵌套和类一样

3.9 LuaTable映射table



4 Lua使用C#类

4.1 在Main函数中调用Lua脚本

Lua没办法直接访问C# 一定从C# 调用Lua脚本后才把逻辑给Lua编写

4.2 调用类

4.2.1 调用C#类





4.3 自定义类


4.4 继承了MONO的类


5 Lua使用C#枚举

5.1 自带枚举

5.2 自定义枚举



6 Lua使用C#数组、list、Dictionary

6.1 数组






6.2 List



6.3 Dictionary



6.4 Lua使用C#拓展方法



建议在Lua中要使用的类都加上该特性 可以提升性能

7 Lua使用C# ref和out函数

7.1 Ref

Ref函数不传完,默认补充为0

7.2 Out


7.3 ref和out


8 Lua使用C#重载函数





9 Lua使用C#委托和事件

9.1 委托





9.2 事件



10 Lua使用C#二维数组



11 Lua使用C#的null和nil比较

可以自己写一个公共方法

还可以在C# 中加扩展方法

12 Lua和系统类及委托相互使用

无法为系统类或者第三方库代码加上[CsharpCallLua] 和 [LuaCallCsharp]

会报错

会提示需要给委托加特性 [LuaCallCsharp]

然后生成xlua的代码

LuaCallCSharp\]也是一样的 ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/9adc29b2941df625b34f34946320b89c.webp) ## 13 Lua使用C#协程 ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/e32c70384c0442059d317a5d967b25a7.webp) 调用 xlua.util 把Lua函数转成Coroutine ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/07d7c06fa949e3a4b91d363f84f52dbc.webp) 关闭线程 ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/7019d0cfe4beefc78ad2e0640b8e2047.webp) ## 14 Lua使用C#泛型函数 ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/999169db088b1d403149a1cfc3c3589c.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/563bf09020a68c51f0d4dff9d20e62c2.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/15f576a6ae061d59e106d59d3eecce41.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/35c3a6bbcfcb0ce3648d6952a6393ab0.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/63d041be87d20d391d76b2f466bb53d9.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/17167e23c5da86f3f5e954eac3114bfe.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1764116745162854401/1d02ba0742657456a4b02fab430599d9.webp)

相关推荐
智者知已应修善业8 分钟前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
sakiko_31 分钟前
UIKit学习笔记5-使用UITableView制作聊天页面
笔记·学习·swift·uikit
Alice-YUE1 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
北山有鸟2 小时前
修改源码法和插件法
嵌入式硬件·学习
richxu202510012 小时前
嵌入式学习之路->stm32篇->(14)通用定时器(上)
stm32·单片机·嵌入式硬件·学习
小陈phd3 小时前
TensorRT 入门完全指南(一)——从核心定义到生态工具全解析
人工智能·笔记
是上好佳佳佳呀3 小时前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记
qeen873 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
handler013 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
lizhihai_993 小时前
股市学习心得-六张分时保命图
大数据·人工智能·学习