移動物體是指在3D空間中沿著一個或多個軸移動的物體。利用Roblox模擬引擎的內建能力,您可以使物體進行運動,並與它們的環境進行互動,模擬現實世界中玩家熟悉的直觀物理行為,如重力、空氣動力學和摩擦。
使用 Moving Objects .rbxl 文件作為參考,本教程解釋了物理力量如何影響Studio中的線性運動,並展示了多種技術,教您如何在經歷中將物體從A點移動到B點,並包括不同的運動行為的指導,包括:
- 使用 LinearVelocity 移動約束以恆定的線性速度移動整個組件。
- 使用 PrismaticConstraint 將組件限制在單一軸上,並以相對於3D空間中某一點的恆定線性速度移動。
- 使用 ApplyImpulse 方法以初始的力量脈衝移動組件,使其隨著時間的推移緩慢減速。
線性運動和物理力量
Roblox Studio 是一個實時模擬現實世界物理行為的引擎,因此,為了預測物體在經歷中如何進行線性運動,了解物體在現實生活中是如何進行線性運動的非常重要。
線性運動是指沿著某一軸的運動。例如,當一塊塊體具有線性運動時,它沿著一定的軸移動。

線性運動無法存在,除非有外部的物理力量在推動或拉動物體移動。根據牛頓的 第一運動定律,靜止的物體會保持靜止,移動的物體將保持以恆定的速度運動,除非受到外部力量的作用。例如,一塊靜止的方塊會保持靜止,除非風等物理力量將其推動。
力量是物理推或拉的方向和大小的量度,導致物體沿著一個軸改變其線性速度。速度的變化被稱為 加速度。這一概念對於在Studio中使物體運動尤其重要;您對物體施加的力量越大,物體的加速度越快。
這是因為力量需要超過任何反向的物理力量,如重力或摩擦的推力。例如,如果您將該方塊放在一個金屬板上,風的物理力量需要克服金屬板的摩擦力,才能持續加速該方塊。如果風的力量不比金屬板的摩擦大很多,該方塊仍會加速,只是速度比之前的例子慢一些。

線性速度是物體移動的量度,或物體每單位時間在某一軸上改變位置的快慢。Studio根據物體每秒移動多少個studs來測量線性速度。Studs是Roblox測量長度的主要物理單位,每個stud的長度約為28厘米。

理解線性速度對於在您的經歷中設計遊戲玩法非常重要,因為它有助於您確定為了達到特定的速度,您需要施加多少力量來使移動物體運行。例如,當您想要將物體推向上方時,考慮您必須如何調整力量以克服環境中的重力,這樣物體才能準確地運動。
以下各節將深入探討這些概念,幫助您學習如何以恆定或初始線性速度運動物體,並施加克服環境中任何反向物理力量所需的力量。當您使用即將介紹的技術回顧這些物理概念時,您將能更準確地預測如何調整屬性值,以在Studio中達到理想的線性運動行為。
維持恆定的線性速度
為了讓物體達到並維持恆定的線性速度,它需要一種力量來克服任何減速物體線性速度的反向物理力量,或使物體保持靜止。例如,如果您希望一個物體在Studio中的線性速度為 [0, 12, 0],您需要足夠的力量來讓該物體沿著Y軸以每秒12個stud的速度達到並保持。
所需的力量量不僅依賴於環境中存在的反向物理力量,如重力和摩擦,還取決於物體本身。例如,如果您有兩個形狀相同且沿著相同軸移動的物體,則質量較大的物體需要更多的力量才能實現相同的線性加速度。
以下小節使用不同形狀和大小的組件,教您如何以恆定的線性速度運動整個物體或僅運動物體的一部分。當您實驗不同的屬性值時,您將學會如何估算在您自己的經歷中組件所需的最大力量。
使用 LinearVelocity 約束
LinearVelocity 物件是一種 移動約束,會對整個組件施加力量以維持恆定的線性速度。通過在運動過程中不鎖定組件的位置,該組件可以自由旋轉,當其與其他物體在3D空間中碰撞時,這種類型的運動會導致令人驚訝的遊戲情境,這對玩家來說更難以預測。
要開始移動該組件,LinearVelocity 約束需要知道:
- 施加力量的點及其正負方向。
- 您希望組件每秒移動的stud數量。
- 引擎可以施加的最大力量,以便組件達到恆定線性速度。
為了演示這一過程,您將配置一個睡蓮,並添加一個參考的 LinearVelocity 約束,以使該睡蓮沿著世界的負X軸以恆定線性速度每秒移動 15 個stud。

添加附件
您可以通過在組件中添加 Attachment 物件來指定施加力量的點,然後在3D空間中配置該附件的位置。樣本 Moving Objects 經歷的中間將附件放置在睡蓮的中心,以便約束可以從該附件沿著特定的軸移動網格。
附件則提供視覺輔助,以幫助您可視化其運動軸。黃色箭頭標示附件的主要軸,橙色箭頭標示附件的次要軸。雖然在此技術的步驟中,這兩個運動軸並不影響睡蓮的運動,但不妨了解這些視覺輔助,以便未來參考,因為它們可以幫助您確定不同類型約束的理想行為,例如下一技術中的 PrismaticConstraint 。

要添加附件:
在 Explorer 窗口中,展開 LinearVelocityExample 目錄,然後展開其子 LilyPad_DIY 模型。
在 Pad 網格中插入一個附件。
- 將鼠標懸停在該網格上並單擊 ⊕ 按鈕。會顯示上下文菜單。
- 從菜單中插入一個 Attachment。該附件顯示在部件的中心。
- 將附件重命名為 MoveAttachment。
配置約束
現在,您的網格已經有固定點來移動睡蓮,您可以配置 LinearVelocity 約束的屬性,以指定恆定線性速度的方向和大小,您希望網格每秒移動的stud數量,以及引擎可以施加的力量,以便網格達到恆定線性速度。
樣本 Moving Objects 經歷對睡蓮施加最多 5000 Rowton 的恆定力量,使其沿著世界的負X軸以恆定的線性速度每秒移動15個stud。Rowtons是Roblox用來測量力量的主要單位。要查找Roblox物理單位及其如何轉換為公制單位,請參見 Roblox Units。
要配置 LinearVelocity 約束:
(可選) 在3D空間中使約束可見,以便您可以引用其線性方向。
- 在工具欄的 Model 標籤中,然後查找 Constraints 區域。
- 如果尚未啟用,則單擊 Constraint Details 以顯示約束視覺輔助。
在 Pad 網格中插入一個 LinearVelocity 約束。
- 在 Explorer 窗口中,將鼠標懸停在該網格上,然後單擊 ⊕ 圖標。會顯示上下文菜單。
- 從上下文菜單中插入 LinearVelocity。
將網格的附件指派給新的約束。
- 在 Explorer 窗口中,選擇該約束。
- 在 Properties 窗口中,
- 將 Attachment0 設置為 MoveAttachment。
- 将 MaxForce 設置為 5000 以施加最多5000 Rowton的恆定力量,以達到目標線性速度。
- 將 RelativeTo 設置為 World 以讓睡蓮相對於世界的位置和方向進行移動。
- 將 VelocityConstraint 設置為 Line 以使力量沿著從附件延伸的直線進行約束。
- 將 LineDirection 設置為 -1, 0, 0 以使睡蓮沿著世界的負X軸移動。請注意,如果您將此屬性設置為 1, 0, 0,則睡蓮將沿著世界的正X軸移動。
- 將 LineVelocity 設置為 15 以使睡蓮每秒移動15個stud。
驗證您設置的力量使網格沿著世界的負X軸以每秒15個stud的速度移動。
- 在工具欄中,導航到 Test 標籤。
- 從遊戲測試模式中選擇 Run。Studio在當前相機位置模擬該經歷,而不包含您的角色在3D空間中。
使用 PrismaticConstraint 約束
PrismaticConstraint 物件是一種 機械約束,在兩個附件之間創建剛性關節,允許它們的父組件沿著一個軸 相對於彼此 移動。通過將兩個組件的位置鎖定在單一軸上,每個組件只能在一起以相同方向旋轉時進行旋轉。
這種類型的運動導致穩定的遊戲情境,讓玩家更容易預測。例如,樣本 Moving Objects 經歷利用 PrismaticConstraint 物件移動原木平台,玩家可以小心地穿越一條巨大的河流。
當您將 PrismaticConstraint.ActuatorType 設置為 Motor 時,此約束將對兩個附件施加力量,目標是讓附件達到並維持恆定的線性速度。如果您將一個附件的父組件錨定,那麼該力量會繼續以恆定的線性速度移動未錨定的組件,而錨定的組件則保持靜止。
要開始移動組件,PrismaticConstraint 約束需要知道:
- 施加力量的點及其正負方向。
- 您希望附件每秒移動的stud數量。
- 引擎可以施加的最大力量,以便附件及其父組件達到恆定的線性速度。
為了演示這一過程,您將配置一個原木組件,該組件包含兩個擁有子附件的物體,PrismaticConstraint 參考這些附件,以使原木以恆定的線性速度每秒移動 40 個stud,沿著世界的負X軸。

配置附件
您可以通過在組件中添加兩個Attachment 物件來指定在組件內移動特定物體的方向,然後在3D空間中配置它們的對齊和方向。樣本 Moving Objects 經歷將兩個附件沿著世界的X軸對齊,靠近未錨定的原木與錨定的部分重疊的位置,並使每個附件的主要軸朝向世界的負X軸。
當您在下一部分配置您的 PrismaticConstraint 約束時,它將相對於錨定部分移動原木。換句話說,原木將遠離被錨定在3D空間中,無法移動的靜止部分。
要配置prismatic約束的附件:
在 Explorer 窗口中,展開 PrismaticConstraintExample 目錄,然後展開其子 Log_DIY 模型。
在 Log 網格中插入附件。
- 將鼠標懸停在該網格上並單擊 ⊕ 按鈕。會顯示上下文菜單。
- 從菜單中插入一個 Attachment。該附件顯示在部件的中心。
- 將附件重命名為 LogAttachment。
使用相同的過程,在 Anchor 部件中插入附件,然後將該附件重命名為 AnchorAttachment。
使用 View Selector 工具作為世界坐標的參考,旋轉 LogAttachment 和 AnchorAttachment,直到每個附件的主要軸面朝世界的負X軸。
重新定位 AnchorAttachment,使兩個附件沿世界的X軸對齊。
配置約束
現在您的附件已經在同一軸上對齊並面向您希望原木移動的方向,您可以配置 PrismaticConstraint 約束的屬性,以指定要施加的目標恆定線性速度的正負方向,每秒希望附件移動的stud數量,以及引擎對原木施加的最大力量以實現恆定的線性速度。
雖然您可以為自己的用例選擇不同的值,但樣本 Moving Objects 經歷對附件施加最多 50000 Rowton 的恆定力量,使其沿著世界的負X軸以恆定的線性速度每秒移動 40 radians。然而,由於錨固附件位於一個錨固的物體中,只有原木的附件可以移動。
要配置prismatic約束:
在 Log 網格中插入一個 PrismaticConstraint 物件。
- 在 Explorer 窗口中,將鼠標懸停在該網格上,然後單擊 ⊕ 圖標。顯示上下文菜單。
- 從上下文菜單中插入一個 PrismaticConstraint。
將原木的附件分配給新的約束,以便原木可以 相對於 錨定的塊部件移動。
- 在 Explorer 窗口中,選擇約束。
- 在 Properties 窗口中,
- 將 Attachment0 設置為 AnchorAttachment。
- 將 Attachment1 設置為 LogAttachment。該約束在視口中顯示。
在 Explorer 窗口中選擇該約束,然後在屬性窗口中,
- 將 ActuatorType 設置為 Motor。將顯示新屬性字段。
- 將 MotorMaxForce 設置為 50000,以施加最多50000 Rowtons的恆定力量以達到目標線性速度。
- 將 Velocity 設置為 40 以使原木每秒移動40個stud。
驗證您設置的力量使原木沿著世界的負X軸以每秒40個stud的速度移動。
- 在工具欄中,導航到 Test 標籤。
- 從遊戲測試模式中選擇 Run。Studio在當前相機位置模擬該經歷,而不包含您的角色在3D空間中。
施加初始線性力量
改變物體線性速度的另一種方法是施加一個力量脈衝。經過力量脈衝後,物體要麼因為存在摩擦等反向力量而減速到靜止,要麼在沒有任何反向力量的情況下保持恆定的線性速度。
此技術在顯著的遊戲事件後移動物體是非常有用的,例如爆炸或沖擊性碰撞,因為它向玩家提供了瞬時反饋。為了演示,以下子節教您如何在玩家與跳躍墊碰撞時,將其角色向上發射到空中,並使用初始脈衝,您可以根據自己的遊戲需求調整新值。
使用 ApplyImpulse
ApplyImpulse 方法在整個組件上施加力量,以獲得初始線性速度,然後在存在相反力量時減速停止。要開始移動組件,該方法需要知道:
- 要移動的組件。
- 用於施加力量以達到初始線性速度的軸。
- 每個軸要施加的力量量。
您可以在腳本中定義所有這些值。例如,樣本腳本將要移動的組件定義為玩家角色的 Humanoid 物件,然後施加2500 Rowton秒的力量脈衝,以沿著世界的正Y軸向上發射玩家。請注意,玩家角色的質量不同,因此您可能需要增加和調整此力量,以便在不將質量較小的角色發射得過高的情況下發射每個玩家。
要使用 ApplyImpulse 移動組件:
在 Explorer 窗口中,展開 ApplyImpulseExample 目錄,然後展開其子 JumpPad_DIY 模型。
在 JumpPad 部件中插入腳本。
- 將鼠標懸停在該物件上,然後單擊 ⊕ 按鈕。會顯示上下文菜單。
- 從菜單中插入一個 Script。該附件顯示在部件的中心。
- 將腳本重命名為 JumpScript。
用以下代碼替換默認代碼:
local volume = script.Parentlocal function onTouched(other)local impulse = Vector3.new(0, 2500, 0)local character = other.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and other.Name == "LeftFoot" thenother:ApplyImpulse(impulse)endendvolume.Touched:Connect(onTouched)