目标
想要利用代码实现滑动门自动开关闭合的效果。
基本思路
在场景中设置一个触发器,当虚拟人物进入触发器时,使两扇门分别向两边滑动,然后自动关闭。
具体实现
1. 搭建基本场景
简单起见,在场景分别放置三个Part(见基本场景图),最基本Block就可以,根据自己的需要把它们修改它们的大小、材质,改变可视化效果。我这里把它们的Transform属性设置成下图中的数值。
2. 设置触发器的属性
上图中作为触发器的物体需要设置一些属性。
- 它不能与其他物体和虚拟人物产生碰撞,CanCollide属性设置为false
- 上一点设置完成之后,它与地面也不碰撞了,会直接掉下去,所以记得把锚固Anchored设置成true
- 它并不是真实存在的物体,所以透明度要设置为1,这里为了可视化方便,稍微保留一些
- 给Trigger对象添加一个Script对象,准备处理触碰时的事件。
3. 实现代码流程
1)要使用Tween(渐变)来对实例的属性进行插,首先要获取服务,并保存为局部变量
2)获取Trigger实例的引用,它是代码脚本的父节点
3)定义函数Touched事件的处理函数,并与Trigger的Touched事件进行连接
4)我们的逻辑是虚拟人物进入Trigger以后,左右侧的门分别向两边滑动一定的距离,这个功能要放在事件处理函数里面完成
5)使用tweenService:Create来创建一个Tween对象,第一个是目标对象(本例中的门);第二个是TweenInfo对象,其实就是一系列动画风格的参数;第三个是要进行 tween 操作的一个属性字典及其目标值。(详细文档参见https://developer.roblox.com/zh-cn/api-reference/function/TweenService/Create)
6)注意:TweenInfo中第五个参数Reverses 设置为true,Tween 达成目标后会反向播放。这样,就产生了循环播放的效果。
7)注意:当虚拟人物进入Trigger时,人物的左腿、右腿、左脚、右脚等部位都会触发Touched事件,为了避免函数多次重复调用,可以在事件处理函数中加入防抖动机制(https://developer.roblox.com/zh-cn/articles/Debounce),本例中使用了延迟1秒再调用函数的方法。
部分代码如下:
local tweenService = game:GetService("TweenService")
local part = script.Parent
local entered = false
local leftDoor = game.Workspace:FindFirstChild("LeftDoor")
local tweenLeftInfo = TweenInfo.new(1.5,
Enum.EasingStyle.Linear,
Enum.EasingDirection.Out,
0,
true,
0
)
local tweenLeft = tweenService:Create(leftDoor, tweenLeftInfo, {
Position = Vector3.new(0,4,-4)
})
local rightDoor = game.Workspace:FindFirstChild("RightDoor")
local tweenRightInfo = TweenInfo.new(1.5,
Enum.EasingStyle.Linear,
Enum.EasingDirection.Out,
0,
true,
0
)
local tweenRight = tweenService:Create(rightDoor, tweenRightInfo, {
Position = Vector3.new(0,4,4)
})
local function onPartTouched(otherPart)
if not entered then --防抖动
entered = true
print("entered!")
-- 门打开
tweenLeft:Play()
tweenRight:Play()
wait(1)
print(part.Name .. " has touched " .. otherPart.Name)
entered = false
end
end
part.Touched:Connect(onPartTouched)