IKControl 實例使用逆向動力學(IK)生成程序動畫姿勢。它們可以讓你讓角色對環境有實際反應。
例如,你可以讓角色放置手在門把手上,並且角色會獨立於其位置進行。IK控件提供需要創建更少的動畫來為您的遊戲帶來更現實和精緻的感覺的優勢。
必須是 或 的子孫,並且設定了所有必要的屬性,否則沒有任何效果。必須的屬性是 Type , EndEffector , Target , ChainRoot .一旦設置好之後,IkControl會修改您指定的角色姿勢。下面的代碼示例展示了如何設置你的第一個 IKControl 並開始創建更真實的動畫為你的遊戲。
您可以使用 IKControls 來製作角色:
- 旋轉頭部和軀幹以查看世界上的一個特定點。
- 修改其腳位以回應動態地形。調整其腳和腿,將它們放置在岩石和坡度上的地形上。
- 拿著槍並將手放置在握把上,不需要為遊戲中的每一枝槍創建動畫。
- 瞄準世界上某個點,使槍的尖端準確地瞄準你想要射擊的東西。特別適用於第三人稱射手。
- 將手放在汽車的方向盤上,當它旋轉時跟隨它。
- 還有更多!
IKControl 將覆蓋 ChainRoot 和 EndEffector 之間所有零件的動畫。您可以使用 Enabled 啟用或禁用它,或使用 Weight 改變它對基礎動畫的影響程度。小心:如果你沒有正確設置你的 IKControls ,你可能會生成不好且不切實際的姿勢!
範例程式碼
This sample shows the basic setup for an IKControl that moves a character's left arm to reach for a point in the world.
local character = script.Parent.Character
local humanoid = character.Humanoid
local root = character.HumanoidRootPart
-- Create a new attachment to use as the IKControl.Target
local target = Instance.new("Attachment")
target.CFrame = CFrame.new(-1, 0, -1)
target.Parent = root
local ikControl = Instance.new("IKControl")
ikControl.Type = Enum.IKControlType.Position
ikControl.EndEffector = character.LeftHand
ikControl.ChainRoot = character.LeftUpperArm
ikControl.Target = target
ikControl.Parent = humanoid
概要
屬性
你有興趣移動角色的最後一部分。例如,上臂。必須是祖先的 EndEffector 並且在你的角色中是 BasePart 或 Bone 。
切換控制開啟和關閉。預設為真。
你有興趣移動到達 Target 的部分。例如,你角色的手。必須是 ChainRoot 的後裔,並且在您的角色中是 BasePart 或 Bone 。
額外的抵消在本地空間上應用於 EndEffector 以變更它移動的地點。
額外的抵消在 Target 上應用以變更 EndEffector 移動的地點。
一個可選的實例,決定鏈條彎折的方向。你可以使用它來指定肘或膝蓋彎折的方向。
指定控制的解決順序。高值具有更高優先級。
指定 EndEffector 到達 Target 所需的平均秒數。
EndEffector 達到或指向的對象。它可以是任何在世界上有位置的東西,例如 BasePart , Attachment , Bone 或 Motor6D 。
指定解決器如何滿足此控件。
指定 IK 控制目標的重量。應在 [0、1] 範圍內。
方法
屬性
ChainRoot
指定 ChainRoot 和 EndEffector ,您會指示 IKControl 允許在兩者之間移動和旋轉所有零件來移動 EndEffector 到 Target 。例如,如果您指定左手為 EndEffector 和左上臂為 ChainRoot,控制將移動 3 部分:左手、左下臂和左上臂。避免將 ChainRoot 設為角色的實際根,因為這會產生不切實際的結果。
EndEffector
The EndEffector 描述您想影響的角色鏈中最後一部分。例如,當您想將整個手臂移動到達一個點時,可能是手。它可以是在角色上的 BasePart ,有 Motor6D 作為其子, Motor6D 直接, Bone 或 Attachment 。選擇的 EndEffector 移動到 Target ,因此您可以使用 Attachments 來修改哪個點的 BasePart 應該到達 Target 。
EndEffectorOffset
結束效果器偏移是額外的 CFrame 在上面應用的 Target CFrame 產生最終 CFrame 用於放置 EndEffector 的 。預設情況下,它是身份 CFrame,因此如果你未設置它,它沒有效果,而 EndEffector 使用的是 Target 的直接使用,這在 CFrame 的本地空間中指定,這是在 EndEffector 中指定的。
或者,您可以使用附件,通過設置附件為 EndEffector 將其移動到 Target 而不是附帶的零件,有效獲得相同的結果。
您也可以使用 EndEffectorOffset 來修改哪個軸的 EndEffector 應指向 Target 時使用 LookAt 作為 Type 。
Offset
抵消是額外的 CFrame 在上面應用的 Target CFrame 產生最終 CFrame 用於放置 EndEffector 的 。它是默认身份,因此如果您未設置它,它就沒有效果,而 EndEffector 將直接使用 Target CFrame 。您可以將其動畫以創建程序動畫,例如在鍵盤上輸入文字。當 Target 和 EndEffector 不對齊且需要用額外的旋轉或翻譯來修正時,這很有用。
Pole
Pole 是可選的 Instance ,可以讓你控制你角色中的中間部件應該彎折的方式。它可以是任何在世界上有位置的東西,例如 BasePart , Attachment , Bone , Motor6D .默认值為 nil 。當您指定時,底層解決器會使零件向它彎折。當它是 nil 時,解決器會嘗試根據角色的肢體來適當彎曲肘和膝。當您選擇為 選擇 左手 或 右手 和 左上臂 或 右上臂 時,它將成為"手臂",當您選擇為 選擇 左腳 或 右腳 和 左上臂 或 右上臂 時,它將成為"腿"。在所有其他情況下,如果你沒有指定柱,繩索可能不會像你所期望的那樣彎折。
Priority
當多個控制在角色上啟用時,基礎系統解決它們的順序會影響最終生成的姿勢。通過變更此值,您指定控制滿足的訂單。高值具有更高的優先級,高優先級的控件稍後解決,因為它們的結果可能會覆蓋其他控件的前一個結果。如果你有多個 IK 控件在一個角色上,其中一個比另一個更重要,則指定更低的優先級。預設為 0,意味著所有控件的優先級都一樣。
SmoothTime
此值指定 EndEffector 到達 Target 所需的平均秒數。行為是一個嚴重阻尼的彈簧,其變化率與目標距離成正比,且在接近目標時沒有振動。較小的值創建更快的融合,較大的值創建更慢的融合。0 的值停用平滑。預設值為 0.05,提供非常輕微的平滑,使運動感覺真實。
Target
Target 代表世界上你希望你的 CFrame 達到的一個點 (EndEffector)。到達的準確行為可以通過 Type 屬性設置,額外的 Offset 可以應用在其上方以修改它。如果你設置了一個 Target ,將由物理或腳指令碼移動,在每個框架中,IKControl 將嘗試滿足它,自動更新到達的點。
通過變更 Type , 您可以改變控件的行為。這些是可用選項:
- 位置:將 EndEffector 位置調整到 Target 位置。
- 旋轉:將 EndEffector 旋轉調整為 Target 的旋轉。
- LookAt:移動並導向整個疊加以使軸(默認為前軸)在 點上的世界指定位置上。