IKControl

显示已弃用

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

IKControl 实例使用逆向动力学(IK)生成程序动画姿势。它们允许你让角色对环境实现真实反应。

例如,你可以让角色准确地把手放在门把手上,角色将独立于其位置进行。IK控件提供了需要为您的游戏创建更少动画的优势,同时给您的体验带来更现实和精致的感觉。

必须是 或 的子女,并且设置了所有必需的属性,否则没有任何效果。需要的属性是 Type , EndEffector , Target , ChainRoot .一旦这些设置被设置,IkControl 就会根据您指定的角色姿势修改您的角色姿势。以下代码示例显示了如何设置你的第一个 IKControl 并开始创建更真实的动画为你的游戏。

您可以使用 IKControls 来制作一个角色:

  • 旋转头部和躯干以查看世界上的一个特定点。
  • 修改其脚位置,以回应动态地形。调整其腿和脚,将它们放置在岩石和坡道上的地形上。
  • 拿着枪,并将手放在握把上,不需要为游戏中的每一枪创建动画。
  • 瞄准世界上的一个点,使枪的射击精准地指向你想要射击的东西。尤其适用于第三人称射击游戏。
  • 将手放在汽车的方向盘上,当它旋转时跟随它。
  • 还有更多!

IKControl 将覆盖 ChainRootEndEffector 之间所有部件的动画。您可以使用 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.

IKControl setup

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

概要

属性

属性

ChainRoot

读取并联

通过指定一个 ChainRoot 和一个 EndEffector , 您告诉 IKControl 允许在两者之间移动和旋转所有零件来移动 EndEffectorTarget 。例如,如果你将左手指定为 EndEffector 和左上臂指定为 ChainRoot,控制将移动 3 部分:左手、左下臂和左上臂。避免将 ChainRoot 设置为角色的实际根,因为这会产生不现实的结果。

Enabled

读取并联

此属性可让您切换 IK 控件的开启和关闭。默认启用。当 Enabled 为 false 时,IK 控件关闭且不被底层解决器解决

EndEffector

读取并联

The EndEffector 描述了你想影响的角色链中最后一部分。例如,当你想将整个手臂移动到达某个点时,可能就是手。它可以是一个字符上的 BasePart ,其中有一个 Motor6D 作为其子,一个 Motor6D 直接,一个 Bone 或一个 Attachment 。选定的 EndEffector 转到 Target ,因此您可以使用 Attachments 来修改哪个点的 BasePart 应到达 Target

EndEffectorOffset

读取并联

终效果偏移是在最上面应用额外的 CFrameTarget CFrame 产生最终 CFrame 用于放置 EndEffector 的 。默认情况下,它是身份 CFrame,因此如果未设置,它没有影响,而 使用的是 的直接使用,这在本地空间的 中被指定。

或者,您可以使用附件,通过将附件设置为 EndEffector 将其移至 Target 而不是附属于它的零件,有效获得相同的结果。

您还可以使用 EndEffectorOffset 来修改哪个轴的 EndEffector 应指向 Target 当使用 LookAt 作为 Type 时。

Offset

读取并联

抵消是额外的 CFrame 在顶部应用于 TargetCFrame 产生最终 CFrame 用于放置 EndEffector 的 。它是默认身份,如果您未设置它,它没有效果,而 EndEffector 将直接使用 Target CFrame 。您可以将其动画以创建程序动画,例如在键盘上输入。当 TargetEndEffector 不匹配时,有用的是需要通过额外的旋转或翻译来修正它们。

读取并联

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 , 您可以改变控件的行为。这些是可用选项:

Weight

读取并联

您可以使用此属性来控制特定控件对角色姿势的影响程度。值应在 [0, 1] 范围内。0 表示没有效果,1 表示 IK 控制的全效果。超出该范围的值被切割。平滑地变化此值可让您融入或退出特定控件以避免碰撞运动。默认值为 1。

重量决定了末端效应器和 IK 目标之间的插值因子。将重量设置为 0 不会禁用 IK 控制,因为其他因素,包括平滑时间平滑因子和杆,仍然可以改变姿势。要真正禁用 IK 控制,将 Enabled 属性设置为 false。

方法

GetChainCount


返回

GetChainLength


返回

GetNodeLocalCFrame

参数

index: number
默认值:""

返回

GetNodeWorldCFrame

参数

index: number
默认值:""

返回

GetRawFinalTarget


返回

GetSmoothedFinalTarget


返回

活动