Roblox罗布乐思课堂小抄系列:使用TweenService做滑动门

目标

想要利用代码实现滑动门自动开关闭合的效果。

基本思路

在场景中设置一个触发器,当虚拟人物进入触发器时,使两扇门分别向两边滑动,然后自动关闭。

具体实现

1. 搭建基本场景

简单起见,在场景分别放置三个Part(见基本场景图),最基本Block就可以,根据自己的需要把它们修改它们的大小、材质,改变可视化效果。我这里把它们的Transform属性设置成下图中的数值。

基本场景.jpg

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)

通向元宇宙的大门打开了!

SlidingDoor.gif

你可能感兴趣的:(Roblox罗布乐思课堂小抄系列:使用TweenService做滑动门)