自动跳台玩法
本节我们将编写一个简单的游戏作为示例。
游戏简介
玩家射出的箭命中障碍物后,会在箭的位置生成一朵云。玩家需要借助这些云到达下一个落脚点,直至抵达终点。
技术要点
- Lua 监听单位创建
- Lua 为单位添加触发器
- 蛋码调用 Lua
- Lua 创建和销毁物体
- Lua 进行简单的数学运算
注:本示例可在编辑器模板图中下载。
实现步骤
监听箭支生成
使用 LuaAPI.register_unit_creation_handler()
监听箭的生成:
lua
-- 优化:使用常量提高可读性和可维护性
local ARROW_PRESET_ID = 1404042
LuaAPI.register_unit_creation_handler(Enums.UnitType.OBSTACLE, ARROW_PRESET_ID, function(arrow)
-- 箭生成后的处理逻辑
end)
处理箭支碰撞
在箭上绑定碰撞回调:
lua
LuaAPI.unit_register_trigger_event(arrow, { EVENT.SPEC_OBSTACLE_CONTACT_BEGAN }, function()
-- 箭命中物体时的处理逻辑
end)
生成云朵
计算云朵位置并创建:
lua
-- 优化:使用局部变量提高性能
local Vector3 = math.Vector3
local Quaternion = math.Quaternion
local CLOUD_PRESET_ID = 100636
local CLOUD_OFFSET = Vector3(2.5, 2.5, 2.5)
local function create_cloud(arrow)
local position = arrow.get_position() - arrow.get_orientation():apply(Vector3(0.0, 1.0, 0.0)) * CLOUD_OFFSET
local orientation = Quaternion(0.0, 0.0, 0.0)
local scale = Vector3(1.0, 1.0, 1.0)
return GameAPI.create_obstacle(CLOUD_PRESET_ID, position, orientation, scale, nil)
end
-- 优化:使用局部表提高性能
local created_clouds = {}
-- 主逻辑
LuaAPI.register_unit_creation_handler(Enums.UnitType.OBSTACLE, ARROW_PRESET_ID, function(arrow)
LuaAPI.unit_register_trigger_event(arrow, { EVENT.SPEC_OBSTACLE_CONTACT_BEGAN }, function()
table.insert(created_clouds, create_cloud(arrow))
end)
end)
处理玩家重生
lua
-- 优化:使用局部变量提高性能
local resurrect_count = 0
---@export
---@desc 通过蛋码调用Lua,实现重生后逻辑
---@param save_clouds boolean
---@return integer
function on_resurrection(save_clouds)
print("Resurrect with clouds: " .. tostring(save_clouds))
if not save_clouds then
for _, v in ipairs(created_clouds) do
GameAPI.destroy_unit(v)
end
created_clouds = {}
end
resurrect_count = resurrect_count + 1
return resurrect_count
end
完整代码
lua
-- 常量定义
local ARROW_PRESET_ID = 1404042
local CLOUD_PRESET_ID = 100636
local CLOUD_OFFSET = math.Vector3(2.5, 2.5, 2.5)
-- 局部变量
local Vector3 = math.Vector3
local Quaternion = math.Quaternion
local created_clouds = {}
local resurrect_count = 0
-- 创建云朵函数
local function create_cloud(arrow)
local position = arrow.get_position() - arrow.get_orientation():apply(Vector3(0.0, 1.0, 0.0)) * CLOUD_OFFSET
local orientation = Quaternion(0.0, 0.0, 0.0)
local scale = Vector3(1.0, 1.0, 1.0)
return GameAPI.create_obstacle(CLOUD_PRESET_ID, position, orientation, scale, nil)
end
-- 监听箭的创建和碰撞
LuaAPI.register_unit_creation_handler(Enums.UnitType.OBSTACLE, ARROW_PRESET_ID, function(arrow)
LuaAPI.unit_register_trigger_event(arrow, { EVENT.SPEC_OBSTACLE_CONTACT_BEGAN }, function()
table.insert(created_clouds, create_cloud(arrow))
end)
end)
local resurrect_count = 0
-- 重生处理函数
---@export
---@desc 当重生时调用Lua
---@param save_clouds boolean
---@return integer
function on_resurrection(save_clouds)
print("Resurrect with clouds: " .. tostring(save_clouds))
if not save_clouds then
for _, v in ipairs(created_clouds) do
GameAPI.destroy_unit(v)
end
created_clouds = {}
end
resurrect_count = resurrect_count + 1
return resurrect_count
end
蛋码集成
在全局触发器界面添加重生事件,并在对应动作中添加飘字提示,参数选择表达式 on_resurrection
:
运行游戏,故意失误跳下悬崖,重生时可以看到重生次数: