996M2新三端-服务端/search"SetStr"/接口/变量相关/普通变量/设置对象str型变量
设置对象str型变量
SetStr
设置对象str型变量
🎯 功能设定:
1. 所有变量都不可重名
2.分身宝宝属于怪物类型
3.命名时切勿使用 sys_ 作为变量名前缀,该前缀引擎占用
4.M2-选项-功能设置-其他设置-变量设置-变量名大小写敏感
复制
SetStr(Type, actor, sVarName, nValue)
参数
参数 类型 说明
Type integer 类型
0
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-06-04 16:46:08 |
👁️ 阅读: 10
我是lua后端老师!小仙,你问的是996M2新三端引擎里设置和获取对象字符串变量的老接口 `SetStr` 和 `GetStr` 吧?不过根据我掌握的引擎知识,这两个是老GOM引擎风格的命令,在996M2引擎中,我们更推荐使用一套更清晰、更强大的新接口来操作变量。
让我来给你详细解释一下,特别是针对你提到的怪物和NPC的字符串变量操作:
**1. 设置对象字符串变量(新接口 - `setobjstrvar`)**
这个函数用于给一个怪物或NPC对象设置一个临时的字符串变量。这个变量是临时的,不会保存到数据库,而且如果NPC被重新加载(比如重读NPC脚本),变量就会丢失。
```lua
-- 函数原型
setobjstrvar(obj, idx, value)
```
**参数说明:**
* `obj`: **object** 类型,**不能为空**。这是怪物或NPC的对象本身。
* `idx`: **integer** 类型,**不能为空**。变量的位置索引,范围是1到5。这意味着每个怪物/NPC对象最多可以存5个字符串变量。
* `value`: **string** 类型,**不能为空**。你要设置的字符串变量值。
**使用示例:**
```lua
-- 假设我们有一个NPC对象
local npc = getnpcbyindex(10001) -- 获取索引为10001的NPC对象
-- 给这个NPC设置第一个字符串变量,值为"我是沙城老兵"
setobjstrvar(npc, 1, "我是沙城老兵")
-- 假设我们有一群怪物对象
local mapID, x, y = getMapXY(actor) -- 获取玩家当前坐标
local mons = getobjectinmap(mapID, x, y, 10, 2) -- 获取周围10格内的怪物
for i, mon in ipairs(mons or {}) do
-- 给每个怪物设置一个带编号的字符串变量
setobjstrvar(mon, 1, "被标记的怪物_" .. tostring(i))
end
```
**2. 获取对象字符串变量(新接口 - `getobjstrvar`)**
这个函数用于从一个怪物或NPC对象那里获取之前设置的字符串变量值。
```lua
-- 函数原型
getobjstrvar(obj, idx)
```
**参数说明:**
* `obj`: **object** 类型,**不能为空**。怪物或NPC的对象。
* `idx`: **integer** 类型,**不能为空**。要获取的变量位置索引,范围1-5。
**返回值:**
* **string**: 返回在指定位置存储的字符串变量值。如果该位置没有设置过变量,可能会返回空字符串或nil(取决于引擎实现),所以使用前最好判断一下。
**使用示例:**
```lua
-- 接上面的例子,获取NPC的变量
local npc = getnpcbyindex(10001)
local npcVar = getobjstrvar(npc, 1)
release_print("NPC的变量值是:", npcVar) -- 会打印出“NPC的变量值是:我是沙城老兵”
-- 获取怪物的变量(假设mon是上面循环中的一个怪物对象)
local monVar = getobjstrvar(mon, 1)
if monVar and monVar ~= "" then
release_print("这个怪物的标记是:", monVar)
end
```
**总结与建议:**
小仙,`SetStr`/`GetStr` 这种老式接口在996M2里可能已经不被推荐或者有兼容性问题了。引擎现在提供了 `setobjstrvar` 和 `getobjstrvar` 这样专门针对**对象(怪物/NPC)** 的变量操作接口,功能明确,参数清晰。
**核心区别:**
* **老接口 (`SetStr`)**:用一个 `Type` 参数区分对象类型,用 `sVarName` 来命名变量。
* **新接口 (`setobjstrvar`)**:直接传入对象本身(`obj`),用数字索引(`idx`)来区分变量,变量是匿名的。
**重要提醒:**
这些对象变量是**临时的**,主要用来在脚本执行过程中,在同一个NPC对话或怪物存活期间传递一些状态信息。它们不适合存储需要永久保存的数据。
所以,以后在996M2里做怪物或NPC的变量,就认准 `setobjstrvar` 和 `getobjstrvar` 这对好兄弟吧!如果还有不明白的,随时可以再来问我,或者去请教我的师傅浮生梦尊者哦!
← 返回问答库