当前位置: 首页 > news >正文

toLua笔记

基本

LuaState luaState=new LuaState();
luaState.Start();
luaState.DoString("xxx");
luaState.DoFile("yyy.lua");
luaState.Require("zzz");//不要加.lua后缀
luaState.CheckTop();//检查解析器栈顶为空
luaState.Dispose();
luaState=null;

toLua生成报错

toLua生成代码是在Source/Generate生成的。

Wrap脚本关于ReadOnlySpan的报错 

解决方法:

Unity使用ToLua插件报错 ReadOnlySpan<> & Span<> 解决方法_readonlyspan unity-CSDN博客 为防止上面文章失踪,这里把方法再抄一遍。

在ToLuaExport.cs的IsObsolete()函数开头加入以下代码:

if (mb is MethodBase method){ParameterInfo[] parameters = method.GetParameters();foreach (ParameterInfo parameter in parameters){Type parameterType = parameter.ParameterType;if (parameterType.IsGenericType){Type genericTypeDefinition = parameterType.GetGenericTypeDefinition();if (genericTypeDefinition == typeof(System.Span<>) || genericTypeDefinition == typeof(System.ReadOnlySpan<>))return true;}}}

然后Clear wrap files,重新生成。

DelegateFactory脚本关于Application.MemoryUsageChangedCallback的报错

看报错信息,UnityEngine.Application.MemoryUsageChangedCallback的构造函数需要传入的是一个带in关键字的UnityEngine.ApplicationMemoryUsageChange,就把这的ref改成in。

 下面两种情况是先构造一个他定义的UnityEngine_Application_MemoryUsageChangedCallback_Event类。上面已经知道UnityEngine.Application.MemoryUsageChangedCallback的构造函数想要一个带关键字in的输入参数,就把这个UnityEngine_Application_MemoryUsageChangedCallback_Event里的Call和CallWithSelf的输入参数关键字改成in。

if(!flag){UnityEngine_Application_MemoryUsageChangedCallback_Event target = new UnityEngine_Application_MemoryUsageChangedCallback_Event(func);UnityEngine.Application.MemoryUsageChangedCallback d = target.Call;target.method = d.Method;return d;}else{UnityEngine_Application_MemoryUsageChangedCallback_Event target = new UnityEngine_Application_MemoryUsageChangedCallback_Event(func, self);UnityEngine.Application.MemoryUsageChangedCallback d = target.CallWithSelf;target.method = d.Method;return d;}

new LuaState()报错:找不到tolua.dll

DllNotFoundException: tolua assembly

去报错的地方看:

 

然后在Assets里搜索tolua.dll,发现在Plugin里,把它复制到LuaDLL.cs的文件夹,也就是ToLua/Core。

ToLua自定义解析器报错:找不到文件或模块

原因:自定义Lua文件路径时需要把那一大堆ToLua自带的脚本拷到打算放Lua脚本的文件夹:这里Main是自己写的脚本,其他都是自带脚本。

在自己重写的ReadFile()里打印fileName,发现Lua文件夹里的脚本好像都被加载了一遍:

toLua自定义解析器

继承LuaFileUtils类,重写ReadFile()。使用时先new自己写的解析器类。

public class MyToLuaLoader:LuaFileUtils{public override byte[] ReadFile(string fileName){if(!fileName.EndsWith(".lua")){fileName+=".lua";}byte[] buffer=null;//从AB包加载string[] strings=fileName.Split('/');Debug.Log("从AB包加载"+fileName);TextAsset luaCode=MyABManager.Instance.LoadRes<TextAsset>("learntolua",strings[strings.Length-1]);if(luaCode){buffer=luaCode.bytes;Resources.UnloadAsset(luaCode);}if(buffer==null){Debug.Log("未找到"+fileName);//从Resourcs加载string path="Lua/"+fileName;TextAsset textAsset=Resources.Load<TextAsset>(path);Debug.Log("从Resources加载"+fileName);if(textAsset != null){buffer=textAsset.bytes;Resources.UnloadAsset(textAsset);}}return buffer;}
}

打AB包报错

解决方法:

自定义委托注册

在CustomSettings这里增加自定义的委托:

public static DelegateType[] customDelegateList = {        _DT(typeof(Action)),                _DT(typeof(UnityEngine.Events.UnityAction)),_DT(typeof(System.Predicate<int>)),_DT(typeof(System.Action<int>)),_DT(typeof(System.Comparison<int>)),_DT(typeof(System.Func<int, int>)),_DT(typeof(MultiReturn)),_DT(typeof(MultiParam)),};

然后重新生成:

相关文章:

  • WebRTC 服务器之Janus概述和环境搭建
  • mysql主从复制搭建,并基于‌Keepalived + VIP实现高可用
  • LeetCode //C - 696. Count Binary Substrings
  • 多模态大语言模型arxiv论文略读(五十七)
  • CSS 预处理器 Sass
  • 【SAP】FISL的应用
  • Android Compose 物联网(IoT)UI 组件库封装指南
  • 《Qt C++ 项目中升级 GCC 版本的完整指南》
  • 【JavaScript】性能优化:打造高效前端应用
  • 如何在WORD WPS中输入英语音标 批量给英语标注音标
  • 基于STM32的智能摇头风扇设计(WIFI+语音控制)
  • 【计算机视觉】三维重建: MVSNet:基于深度学习的多视图立体视觉重建框架
  • npm pnpm yarn 设置国内镜像
  • 音视频开发成长之路与音视频知识总结
  • 如何解决 403 错误:请求被拒绝,无法连接到服务器
  • 介绍 PHP-FPM 和 Python WSGI
  • 【c++】模板详解
  • PyTorch学习之张量(Tensor)(一)
  • 嵌入式硬件篇---STM32F103C8T6STM32F103RCT6
  • 用单目相机和apriltag二维码aruco实现单目定位
  • 央行:5月15日起下调金融机构存款准备金率0.5个百分点
  • 中国驻俄大使张汉晖人民日报撰文:共襄和平伟业,续谱友谊新篇
  • 晒被子最大的好处,其实不是杀螨虫,而是……
  • 南京明孝陵石兽遭涂鸦“到此一游”,景区:已恢复原貌,警方在排查
  • 同路人才是真朋友——驻南苏丹使馆援助东赤道州人道主义物资交接仪式侧记
  • 伊朗港口爆炸事故遇难人数最终确定为57人