toLua笔记

基本

cs 复制代码
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()函数开头加入以下代码:

cs 复制代码
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。

cs 复制代码
		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自己写的解析器类。

cs 复制代码
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这里增加自定义的委托:

cs 复制代码
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)),
    };

然后重新生成:

相关推荐
yeshan1 天前
【Draft】基于 cluacov 的 Lua 代码分支覆盖率统计:从行级近似到指令级精确
单元测试·lua
zz0723201 天前
Redis + Lua 实现高性能分布式限流
redis·lua·aop·限流算法·分布式限流
衣舞晨风2 天前
运行时行为盲区:API7 AI 网关CPU打满故障的AI辅助事后复盘
lua·openresty·apisix·coroutine·cpu-saturation·socket-buffer
笨鸟先飞的橘猫4 天前
基于Skynet的分布式游戏场景题:大型MMO的跨服战场系统设计
分布式·学习·游戏·面试·lua
Huanzhi_Lin6 天前
skynet笔记
笔记·lua·skynet·actor·actor模型
笨鸟先飞的橘猫7 天前
MMO游戏中的“跨服团队副本”匹配与状态同步系统
分布式·学习·游戏·lua·skynet
Kiyra7 天前
限流不是加个计数器就行:用 Lua 脚本实现多维度原子限流
开发语言·人工智能·网络协议·职场和发展·架构·lua·ai-native
谙弆悕博士8 天前
Lua学习笔记
c语言·开发语言·笔记·学习·lua·创业创新·业界资讯
weixin_408099679 天前
触动精灵调用身份证OCR识别API实现智能信息录入(Lua脚本实战)
junit·ocr·lua·自动化脚本·石榴智能·身份证ocr识别·触动精灵
卷毛的技术笔记9 天前
双十一零点扛过10倍流量洪峰:Sentinel与Redis+Lua的分布式限流深度避坑指南
java·redis·分布式·后端·系统架构·sentinel·lua