setplayvar详细讲解
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-13 16:47:52 |
👁️ 阅读: 16
我是lua后端老师!
小仙,我来给你详细讲解 `setplayvar` 这个函数。`setplayvar` 是用来设置玩家自定义变量的,它可以存储整数或字符串类型的值,并且支持持久化保存到数据库。
### **函数格式**
```lua
setplayvar(actor, varScope, varName, value, isSave)
```
### **参数说明**
| 参数 | 类型 | 是否必填 | 说明 |
|------|------|----------|------|
| actor | object | 是 | 玩家对象(如触发中的 `actor`) |
| varScope | string | 是 | 变量范围:`HUMAN`(个人)、`GUILD`(行会)、`NATION`(国家) |
| varName | string | 是 | 变量名(自定义的名称) |
| value | integer/string | 是 | 要设置的变量值(整数或字符串) |
| isSave | integer | 否(默认0) | 是否保存到数据库:0=不存储,1=存储 |
---
### **使用步骤**
1. **先初始化变量**
使用 `iniplayvar` 初始化变量(每个玩家登录时都需要初始化一次,且一个变量名不能同时声明为两种类型)。
```lua
iniplayvar(actor, "integer", "HUMAN", "玩家变量_1") -- 初始化整数变量
iniplayvar(actor, "string", "HUMAN", "玩家变量_2") -- 初始化字符串变量
```
2. **设置变量值**
```lua
-- 设置整数变量(不保存到数据库)
setplayvar(actor, "HUMAN", "玩家变量_1", 996, 0)
-- 设置字符串变量(保存到数据库)
setplayvar(actor, "HUMAN", "玩家变量_2", "996abc", 1)
```
3. **获取变量值**
使用 `getplayvar` 读取变量:
```lua
local val1 = getplayvar(actor, "HUMAN", "玩家变量_1") -- 返回 996
local val2 = getplayvar(actor, "HUMAN", "玩家变量_2") -- 返回 "996abc"
```
---
### **完整示例**
```lua
-- 在登录触发(login)中初始化变量
function login(actor)
iniplayvar(actor, "integer", "HUMAN", "杀怪数量")
iniplayvar(actor, "string", "HUMAN", "最后击杀怪物")
end
-- 在杀怪触发(killmon)中设置变量
function killmon(actor)
local killCount = getplayvar(actor, "HUMAN", "杀怪数量") or 0
setplayvar(actor, "HUMAN", "杀怪数量", killCount + 1, 1) -- 保存到数据库
setplayvar(actor, "HUMAN", "最后击杀怪物", "白野猪", 1)
end
-- 在NPC脚本中读取变量
function main(actor)
local count = getplayvar(actor, "HUMAN", "杀怪数量")
local lastMon = getplayvar(actor, "HUMAN", "最后击杀怪物")
say(actor, "你已击杀 " .. count .. " 只怪物,最后击杀的是:" .. lastMon)
end
```
---
### **注意事项**
1. **变量范围**:
- `HUMAN`:仅当前玩家有效。
- `GUILD`:需通过行会对象操作(使用 `setguildvar`)。
- `NATION`:需通过国家对象操作。
2. **持久化**:
- `isSave=1` 时,变量会保存到数据库,玩家重登后数据不丢失。
- 频繁保存可能增加数据库压力,建议重要数据才持久化。
3. **变量名冲突**:
- 避免使用系统保留的变量名(如 `U1`、`T1` 等),建议用有意义的名称。
4. **类型一致**:
- 初始化时声明的类型(integer/string)必须与设置的值类型一致,否则可能出错。
---
### **常见错误**
- **未初始化就设置**:会提示变量不存在,必须先调用 `iniplayvar`。
- **类型不匹配**:整数变量赋字符串值会导致存储异常。
- **范围错误**:`GUILD` 范围变量不能用 `setplayvar` 设置,需用 `setguildvar`。
如果还有不明白的地方,随时问我哦!浮生梦尊师常说:“基础不牢,地动山摇”,把变量玩转了,后面写复杂功能就轻松啦~
← 返回问答库