LuaEngine的UI组件可以提供在游戏内实时显示数据的功能,LuaEngineUI集成了ImgUI功能,你可以根据https://github.com/MSeys/sol2_ImGui_Bindings中绑定的ImgUI方法自行绘制数据显示窗口,在mod开发过程中十分便利。
这里要注意,LuaEngine在1.1.5版本开始将ImgUI功能从本体中剥离出来,只安装LuaEngine是无法使用ImgUI功能的,需要额外安装LuaEngineUI模块,同时去除了DX11的支持,如需使用ImgUI功能需确保在DX12模式下运行游戏。
还记得我们在第二篇教程教大家写的传送脚本吗,我们以这个脚本为例,教大家使用UI功能,我们本篇教程的目标是在游戏中实时显示我们记录的坐标点,并且添加一个删除坐标和立即传送的按钮。
从我们之前写的脚本可以看出,传送的关键在于我们之前记录的坐标点,接下来我们使用UI功能绘制一个窗口,在窗口中写上这三个坐标点,这样我们第一步实时显示记录的坐标功能就实现了。
要想在游戏在绘制窗口,第一步是创建一个LuaEngine内置调用的函数on_imgui,然后我们根据ImgUI绑定文档中可以查到,创建窗口的方法是ImGui.Begin和ImGui.End,接下来我们将代码写入脚本中,重载在游戏里看看效果。
这里可以看到,游戏中出现了一个小小的窗口(什么,你的窗口特别小,就一个小方框?有没有可能你能把它拉大),接下来我们要显示的内容就会画在这个窗口当中。
我们从绑定的方法中可以查到,ImGui.Text可以在窗口中显示文字,ImGui.InputFloat3可以在窗口中显示一组三个float类型的数据,这两种都可以满足我们的要求,接下来我们来写出显示坐标的代码
这里我使用了两种方法分别写出了显示坐标的代码,可以看到两种方法都可以实现我们的需求,在使用InputFloat3是,我们额外限定了显示小数点后5位数和只读的属性。
接下来我们添加两个按钮,根据绑定文档可知ImGui.Button为按钮功能,我们的两个按钮分别用于清除坐标和立即瞬移,代码和之前使用快捷键的一样。接下来我们reload以下代码,看看效果。
这里我们只保留了InputFloat3的显示方法,实际使用时你可以根据自己的需求选择。可以看到两个按钮已经显示在窗口中了,点击试试,功能正常。
这里我们注意看下代码,在on_imgui的第一行我们加入了local Data_Player = engine.Player:new(),还记得这是干嘛用的吗,没错这是用来实例化玩家数据的代码,我们在on_imgui中调用玩家数据仍然需要再次实例化,如果没有这行代码,我们是访问不到玩家数据的。
到此本篇教程就基本结束了,ImgUI的功能非常多且十分灵活,想要活用ImgUI的话建议去专门学习一下ImgUI的使用方法,这里演示的功能作为辅助开发脚本已经足够使用。
由于lua没有二进制操作的功能,无法进行移位计算,这里给出一个代码用来辅助标记的移位计算,你可以使用bitmod(ImGuiWindowFlags.NoBackground, ImGuiWindowFlags.NoTitleBar)来合并两个标记的值。
function bitmod(numberA, numberB)
local byteA = byte2bin(numberA)
local byteB = byte2bin(numberB)
for k, v in ipairs(byteA) do
if byteA[k] == 0 and byteA[k] ~= byteB[k] then
byteA[k] = 1
end
end
return tonumber(table.concat(byteA), 2)
end
function byte2bin(n)
local t = {}
for i=7,0,-1 do
t[#t+1] = math.floor(n / 2^i)
n = n % 2^i
end
return t
end