目標(biāo)
想要利用代碼實現(xiàn)滑動門自動開關(guān)閉合的效果郎哭。
基本思路
在場景中設(shè)置一個觸發(fā)器狂鞋,當(dāng)虛擬人物進(jìn)入觸發(fā)器時,使兩扇門分別向兩邊滑動,然后自動關(guān)閉哥捕。
具體實現(xiàn)
1. 搭建基本場景
簡單起見牧抽,在場景分別放置三個Part(見基本場景圖),最基本Block就可以遥赚,根據(jù)自己的需要把它們修改它們的大小扬舒、材質(zhì),改變可視化效果凫佛。我這里把它們的Transform屬性設(shè)置成下圖中的數(shù)值讲坎。
2. 設(shè)置觸發(fā)器的屬性
上圖中作為觸發(fā)器的物體需要設(shè)置一些屬性。
- 它不能與其他物體和虛擬人物產(chǎn)生碰撞愧薛,CanCollide屬性設(shè)置為false
- 上一點(diǎn)設(shè)置完成之后晨炕,它與地面也不碰撞了,會直接掉下去毫炉,所以記得把錨固Anchored設(shè)置成true
- 它并不是真實存在的物體瓮栗,所以透明度要設(shè)置為1,這里為了可視化方便瞄勾,稍微保留一些
- 給Trigger對象添加一個Script對象弓柱,準(zhǔn)備處理觸碰時的事件著恩。
3. 實現(xiàn)代碼流程
1)要使用Tween(漸變)來對實例的屬性進(jìn)行插,首先要獲取服務(wù),并保存為局部變量
2)獲取Trigger實例的引用复亏,它是代碼腳本的父節(jié)點(diǎn)
3)定義函數(shù)Touched事件的處理函數(shù)剖踊,并與Trigger的Touched事件進(jìn)行連接
4)我們的邏輯是虛擬人物進(jìn)入Trigger以后奖蔓,左右側(cè)的門分別向兩邊滑動一定的距離猩谊,這個功能要放在事件處理函數(shù)里面完成
5)使用tweenService:Create來創(chuàng)建一個Tween對象,第一個是目標(biāo)對象(本例中的門)糙麦;第二個是TweenInfo對象辛孵,其實就是一系列動畫風(fēng)格的參數(shù);第三個是要進(jìn)行 tween 操作的一個屬性字典及其目標(biāo)值赡磅。(詳細(xì)文檔參見https://developer.roblox.com/zh-cn/api-reference/function/TweenService/Create)
6)注意:TweenInfo中第五個參數(shù)Reverses 設(shè)置為true觉吭,Tween 達(dá)成目標(biāo)后會反向播放。這樣仆邓,就產(chǎn)生了循環(huán)播放的效果鲜滩。
7)注意:當(dāng)虛擬人物進(jìn)入Trigger時,人物的左腿节值、右腿徙硅、左腳、右腳等部位都會觸發(fā)Touched事件搞疗,為了避免函數(shù)多次重復(fù)調(diào)用嗓蘑,可以在事件處理函數(shù)中加入防抖動機(jī)制(https://developer.roblox.com/zh-cn/articles/Debounce)须肆,本例中使用了延遲1秒再調(diào)用函數(shù)的方法。
部分代碼如下:
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)