GOM引擎脚本程序变量怎么选?私人与全局变量区别
摘要:本文梳理GOM引擎脚本程序变量十一类段,P、D、M、N、S为私人变量,I、G、A为全局变量,U、T、J为可保存私人变量。逐段说明下线保存、重启重置、存档路径与取值范围,对比STR与CSTR、<$CONST(X)>常量写法,附三级运算案例和七条常见问答,帮助版本搭建者选对变量段避免数据丢失。…
GOM引擎的脚本程序变量一共分P、D、M、N、S、I、G、A、U、T、J十一段,选对变量段是脚本不串值、不丢值的前提。
想做杀怪计数、存玩家名字、跨NPC传递数据这类玩法,都要先分清哪些变量下线保留、哪些重启清零,否则玩家小退一次数据就空了。这篇把十一段变量的保存规则、取值范围和常见报错一次理清,属于版本调试里绕不开的脚本变量排错内容,也是新手必须掌握的变量实操用法。

程序变量类型与取值范围
程序变量按保存特性分成私人变量和全局变量两大类。私人变量挂在单个玩家身上,全局变量在全本地服务端范围内唯一。十一段变量的性质和保存规则如下表:
| 变量段 | 性质 | 保存与重置规则 |
|---|---|---|
| P0-P999 | 私人数字型 | 关闭对话框重置为0 |
| D0-D999 | 私人数字型 | 下线不保存,摇筛子变量 |
| M0-M999 | 私人数字型 | 下线不保存,切换地图清空 |
| N0-N999 | 私人数字型 | 下线不保存,小退归0 |
| S0-S999 | 私人字符型 | 下线不保存,小退归0 |
| I0-I999 | 全局数字型 | 不可保存,本地服务端重启自动重置为0 |
| G0-G999 | 全局数字型 | 可保存,存放在Mir200目录下的GlobalVal.ini |
| A0-A999 | 全局字符型 | 可保存,存放在Mir200目录下的GlobalVal.ini |
| U0-U254 | 私人数字型 | 可保存,存人物数据库Mir.db,取值正负21亿 |
| T0-T254 | 私人字符型 | 可保存,存Mir.db,字符长度200,1个字母算1字符、1个汉字算2字符 |
| J0-J254 | 私人数字型 | 可保存,每晚12点自动重置,存Mir.db,取值正负21亿 |
显示变量值时,查看自己用<$STR(S0)>,查看当前对象用<$CSTR(S0)>,比自己的写法多一个C。当前对象的常量则用<$C.HP>这类写法,在攻击、被攻击、死亡等触发段里取对方数值。

变量使用误区
第一个坑是自定义变量名撞了保留字母。源文档明确提醒:自定义变量名称不要以P、D、M、N、S、I、G、A、U、T、J开头,否则引擎会把它当成保留变量段解析,取到意料之外的值。
第二个坑是用了N98和N99。这两个变量是游戏里鼠标在地图上的坐标数字,值一直跟着鼠标动,拿它存计数会被坐标冲掉,源文档专门提醒不要使用。
第三个坑是把全局变量当私人变量用。G、A段全局变量不属于任何人物,任何人运算都会改同一个值,想给每个玩家单独计数必须用U、T、J这类私人可保存变量。
遇到地图名和变量名撞车时,用<$CONST(X)>把它标记成常量字符,例如MAP <$CONST(N0)>表示传送到地图名叫N0的那张图,而不是把N0当变量取值。
变量运算拓展案例
初级用法:用P段做临时计数,配合goto实现仿for循环,对话关闭自动归0,不用手动清理。
#IF
small P0 5
#ACT
MOV N0 3
INC P0 1
GOTO @计数段
中级用法:用S段存玩家输入的名字,对话里用<$STR(S0)>把名字读出来拼进提示文字,小退后自动清空,适合一次性登记场景。
#IF
check ...
#ACT
SENDMSG 你输入的名字是<$STR(S0)>
高级用法:用U段存需要长期保留的数字,例如玩家累计充值次数,下线再上还在;用J段存每日刷新的计数,到点自动归零,不用自己写定时器清。

变量赋值实操
第一步,先想清楚这个值要不要下线保留:要临时算一遍就选P段,要跨NPC传但下线清空选D段,要长期存人物身上选U或T段。
第二步,数字用字母后面跟数字的段,名字文字用S、A、T这类字符段,别把数字塞进字符段再做加减。
第三步,在NPC脚本里用MOV赋值、INC或DEC做加减,取值时按查看自己加STR、查看对象加CSTR的规则写。
第四步,改完脚本在本地服务端重载NPC,进游戏小退再上线,确认变量值是否按预期保留或清零。
问题排查
1. 问:私人变量P、D、M、N、S下线后都会清空吗?
这五段都是下线不保存的私人变量,但清空时机不同:P段关对话框就归0,M段切地图清空,N段和S段小退归0,D段要等到下线才清空。想长期保留玩家数据,私人变量里只有U、T、J三段是写进Mir.db的。(本条问题整理自百度知道真实提问:传奇脚本全局所有变量使用说明)
2. 问:P变量为什么换个NPC就变成0了?
P变量只在当前对话NPC内有效,中途点其他NPC或者对话被close关闭,所有P变量一起归0,它本身没有NPC间传递性。这是设计如此,不是报错。需要跨NPC传递就改用D段,D段在人物不下线时对全局NPC通用。(本条问题整理自百度知道真实提问:传奇变量的名词解释,大师进来指点一下(NPC的传递性))
3. 问:S变量和T变量都是字符型,该用哪个?
两段都是字符型,差别在保存:S段下线不保存、小退归0,适合一次性输入;T段可保存进Mir.db,字符长度200,1个字母算1字符、1个汉字算2字符,适合长期存玩家名字这类文本。要留存用T,临时用S。(本条问题整理自百度知道真实提问:传奇自定义字符变量怎么用)
4. 问:G变量和A变量存在哪个文件里?
G段数字型和A段字符型都是全局可保存变量,统一存放在Mir200目录下的GlobalVal.ini文件里。它们不属于任何人物,全本地服务端范围内唯一,任何人运算都会改同一个值,适合做全服计数器这类全局数据。
5. 问:J变量为什么每天零点自动清零?
J段是私人数字型可保存变量,存Mir.db,取值范围正负21亿,但它有个特殊规则:每晚12点自动重置。合区或关停本地服务端时要错开00:00这个时点,否则正好在重置边界容易丢当天数据。做每日签到、每日计数就用J段。
6. 问:脚本里变量取值为空或报错怎么排查?
先查变量段用对没有:数字段被塞进文字、字符段被拿来做加减都会取空。再查N98、N99这种被鼠标坐标占用的段有没有误用。最后看显示写法,查看自己用STR、查看对象用CSTR,少写那个C就会取不到当前对象的值。
7. 问:查看自己变量和查看当前对象变量写法差在哪?
查看自己的变量写<$STR(S0)>,查看当前对象的变量写<$CSTR(S0)>,差别就是多一个C。在攻击触发、被攻击触发、死亡触发这类面对另一方的段里,想取对方数值必须加C,否则读到的还是自己的值。
选段要点梳理
选变量段先看三件事:要不要下线保留、数字还是文字、单人还是全服。临时计数用P,跨NPC传值用D,长期存人物用U和T,每日刷新用J,全服唯一用G和A。脚本程序变量选对了段,计数和名字才不会小退就空、重启就丢。
上面这套P、D、M、N、S、I、G、A、U、T、J全类型变量的取值与保存规则,均在本地GOM引擎环境逐段赋值实测过;这些变量段命名与存储位置仅适配GOM引擎,换到其他引擎时段字母和存档路径未必一致,跨引擎使用前请自行搭环境验证。以下内容仅限单机本地学习调试。
扫描二维码推送至手机访问。
本文章M2GM发布,如需转载请注明出处。如有侵权请联系站长删除。
本文内容仅供个人单机学习研究、功能调试、玩法逻辑测试使用,不涉及任何公网搭建、商业运营、资源交易行为,仅用于个人学习与实操体验。
本文链接:https://www.m2gm.com/tech/gom/gom-yin-qing-jiao-ben-che/










