|
二、弯刀的脚本环境变量与函数封装 接上一篇的工程文件 1.环境变量是什么细心的小伙伴应该能发现,在上一个文件里,我在函数里定义里一个args变量,那这个变量的作用是什么呢? 在弯刀里,每个事件实际上都有一个环境变量,比如在进入城镇的事件里,就储存里当前城镇是什么;在路上遇到其他队伍时,环境变量里储存里对方是哪个角色。因为有环境变量,才能在各个事件里区分目标人物与目标地点。 2.环境变量参考打开游戏目录 DesertLegend\ModSamples\ScriptInterfaces在这个文件夹下,存储着弯刀对lua开放的各种参考脚本文件,以下是各文件的注解: GameCoreHelper.cs --弯刀对Lua开放的游戏工具类 GUIHelperInterface.cs --弯刀对Lua开放的GUI工具类 IGameContainer.cs --游戏里的储存容器的接口 IGameRole.cs --游戏里的角色的接口 IResourceOwner.cs --游戏里资源持有者(如角色)的接口 ITeamInMap.cs --游戏里大地图队伍的接口 RuntimeArgVals.cs --游戏里的环境变量类 我们现在的目标是RuntimeArgVals.cs这个文件,打开他 打开之后,里面的内容是C#的类定义,没学过C#的小伙伴可能看着有些迷糊,不过此处只需要清楚,类里定义的所有成员变量都是传入脚本的args变量可以使用的即可。 3.使用环境变量修改lua文件里的HelloWorld函数,改成如下形式: function HelloWorld(args) print("角色ID:"..args.CurTagRoleID) end 构建后进入游戏,从控制台调用以下脚本(注,复制后一起粘贴进控制台,不要分开调用): SET_TAGROLE*主角 RUN_SCRIPT_FUNC*example1#HelloWorld 恩,很好,控制台输出了……主角! 别急,这并不是一个没用的举动,这里我们是手动传入了TarRole的ID,但是在实际的事件调用过程中,TagRole是由游戏自动填写的,因此我们可以再做一丢丢(指尖宇宙)的修改。 4.把Lua脚本封装成指令接下来,我们打开GameCoreHelper.cs 文件,找到以下方法: 该方法的作用是返回一个角色的数据,在Lua里的调用方法为: CS.GameCoreHelper.GetRole(roleName) CS是xlua调用C#的通用协定前缀,GameCoreHelper是这个工具类的类名。 可以看出C#的方法在lua里调用,基本大差不差。 我们用一个变量接收返回的Role数据 local role = CS.GameCoreHelper.GetRole(args.CurTagRoleID) 对于这个数据,该如何使用? 打开IGameRole.cs 从这里可以看到,RoleRuntimeData继承了IGameRole接口,不理解继承和接口也没关系,只需要知道下面的属性都可以在lua里使用即可。 我们本次翻到下面两个方法定义: 这次我们就用这两个接口,封装一个给目标角色升一级的方法。 在Lua里定义以下函数: function AddRoleLevel(args) local role = CS.GameCoreHelper.GetRole(args.CurTagRoleID) role:AddExp(role:GetRoleLevelUpExp()) end 该函数的功能一目了然,获取一个角色升级所需要的经验值,为该角色添加升级所需的经验。 注:冒号与点号的区别 在Lua里,点号用于获取表(table)里的一个任意物体,而冒号,则是在表里获取函数后调用时,将自己作为函数的第一个参数。 如: a:b() 等价于 a.b(a) 而xlua在调用C#的函数时,如果是非静态函数,则需要将自身作为第一个参数,传入到函数当中。 接下来打开触发器Excel,加入以下一行内容(注:从官方文件复制的Excel记得要清空一下): 打开剧情事件Excel,加入以下一行内容: | Lua函数测试1 | | RUN_SCRIPT_FUNC*example1#AddRoleLevel | |
保存,构建,进入游戏 找到一个未满级的角色,对话 点击升级后,离开对话,重新打开队伍面板后,可以看到角色已经升了一级
|