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 而不是附属于它的零件,有效获得相同的结果。
您还可以使用 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: 移动和定向整个链条以在 EndEffector 点上将轴(默认为前向轴)指向世界由 Target 指定的位置。