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)),
    };

然后重新生成:

相关推荐
小李云雾19 小时前
FastAPI 后端开发:文件上传 + 表单提交
开发语言·python·lua·postman·fastapi
曼巴UE521 小时前
Unlua 官方案例
c++·ue5·lua·ue
列星随旋2 天前
基于 Redis + Lua,实现“多维度原子限流”(令牌桶 + 滑动窗口)
java·redis·lua
上海合宙LuatOS2 天前
LuatOS扩展库API——【exgnss】GNSS定位
物联网·lua·luatos
0xDevNull2 天前
Redis Lua 脚本详细教程
redis·缓存·lua
上海合宙LuatOS2 天前
LuatOS扩展库API——【exlcd】显示屏控制
物联网·lua·luatos
0xDevNull2 天前
Spring Boot 中使用 Redis Lua 脚本详细教程
spring boot·redis·lua
DJ斯特拉4 天前
Redis使用lua脚本
junit·单元测试·lua
Aktx20FNz4 天前
OpenClaw中级到高级教程
lua
LcGero4 天前
Lua + Cocos Creator 实战:用 Lua 驱动 UI 与游戏逻辑
游戏·ui·lua