You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用NLua保存Lua文件修改后的内容?

如何用NLua将修改后的LuaTable保存为新Lua文件?

我有一个包含待处理数据的大型Lua文件,希望将修改后的内容保存到新Lua文件中。我正在使用NLua读取文件结构并修改信息,但尚未找到保存这些修改的方法。以下是我的代码:

public static void Main(string[] args)
{
    Lua lua = new Lua();
    lua.DoFile("C:\\temp\\mission.lua");

    LuaTable mission = lua.GetTable("mission");
    var coalitions = Search(mission, "coalition");
    var blue = Search(coalitions.First(), "blue");
    var planes = Search(blue.First(), "plane");
    var groups = Search(planes.First(), "group");

    foreach (var group in groups)
    {
        foreach (long groupId in group.Keys)
        {
            bool groupSet = false;
            var groupX = (LuaTable)group[groupId];
            var units = Search(groupX, "units");
            
            foreach (long unitId in units.First().Keys)
            {
                var unitX = (LuaTable)units.First()[unitId];

                if(!groupSet)
                {
                    groupX["name"] = unitX["type"] + $"-{++counter}";
                    groupSet = true;
                }

                unitX["name"] = groupX["name"] + $"-{unitId}";                    
            }
        }
    }

    // Not implemented yet
    WriteFile("C:\\temp\\WWII_Mixed_Combat\\mission2.lua", mission);

    Console.ReadLine();
}

"Search"是用于查找指定名称LuaTable对象的函数。


解决方案:利用Lua原生函数序列化Table

NLua没有内置的Table转Lua文件功能,你可以通过在Lua环境中定义序列化函数,再从C#调用该函数来完成保存操作:

  1. 在C#代码中,初始化Lua环境后,先加载一个Lua序列化与保存函数:
// 加载Lua序列化与保存函数
lua.DoString(@"
function serializeTable(t, indent)
    indent = indent or 0
    local str = string.rep('  ', indent) .. '{\n'
    for k, v in pairs(t) do
        local keyStr
        if type(k) == 'string' then
            keyStr = string.format('[%q] = ', k)
        else
            keyStr = string.format('[%d] = ', k)
        end
        local valStr
        if type(v) == 'table' then
            valStr = serializeTable(v, indent + 1)
        elseif type(v) == 'string' then
            valStr = string.format('%q', v)
        else
            valStr = tostring(v)
        end
        str = str .. string.rep('  ', indent + 1) .. keyStr .. valStr .. ',\n'
    end
    str = str .. string.rep('  ', indent) .. '}'
    return str
end

function saveMission(filename, missionTable)
    local file = io.open(filename, 'w')
    if file then
        -- 生成完整的Lua文件内容,以mission变量开头
        local content = 'mission = ' .. serializeTable(missionTable) .. '\n'
        file:write(content)
        file:close()
    end
end
");
  1. 替换原来未实现的WriteFile调用,改为调用Lua的saveMission函数:
// 调用Lua的保存函数
lua.GetFunction("saveMission").Call("C:\\temp\\WWII_Mixed_Combat\\mission2.lua", mission);

注意事项

  • 上述序列化函数适用于纯数据类型的Table(字符串、数字、嵌套Table),如果你的Table中包含函数、userdata等复杂类型,需要根据实际情况修改序列化逻辑。
  • 生成的Lua文件会保持原有的Table结构,格式缩进清晰,便于后续编辑或读取。

内容的提问来源于stack exchange,提问作者Malior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:45:23