门
如何创建一个简单且自动的门,以便在角色进入时打开。
最终结果
代码片段
Server/Index.lua
-- 让我们生成一个 SM_Plane 作为门,以及一个空(SM_None)静态网格体作为铰链。
-- 由于 SM_Plane 的轴心位于网格中心,我们需要一个铰链使其正常旋转。
-- 如果你的门网格体轴心已经位于正确的铰链位置,则不需要此操作。
-- 生成铰链(我们将其旋转 90º 使其立起)
local door = StaticMesh(Vector(0, 0, 100), Rotator(0, 0, 90), "nanos-world::SM_None")
-- 生成门的网格体,缩放至门的大小形状,并将其附加到铰链上
local door_mesh = StaticMesh(Vector(), Rotator(), "nanos-world::SM_Plane")
door_mesh:SetScale(Vector(1, 2, 1))
-- 附加到相对位置为 50 单位处的铰链上(以对齐到铰链位置)
door_mesh:AttachTo(door)
door_mesh:SetRelativeLocation(Vector(50, 0, 0))
-- 在门中心生成我们的触发器
local trigger = Trigger(Vector(0, 0, 100), Rotator(), 150)
-- 统计触发器内有多少个角色,以便在所有人离开后门才会关闭
local characters_inside = 0
-- 当角色进入时注册触发器
trigger:Subscribe("BeginOverlap", function(trigger, actor)
-- IsA 也匹配继承自角色的类
if (not actor:IsA(Character)) then return end
characters_inside = characters_inside + 1
-- 在角色上播放开门动画
actor:PlayAnimation("nanos-world::AM_Mannequin_DoorOpen_01", AnimationSlotType.UpperBody)
-- 平滑地将门旋转 -90º
door:RotateTo(Rotator(0, -90, 90), 1)
end)
-- 当角色离开时注册触发器
trigger:Subscribe("EndOverlap", function(trigger, actor)
if (not actor:IsA(Character)) then return end
characters_inside = math.max(characters_inside - 1, 0)
-- 一旦内部没有人,平滑地将门旋转回原始位置
if (characters_inside == 0) then
door:RotateTo(Rotator(0, 0, 90), 1)
end
end)