脚本报错是搭建调整过程里很容易碰到的情况,报错信息会记录在服务端运行日志当中,处理这类问题不要直接盲目修改代码,先看懂日志提示,定位出错文件和行号,再分类型处理,能够节省大量调试时间。
最先要做的步骤是提取报错信息,打开服务端日志文件,找到脚本相关的提示内容,大部分提示会标注脚本文件路径、出错行数、错误关键字。如果日志只提示脚本加载失败,没有给出详细行号,就需要单独打开这个脚本文件,用文本工具开启行号显示功能,对照报错位置查看。很多时候日志提示的行号附近不一定是根源,符号缺失、引号不配对的错误,报错位置会偏移到后面的代码行,需要从提示行往上回溯检查。
编码问题属于高频错误,使用系统自带记事本保存脚本,很容易带上特殊编码标记,引擎读取的时候识别乱码,直接判定脚本语法异常。所有脚本文件统一选用支持编码切换的文本工具打开,修改完成之后,保存格式选择无BOM的编码格式。已经出现乱码报错的脚本,把内容全部复制出来,新建空白文档,粘贴进去之后重新保存,替换原有文件再重启服务加载测试。不要直接在原文件反复保存,旧的编码标记会一直留存。
语法格式错误覆盖的情况比较多,引擎脚本有固定的书写规范,任意一处符号写错都会中断加载。括号成对缺失、引号只写一半、分号遗漏、大小写混用、空格和制表符混用,都是常见诱因。触发段、条件判断、循环语句,开头和结尾标记必须一一对应,少写一个结束标记,整条脚本逻辑无法解析。还有参数之间的分隔符写错,逗号打成中文逗号,引擎无法拆分参数,直接抛出错误。逐行核对的时候,重点检查条件判断区域、物品拾取触发、技能触发、NPC对话脚本,这些位置改动频率高,出错概率更大。
变量和调用对象不存在也会触发报错。脚本内调用了没有定义的变量,读取不存在的字段,调用还没有加载的子程序,或者书写时把变量名称输错字母,引擎找不到对应对象就会报错。还有调用NPC、怪物、技能编号和配置表里的编号不一致,编号不存在,执行到这一行代码直接终止。碰到这类提示,可以先在配套配置文件里检索对应的编号、变量名称,确认是否提前定义。新增变量尽量放在脚本头部统一声明,子程序保证调用顺序正确,先加载子程序再执行调用代码。
文件引用路径错误,在多脚本拆分的版本里很常见。脚本中使用导入指令加载外部脚本,填写的文件路径写错、文件夹名称改动、引用的脚本被删除或者移动位置,加载时找不到目标文件,连带主脚本报错。路径区分大小写,文件夹改名之后,所有引用它的脚本都要同步修改。核对导入语句,确认引用文件真实存在,路径层级和书写内容保持一致。
逻辑执行类报错和加载报错不一样,脚本可以正常加载,服务端启动没有提示,但是满足触发条件的时候才弹出错误。比如脚本判定范围超出地图范围,检索目标数量设置过大,循环没有退出条件,释放技能、拾取物品、击杀怪物的时候触发死循环,日志里会出现执行超时提示。这类问题很难在启动阶段发现,需要进游戏复现操作,在触发动作的瞬间查看日志。发现循环逻辑的时候,增加退出条件,限制单次检索目标上限,避免无限制遍历。
版本指令不兼容也是容易忽略的点。不同引擎支持的脚本指令集不一样,从别的版本复制过来的脚本,里面的指令关键字当前引擎不支持,加载或者执行的时候报错。不要直接跨引擎复制脚本片段,使用陌生指令之前,查阅配套的命令说明文档,确认当前引擎支持这条指令。不兼容的指令,替换成同功能可用指令,或者重写这一段逻辑。
排查的时候可以使用分段注释法,快速缩小出错范围。把一大段脚本中间一部分代码注释屏蔽,重启服务加载,如果报错消失,代表出错位置在被注释的代码段内。继续对半拆分注释,反复测试,直到锁定到很小一段代码,再仔细检查里面的参数和符号。这个方法适合很长的任务脚本、技能触发脚本,比逐行通读效率高很多。
处理完脚本之后,需要正确的生效流程,修改脚本保存完成,替换文件,重启对应的服务进程。部分版本支持热加载脚本,但是热加载并不稳定,很多语法错误热加载不会给出准确提示,优先重启服务测试。每次修改前备份原始脚本文件,改动之后问题无法修复,可以直接还原备份,避免反复重写。
多个脚本相互联动的场景,一个脚本出错,有可能连带其他调用它的脚本一起提示异常,不要只盯着第一条报错信息,顺着调用关系向上追溯源头。日志里连续多条脚本报错,优先解决排在最前面的第一条,很多时候第一条修复完成,后续连带报错会一并消失。
日常维护养成习惯,修改脚本之后先保存正确编码,加载之后先看启动日志有没有报错提示,再进游戏复现功能。不要忽略轻微警告提示,警告不一定直接让服务崩溃,但是运行过程中随时可能引发功能异常、数据读取异常。
传奇架设脚本报错排查思路讲解 脚本错误常见类型与修复方法
来源:
作者:
点击:

