【教程】LuaEngine开发教程(四) - 内置功能的介绍

上篇教程我们讲解了如何编写一个简单的脚本,在编写过程中我们已经接触了LuaEngine的一些内置功能,接下来我们将分几部分详细讲解LuaEngine的内置功能。请注意,本篇教程编写时的版本为1.1.5,如果后续LuaEngine更新发生功能变动,请根据更新日志中的修改方法进行代码迁移。

调用函数

首先是LuaEngine在运行是会调用脚本中的函数说明

  • on_init init函数会在脚本首次被游戏加载时被调用。
  • on_time time函数会在游戏过程中每次时间发生变动时被调用,通常逻辑代码均写在这里
  • on_monster_create MonsterCreate函数会在有怪物被生成时被调用
  • on_monster_destroy MonsterDestroy函数会在有怪物被销毁时被调用,这里要注意,怪物死亡后并不会被立即销毁
  • on_switch_scenes SwitchScenes函数会在切换地图时被调用
  • on_imgui() imgui函数会在每次图形进行数据交换时被调用,请注意只有安装了LuaEngineUI的情况下才会被调用

跨脚本变量读取和保存

LuaEngine的不同脚本直接采用独立虚拟机的方式运行,代码环境相互隔离,如果需要在两个脚本之间传输数据,可以通过LuaEngine的变量缓存功能进行。

首先是存入变量的功能,存入变量的功能使用方法一致,不同的只有存入的变量类型

  • setGlobalVariable_int(string name, number value)
  • setGlobalVariable_float(string name, number value)
  • setGlobalVariable_string(string name, number value)

这里以存入整数的变量为例setGlobalVariable_int('varint', 1),这里的第一个参数为存入的变量名,第二个参数为变量值,同名的变量在重复存入时会被直接覆盖。要注意各各脚本之间的存入变量如果使用同一个变量名会相互覆盖,开发时建议加入一些独有的特征。

读取变量的功能与写入类似,只需要提供变量名即可,如果读取时变量并未被存入,那么将返回该类型的默认值(int和float是0,string是'')示例:loacl varint = GlobalVariable_int('varint')

  • GlobalVariable_int(string name)
  • GlobalVariable_float(string name)
  • GlobalVariable_string(string name)

最后是销毁变量的功能,使用此功能可以手动清理不再使用的缓存变量,回收内存,很少使用。

  • DestroyGlobalVariable(string name)

计时器

LuaEngine内置了一个计时器系统,该系统根据游戏内时间变动进行时间计算,该功能移植自LuaScript,系统较为陈旧但仍然很好用,如果有能力也可以使用Lua直接实现计时器功能,会更加自由。

  • AddChronoscope(float time, string name)
  • CheckChronoscope(string name)
  • CheckPresenceChronoscope(string name)
  • DelChronoscope(string name)

AddChronoscope可以添加一个新的计时器,AddChronoscope(1,'newChronoscope')第一个参数是计时器的结束时间,第二个参数是计时器名。

创建计时器后可以使用CheckChronoscope功能检查计时器是否到期,这里要注意的是,在使用CheckChronoscope检查计时器之前,即使计时器到期了也不会被消除,当CheckChronoscope检查计时器到期后会同时删除掉计时器,CheckChronoscope('newChronoscope')参数只有一个计时器名,未到期时返回false,到期后返回true。

CheckPresenceChronoscope功能可以检测计时器是否被创建,CheckPresenceChronoscope('newChronoscope')参数同样是计时器名,如果计时器存在则返回true,如果计时器不存在则返回false,注意计时器即使到期,只要未被删除就仍然存在。

DelChronoscope功能可以手动删除计时器DelChronoscope('newChronoscope')参数同样是计时器名。

按键检测

LuaEngine内置了一个按键检测系统,该系统同样是移植自LuaScript,在Engine引擎中对该功能进行了封装,此处仅作了解即可,通常使用引擎功能进行按键检测。

  • CheckKey(int vk)
  • CheckKeyIsPressed(int vk)
  • XCheckKey(int vk)
  • XCheckKeyIsPressed(int vk)

CheckKey是检测按键是否按下,使用了内置计时器进行了内置cd检查,并不好用,CheckKeyIsPressed是检测按键是否被按下,相比CheckKey更加灵敏,X开头的是Xbox按键的检测。按键检测的所有功能均返回布尔值,键盘传入的参数是Virtual-Key值,xbox参数请参考https://docs.alcedogroup.com/shu-ju-biao-1/xbox-shou-bing-an-jian-dui-ying-id-biao

消息系统

LuaEngine拥有两个消息发送渠道,可以向游戏内发送消息也可以向前置的命令窗口发送消息,其中Console_Info功能在Engine引擎中封装给了print函数,并加入了对table结构的输出功能,建议使用print代替Console_Info使用,如果需要输出更纯粹或单纯为了性能考虑,仍可使用Console_Info功能。

  • Message(string msg)
  • Console_Info(string msg)
  • Console_Error(string msg)

Message功能可以向游戏内发送消息,该消息使用了游戏内置的消息队列,新发送的消息会排在队尾。Message('消息')该功能建议只发送少量信息,并且注意要手动换行,超过3行后内容将超出消息格。

Console_Info和Console_Error均可向前置的命令窗口发送不同等级的消息,注意默认安装的前置消息等级的设置不会显示Console_Info的信息。

内存操作

在上一篇教程中相信大家已经使用过内存操作的功能了,这个功能是LuaEngine的核心。

  • GetAddress(hex base, {hex offset, ...})
  • GetAddressData(hex addr,string type)
  • SetAddressData(hex addr,string type,value)

GetAddress功能可以获取一个地址的指针数据,第一个参数为基址,第二个参数为指针偏移。GetAddressData功能可以获取指定地址的数据,第一个参数为地址,第二个参数为数据类型。SetAddressData与GetAddressData类似,功能是写入内存数据,第三个参数为写入的数值。

内存操作的详细用法在上一篇教程中已经详细讲解过,通常参考ce的数据进行编写即可。

获取各种实体数据

LuaEngine内置了一些功能用于获取游戏中怪物、环境生物、投射物的实体数据。

  • GetAllMonster()
  • GetAllAnimals()
  • GetShlp()

怪物数据获取GetAllMonster功能可以获取当前所有怪物的列表,数据包含了怪物实体地址、怪物Id、怪物亚种Id,通常和Engine引擎一起使用,GetAllMonster功能的示例代码如下

local monsterList = GetAllMonster()

for monster, monsterData in pairs(monsterList) do

print(monster..' id:'..monsterData.Id..' subid:'..monsterData.SubId)

end

环境生物数据获取GetAllAnimals功能与怪物数据获取功能的用法完全一致此处不多赘述。

投射物(shlp)数据获取代码GetShlp功能与怪物数据获取代码功能类似,返回数据只包含地址和Id

投射物(shlp)生成

投射物生成功能比较复杂,并不建议新手使用,后续教程会单独讲解该功能,此处仅作基础说明

  • CreateProjectiles(int id, float stratX, float startY, float startZ, float endX, float endY, float endZ, hex entity, hex shlplist)

投射物生成功能CreateProjectiles的参数依次是

  1. 投射物id
  2. 投射物起始坐标X
  3. 投射物起始坐标Y
  4. 投射物起始坐标Z
  5. 投射物结束坐标X
  6. 投射物结束坐标Y
  7. 投射物结束坐标Z
  8. 投射物来源
  9. 投射物列表地址

下面是两个关于玩家的投射物列表地址

玩家投射物

GetAddress(0x145073ED0,{ 0x50, 0x76B0, 0x1D90 })

玩家手弩投射物

GetAddress(0x145073ED0,{ 0x50, 0x56E8})

相机操作

相机操作功能可以控制视角相机的坐标,要注意这里修改坐标为相机绑定的坐标,而非相机实体本身的坐标,修改坐标后视角将随着坐标变更而变更,但是并不会将目标周围的声音收录进来。

  • GetCameraData()
  • SetCameraData(bool lock, number x, number y, number z)

GetCameraData功能可以获取当前相机状态,返回相机坐标x,y,z和一个布尔值lock,当lock为true时相机将会移动到SetCameraData设置的坐标

SetCameraData功能可以设置当前相机的状态,lock可以设置是否接管相机坐标控制,后三个参数为设置的相机坐标。

动作和特效

LueEngine中内置了强制派生和强制动作的功能,可以强行执行派生和动作,动作帧速率控制功能可以控制动作帧执行速率,还有一个特效生成功能可以添加简单的特效。

  • RunFsmAction(number type, number id)
  • RunLmtAction(number id)

这两个函数分别是强制派生fsm和强制执行东西lmt的功能,fsm的由一组type和id组成的,动作lmt则只有id即可,后面的教程中会详细讲解这两个函数的用法和对应id的找法。

  • AddFrameSpeed(hex addr, float speed)
  • GetAddFrameSpeed(hex addr)

AddFrameSpeed可以为指定的实体追加动作帧的速率,速率可以是负数,第一个参数是实体的地址,第二个参数是追加的速率值。GetAddFrameSpeed可以查看对指定实体追加的速率值是多少。

  • AddEffect(number group, number record)

AddEffect功能可以为玩家添加特效,第一个参数是特效组id,第二个参数是特效组内的记录值。

更换装备

LuaEngine内置了对武器和装备实时更换的功能

  • ChangeWeapons(number type, number id, bool complete)
  • RefreshEquip()

其中ChangeWeapons的功能可以立即切换玩家的武器,第一个参数是武器类别,第二个参数是武器id,第三个参数是完全更换武器,这里要注意第三个参数虽然是布尔值,但是不论值是什么,都会完全更换武器,如果只需要部分更换则不需要添加第三个参数,通常来说非完全更换武器已经足够使用。

RefreshEquip功能则是刷新装备数据,此功能会将内存中缓存的装备数据临时刷新到玩家实体上,此功能目前仍有不少问题,这里只给出该功能,不做详细教学。

其他功能

LuaEngine还内置了以下功能,由于并非常用功能,这里不做详细介绍。

  • Load_AudioFile(string name, string file)
  • Play_Audio(string name)
  • AudioList()
  • GameVersion()
  • GetHttpData(string url)
  • DownloadFile(string url, string file)
  • GetFileMD5(string file)
  • LinkWSServer(string ws)
  • SendWSMessage(string msg)
  • GetWSMessage()
  • GetWSLinkState()
  • Invulnerable()
  • GetHitCount()
  • ResetHitCount()
by Alcedo 更新于 2024-01-11
打赏后可直接下载附件 赠人玫瑰 手留余香
1个大佬推荐该主题
默认
最新
1