详细讲解一下官方原生引擎中各种引擎变量的作用、使用场景及其区别
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-04-30 11:03:13 |
👁️ 阅读: 6
在官方原生引擎中,引擎变量是记录和判断游戏状态的核心工具,主要分为以下几类,各有不同的作用、使用场景和区别:
### 一、系统变量(个人与全局)
这类变量是引擎内置的,用于存储常见的数据。
1. **个人标识变量(个人标记)**
* **作用**:记录玩家下线后需要保存的简单状态,只有两种状态:0 和 1。
* **使用场景**:常用于记录任务是否完成、活动是否参与、开关状态等。
* **数量与保存**:可保存 800 个 (索引 000-799),下线保存。
* **相关接口**:`check(actor, flags, value)` 用于检测,`set(actor, flags, value)` 用于设置,`flag(actor, flags)` 用于获取常量值。
2. **数字型个人变量 (U) 与 字符型个人变量 (T)**
* **作用**:存储在数据库中的个人变量,用于记录玩家需要长期保存的数值或字符串信息。
* **使用场景**:记录玩家的累计登录天数、自定义称号、个人设置等。
* **数量与保存**:各可保存 1000 个 (U0-U999, T0-T999),存放在数据库,下线保存。
* **相关接口**:通过 `sethumvar(actor, varName, varValue)` 和 `gethumvar(actor, varName)` 进行设置和获取。
3. **数字型全局变量 (G) 与 字符型全局变量 (A)**
* **作用**:存储在数据库中的全服变量,用于记录全服状态。
* **使用场景**:记录全服活动开启状态、全服BOSS刷新时间、全服公告等。
* **数量与保存**:各可保存 1000 个 (G0-G999, A0-A999),存放在数据库。
* **相关接口**:通过 `sethumvar(0, varName, varValue)` 和 `gethumvar(0, varName)` 进行设置和获取。
4. **数字型个人临时变量 (N) 与 字符型个人临时变量 (S)**
* **作用**:存储在内存中的个人临时变量,默认下线不保存。
* **使用场景**:用于记录单次登录期间的临时状态,如当前对话的NPC ID、临时任务进度等。
* **数量与保存**:各可保存 1000 个 (N0-N999, S0-S999),默认下线不保存。如需保存,需使用 `savehumvar` 接口。
* **相关接口**:通过 `sethumvar(actor, varName, varValue)` 和 `gethumvar(actor, varName)` 进行设置和获取。
### 二、保存型变量 (Setint/Setstr)
这类变量功能与系统变量中的 U/T 类似,但接口更直观。
* **作用**:用于玩家、物品或门派对象,保存需要持久化的整型或字符串数据。
* **使用场景**:与 U/T 变量类似,记录玩家、物品或门派的属性、标记等。
* **区别与特点**:
* 所有变量名不可重名。
* 支持对玩家、物品、门派对象进行操作。
* **相关接口**:`setint(actor, varName, value)` / `getint(actor, varName)` 用于整型;`setstr(actor, varName, value)` / `getstr(actor, varName)` 用于字符串。
### 三、临时型变量 (Settempint/Settempstr)
这类变量功能与系统变量中的 N/S 类似,但支持的对象类型更广。
* **作用**:用于玩家、物品、怪物、NPC 或门派对象,记录临时数据。
* **使用场景**:记录怪物临时的仇恨目标、NPC 对话的临时选项、物品的临时状态等。
* **区别与特点**:
* 所有变量名不可重名。
* 支持的对象类型更广泛(玩家、物品、怪物、NPC、门派)。
* 默认不持久化保存。
* **相关接口**:`settempint(actor, varName, value)` / `gettempint(actor, varName)` 用于整型;`settempstr(actor, varName, value)` / `gettempstr(actor, varName)` 用于字符串。
### 四、自定义临时变量 (S$ 与 N$ 开头)
这是对 S/N 临时变量的扩展,提供更灵活的命名。
* **作用**:通过 `S$` 或 `N$` 开头的自定义变量名,创建字符或数字临时变量。
* **使用场景**:当预定义的 S0-S999 或 N0-N999 不够用,或需要更具描述性的变量名时使用。
* **区别与特点**:
* 变量名以 `S$`(字符)或 `N$`(数字)开头,后面可接任意字符。
* 默认下线不保存,如需保存需调用 `savehumvar` 接口。
* 支持排序操作(`sorthumvar`)。
* **相关接口**:同样使用 `sethumvar` 和 `gethumvar` 进行设置和获取。
### 五、缓存型自定义变量 (CustVar)
这是一种特殊类型的变量,用于需要跨服或高效访问离线玩家数据的场景。
* **作用**:声明一个会被加载到内存缓存的变量,可以实现获取离线玩家的变量值。
* **使用场景**:全服排行榜数据、需要高效读取的离线玩家信息(如上次登录时间)、跨服数据同步等。
* **区别与特点**:
* **重要说明**:由于会加载到缓存,**不建议大量使用**。常规功能应优先使用 T/U/N/S 或 setint/setstr。
* 变量名不要以 G、A、N、S、T、U 开头,避免与系统变量冲突。
* 通过 `defcustvar(type, varKey, varName, isSave)` 声明,`getcustvar(str)` 获取。
* 类型为 11 时供自定义使用,`varKey` 通常为玩家ID,以此实现获取离线玩家变量。
### 六、通区变量 (Dckey)
用于在跨服架构下的不同游戏服务器(区服)之间共享数据。
* **作用**:在中心服存储和修改数据,实现全区全服的数据共享与操作。
* **使用场景**:跨服活动状态、跨服排行榜、全服邮件记录等。
* **区别与特点**:
* 数据存储在中心服,对所有区服可见。
* 操作支持回调函数,可在值改变时触发特定逻辑。
* **相关接口**:`setdckeyi(actor, type, key, value, char, funcName)` 用于设置数字变量;`setdckeys(actor, type, key, value, char, funcName)` 用于设置字符串变量。
### **总结与选择建议**
1. **需要永久保存的个人状态**:优先使用 **个人标识变量(000-799)** 或 **保存型变量 (U/T, setint/setstr)**。
2. **需要永久保存的全服状态**:使用 **全局变量 (G/A)**。
3. **单次登录期间的临时状态**:使用 **临时型变量 (N/S, settempint/settempstr)** 或 **自定义临时变量 (S$/N$)**。
4. **需要极高效读取、涉及离线玩家或特殊跨服需求**:谨慎使用 **缓存型自定义变量 (CustVar)**。
5. **需要在多个游戏区服间共享数据**:使用 **通区变量 (Dckey)**。
核心原则是:根据数据的生命周期(临时/永久)、作用范围(个人/全服/跨服)以及性能要求,选择最合适的变量类型,并避免滥用缓存型变量。
← 返回问答库