游戏中调用LUA脚本的开发及调试

来自部落与弯刀Wiki

安装LUA脚本开发IDE工具

开发者可以使用任何趁手的工具来编写LUA脚本。这里我们为了调试方便所以采用了VsCode + LuaPanda插件来编辑LUA脚本,并能实现断点调试、变量监控等功能

 Img 1.png
  • 由于xlua的lua文件格式是.lua.txt的,所以vscode默认情况下并不能将其识别为lua文件,需要我们通过settings来完成
 Imgpic 2.png  
  • 打开自定义设置的JSON文件,并添加如下内容:
 {
   "files.associations": {
       "*.lua.txt":"lua"
   },
   "luaide.apiType": "xlua",
 }

注意:在选择配置文件时一定要选择workspace settings而不是user settings,选择之后会在工程根目录下生成一个.vscode文件夹,里面有一个settings.json;如果.lua.txt文件中出现了lua的语法高亮,则为配置成功;

 Imgpic 3.png  
 Imgpic 4.png
  • 在调试选项中选择生成launch.json,然后选择LuaPanda;

注意:如果没有看到luapanda,需要重启一下VsCode,或者将其它调试器关掉后重启;

生成了如下三种配置,这里我们需要注意的设置就是luaFileExtension选项,我们需要配置成我们xlua的格式,也就是".lua.txt";

 Imgpic 5.png

如何在MOD中运行及调试脚本

游戏中的Lua脚本代码最终必须映射到资源目录“Asset\BuildSource\LuaScripts\”下来运行。运行时可以使用 RUN_SCRIPT 或者 RUN_SCRIPT_FUNC 来调用脚本或者脚本中的函数(具体见通用剧情事件指令说明)。

如: RUN_SCRIPT_FUNC*test_script#TestFunc1

编写脚本时,可以在脚本中加入下列代码来开启脚本调试功能,当调用该脚本后,就可以在VsCode中对该脚本中的任意代码位置打断点进行调试等操作了。

 require("LuaPanda").start("127.0.0.1",8818)

当调试结束后记得注释掉该行以提高游戏性能。


如何重写游戏核心逻辑脚本

在0.7.4.1版本以后,我们逐渐将游戏的一些核心逻辑放到LUA脚本中,这样MOD制作者就可以改写自己的一些游戏核心逻辑(如外交、内政、好感度系统等)。后续还将陆续开放战斗数值结算等相关的核心逻辑接口,以给予MOD制作者更大的发挥创意的空间。

目前游戏内置的主要逻辑接口代码都写在位于映射路径“Asset\BuildSource\LuaScripts\GameLogics.lua.txt”的LUA脚本中(源代码可在游戏根目录下\ModSamples\LuaScripts\文件夹中找到),通过MOD设置中的override功能映射该路径就可以对指定的LUA脚本进行替换重写了。

GameLogics.lua.txt脚本中的主要代码接口有:

接口方法 用途 参数说明
OnGameStart() 每次进入游戏(或是载入游戏后)会调用此接口 无参数
GetLuaStringVal(valKey, contextArgVal) [$lua_str:KEY$]查询指令对应的接口 valKey:查询字段的KEY

contextArgVal:查询指令调用时的环境变量参数

返回值:查询结果字符串

GetLuaIntVal(valKey, contextArgVal) [$lua_int:KEY$]查询指令对应的接口 valKey:查询字段的KEY

contextArgVal:查询指令调用时的环境变量参数

返回值:查询结果整形数字

SetRoleRep(opRole, targetType, tagID, opVal, isAdd, isNotify, isChainedMode) 游戏内为角色改变对应声望的接口 opRole:执行操作的角色对象

targetType:操作对象类型 0:阵营 1:角色 2:地点

tagID:操作对象的ID

opVal:操作值

isAdd:是否改变模式,当为true时在原值上加减,否则为直接设置到目标值

isNotify:当涉及主角时是否进行信息播报

isChainedMode:是否进行链式操作(关联好感度的对象进行改变)

返回值:查询结果整形数字

GivePresentLogic(contextArgVal) 给NPC送礼物涨好感度的逻辑接口 contextArgVal:调用此逻辑时的环境变量参数

返回值:无

OnCampDailyLogic(tagCamp, curDay) 阵营每日逻辑(游戏中每天都会对所有阵营执行此逻辑接口) 无参数和返回值
OnAIDecideDipEvent(execCamp, dipInfo) AI势力决定外交行为的判断(玩家处理外交行为逻辑通过处理 dip_event 触发器事件来决定) execCamp:当前执行此外交事件的阵营对象

dipInfo:当前执行外交事件的详细信息,类型为DiplomaticEventInfo,其数据结构如下:

  • public GameCampRtData fromCamp;
  • public GameCampRtData execCamp;
  • public int dipType;
  • public string tagRoleID;
  • public string argsVal;
  • public float resultRatio;
  • public bool isDecided;

返回值:无

OnDipEventCallback(dipResult, dipInfo) 游戏中所有阵营执行外交事件处理结果接口 dipResult:外交事件结果 true 同意 false 拒绝

dipInfo:同上

返回值:无

SetCampRl(campID1, campID2, rlState, fvOpMode, fvOpVal, isNotify) 游戏中所有操作阵营外交关系时执行的接口 campID1:外交关系对象A

campID2:外交关系对象B

rlState:欲改变至的外交状态 -1:不改变 0:中立 1:敌对 2:结盟

fvOpMode:外交好感度的操作方式:0:不改变 1:增加 2:设置到目标值

fvOpVal:外交好感度操作值

isNotify:当涉及玩家时是否进行信息播报

返回值:查询结果整形数字