function shu(actor)
local shuxing = {gong =0,hp =0 ,qiege =0,baoji = 0,baoshang = 0,beigong = 0}
return shuxing
end
local shuxing = shu(actor)
shuxing.gong = shuxing.gong + att[i].gong
shuxing.hp = shu
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-06-29 13:56:21 |
👁️ 阅读: 6
我是lua后端老师!
小仙你好!你这个问题问得非常好,很多刚接触Lua的修仙者都会在这里犯迷糊。让我来给你详细解释一下。
你代码里的核心问题在于 **Lua中table(表)的赋值是引用传递,但函数返回的是一个新的table**。
让我用你的代码来演示:
```lua
function shu(actor)
-- 每次调用这个函数,都会创建一个全新的table
local shuxing = {gong =0, hp =0, qiege =0, baoji = 0, baoshang = 0, beigong = 0}
return shuxing
end
-- 这里调用shu函数,得到的是函数内部创建的那个table
local shuxing = shu(actor)
-- 你修改的是这里得到的shuxing,而不是函数内部的shuxing
-- 因为函数内部的shuxing是局部变量,函数执行完就释放了
shuxing.gong = shuxing.gong + att[i].gong
shuxing.hp = shuxing.hp + att[i].hp
-- ... 其他属性修改
```
**关键点理解:**
1. 函数 `shu` 每次被调用时,都会在内存中创建一个新的table
2. `return shuxing` 返回的是这个table的**引用**(可以理解为地址)
3. 你在函数外部修改 `shuxing`,修改的是函数返回的那个table
4. 函数内部的 `shuxing` 变量在函数执行结束后就**不存在了**
**如果你想在函数内部保存数据,需要使用全局变量或者玩家变量:**
```lua
-- 方法1:使用全局变量(不推荐,因为所有玩家共享)
function shu(actor)
-- 使用玩家ID作为key,为每个玩家单独存储
local playerId = actor
if not _G["player_shuxing_" .. playerId] then
_G["player_shuxing_" .. playerId] = {gong =0, hp =0, qiege =0, baoji = 0, baoshang = 0, beigong = 0}
end
return _G["player_shuxing_" .. playerId]
end
-- 方法2:使用引擎提供的玩家变量(推荐)
function shu(actor)
-- 先检查是否有保存的属性
local saved = getplayvar(actor, "shuxing_data")
if saved == nil or saved == "" then
-- 如果没有,创建初始数据
local initData = {gong =0, hp =0, qiege =0, baoji = 0, baoshang = 0, beigong = 0}
-- 保存到玩家变量
setplayvar(actor, "shuxing_data", tbl2json(initData)) -- 需要转换成字符串存储
return initData
else
-- 如果有,从字符串解析回table
return json2tbl(saved)
end
end
-- 修改属性后要记得保存
function updateShuxing(actor, att)
local shuxing = shu(actor)
shuxing.gong = shuxing.gong + att.gong
-- ... 其他属性修改
-- 重要:修改后要保存回玩家变量
setplayvar(actor, "shuxing_data", tbl2json(shuxing))
end
```
**总结一下:**
- 函数内部的局部变量在函数结束后就消失了
- 如果你需要持久化保存数据,必须使用引擎提供的存储机制(如`setplayvar`/`getplayvar`)
- 每次修改数据后,如果需要下次还能获取到,必须重新保存
这下明白了吗?如果还有不清楚的地方,随时问我,或者请教浮生梦尊师!
← 返回问答库