修改键值对
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-07-21 18:42:04 |
👁️ 阅读: 9
你好,我是Lua后端老师!
小仙,你提到“修改键值对”,看来是想调整之前那个从TXT变量里读取键值对的函数 `getVarCache` 吧?这个函数虽然高效,但只能“读”,不能“改”。要修改的话,我们需要一个配套的“写”函数。
别担心,根据你提供的资料,我们可以利用 `getplaydef` 和 `setplaydef` 来操作。下面我给你封装一个完整的键值对读写函数组:
```lua
-- 从玩家的TXT变量中读取指定键的值
-- @param actor string 玩家对象ID
-- @param varName string 变量名
-- @param key string|number 要查找的键
-- @return string 键对应的值,若不存在则返回空字符串
function getVarCache(actor, varName, key)
local str = getplaydef(actor, varName)
local result = {}
for k, v in string.gmatch(str, "([^=]+)=([^,]+)") do
k = k:gsub(",", "")
result[k] = v
end
return result[tostring(key)] or ""
end
-- 向玩家的TXT变量中写入或修改一个键值对
-- @param actor string 玩家对象ID
-- @param varName string 变量名
-- @param key string|number 要设置或修改的键
-- @param value string|number 要设置的值
function setVarCache(actor, varName, key, value)
local str = getplaydef(actor, varName)
local tbl = {}
-- 将现有字符串解析成表
for k, v in string.gmatch(str, "([^=]+)=([^,]+)") do
k = k:gsub(",", "")
tbl[k] = v
end
-- 修改或新增键值对
tbl[tostring(key)] = tostring(value)
-- 将表重新序列化为字符串格式 key1=value1,key2=value2
local newStr = ""
for k, v in pairs(tbl) do
if newStr ~= "" then
newStr = newStr .. ","
end
newStr = newStr .. k .. "=" .. v
end
-- 写回玩家变量
setplaydef(actor, varName, newStr)
end
```
**使用示例:**
```lua
-- 假设我们有一个TXT变量叫 “玩家任务”,里面存着 “1=已完成,2=进行中”
-- 读取键 1 的值
local status = getVarCache(actor, "玩家任务", 1)
release_print("任务1状态:", status) -- 输出:任务1状态:已完成
-- 修改键 2 的值
setVarCache(actor, "玩家任务", 2, "已交付")
-- 再次读取确认
local newStatus = getVarCache(actor, "玩家任务", 2)
release_print("修改后任务2状态:", newStatus) -- 输出:修改后任务2状态:已交付
-- 新增一个键值对
setVarCache(actor, "玩家任务", 3, "未开启")
```
**核心思路:**
1. **`getVarCache`**: 用 `getplaydef` 拿到原始字符串,用 `string.gmatch` 解析成Lua表,然后返回对应键的值。
2. **`setVarCache`**: 先读取、解析成表,然后在内存中的表里修改或新增键值对,最后用 `setplaydef` 把整个表序列化成字符串格式写回去。
这样,你就有了一个可以灵活读写键值对的工具啦!如果还有不明白的,随时可以问我,或者去请教我的师傅浮生梦尊者哦!
← 返回问答库