很多在修改服务端脚本的用户常会遇到一个情况,修改完脚本保存之后,进入游戏测试,但是游戏里没有任何变化,参数、掉落、触发逻辑依旧维持修改前的状态。出现这个问题并不是代码写错这单一原因,从文件保存、加载机制到服务进程、编码格式,多个环节都会造成修改内容无法被读取,按照顺序逐项排查,可以快速定位根源。
首先确认脚本文件是否正确保存,以及修改的是不是当前正在运行服务端对应的文件目录。很多人电脑里存放多个版本的服务端文件夹,打开修改的是备份目录下的脚本,而实际启动的服务端读取的是另外一套目录文件,修改的文件和运行环境不匹配,无论怎么改动,游戏内都不会有反应。修改完成之后需要确认保存,部分编辑器在打开文件时会生成临时缓存文件,没有点击保存,改动仅停留在编辑器内存中,磁盘上的原始脚本没有更新。还有一种情况是文件权限问题,系统禁止写入,点击保存看似成功,实际文件内容没有发生任何改动,打开脚本再次核对代码内容,确认改动已经写入文件。
其次是服务端引擎的脚本加载机制。大部分引擎不会实时重新读取脚本文件,修改脚本之后,单纯保存文件是不够的,进程依旧在内存中使用旧的脚本数据。不同类型脚本的加载方式不一样,全局配置、怪物爆率、NPC对话脚本,部分需要重启引擎主程序才能重新加载;部分支持在线重载命令,在M2控制台输入对应的重载指令,不用完全关闭服务端就可以加载新脚本。如果修改的是人物技能、地图触发、登录触发这类底层脚本,在线重载基本无效,必须完全关闭引擎进程,确认所有相关程序退出,再重新启动服务端,新脚本才会生效。只退出游戏客户端,不重启服务端进程,内存里面旧脚本会持续运行,游戏内看不到改动效果。
编码格式是很容易被忽略的点。脚本文件默认编码一般为ANSI,使用记事本直接编辑,保存的时候如果选择UTF-8编码,引擎读取脚本时会识别乱码,引擎会直接跳过这个脚本,继续使用内存内旧逻辑,或者直接不加载该脚本,表现为改动无效、NPC不显示、触发失效。尽量使用配套的脚本编辑器打开文件,不要用系统记事本随意更改编码,保存前确认编码选项,避免出现编码异常。
检查脚本语法错误,语法出错会导致引擎加载失败。引擎在读取脚本的时候,如果检测到括号缺失、变量写错、换行符异常、命令关键字拼写错误,会直接放弃加载这个脚本,维持原有逻辑。可以打开M2引擎控制台,查看启动日志,日志里面会打印脚本读取信息,报错信息会标注出错文件和行数,根据日志提示修正语法问题。没有查看日志的情况下,只凭游戏表现很难判断是脚本没有加载成功,还是逻辑本身写的不对。
缓存文件干扰也会造成脚本修改不生效。部分引擎会生成脚本编译缓存文件,第一次启动时把脚本编译成缓存,后续启动优先读取缓存内容,即便原始脚本文件改动,缓存没有删除,依旧读取旧内容。需要找到缓存目录,删除对应的缓存文件,再重启引擎,让引擎重新解析原始脚本。客户端本地缓存资源也要区分开,如果修改的是服务端逻辑,客户端补丁、本地缓存一般不会影响脚本;但如果是界面提示文字,部分文字资源打包在客户端,只修改服务端脚本,游戏界面文字不会变化。
区分脚本修改的作用对象,避免混淆服务端和客户端逻辑。怪物刷新、爆率、NPC对话、人物属性计算、技能触发判断,这类逻辑属于服务端脚本,修改服务端文件即可。但是人物模型、界面按钮、图标外观,这些属于客户端资源,哪怕服务端脚本调整,客户端资源不变,游戏画面上不会出现变化。很多新手会误把客户端显示内容当成脚本控制范围,反复修改服务端脚本,自然看不到效果。
测试阶段需要完整操作流程,修改脚本保存,核对文件路径,查看M2日志确认无报错,执行重载或者重启服务端,之后再重启游戏客户端进入地图测试。如果多人连接测试,所有玩家都要退出角色重新登录,部分角色变量在角色上线时载入,角色不下线,内存中的角色数据不会刷新,参数改动不会即时体现在当前角色身上。
排查顺序可以简化,先确认修改文件是当前运行服务端目录内的脚本并且已经保存,查看M2控制台日志有没有脚本报错,再确认是否执行重载或者重启引擎,核对文件编码格式,清除脚本缓存,最后区分改动内容属于服务端逻辑还是客户端资源。完成整套检查之后,再进入游戏验证改动效果,就能解决脚本修改之后游戏内无变化的问题。
传奇服务端脚本修改完成游戏内不生效,脚本改动不刷新问题排查方法
来源:
作者:
点击:

