KeyframeSequence

显示已弃用

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

该对象存储所有的 Keyframes 对于动画,决定动画是否循环,并决定其对其他动画的优先级。

什么是关键帧顺序?

Roblox 构建在动画播放中使用的动画数据,由键帧序列中的 Animation.AnimationId 属性引用。每个动画都内部指向键框顺序或曲线动画。虽然通常由 Roblox 动画编辑器创建,但键帧顺序也可以由其他插件或甚至手动创建。一旦上传到 Roblox,Roblox 将为 属性分配一个内容 ID,用于引用上传的 KeyframeSequence。

请注意,在大多数情况下,您不需要操作关键帧序列,因为动画编辑器覆盖了大部分动画功能。然而,在某些情况下,您可能希望从 Script 或构建自己的插件生成动画。但是,只有 Roblox Studio 可以使用在这样的方式创建的关键帧序列。如果您想使用此类关键帧序列,您需要将其上传到 Roblox 如下所述。

关键帧顺序属性

KeyframeSequence.PriorityKeyframeSequence.Loop 保存序列的优先级和循环动画设置。请注意,AnimationTrack 属性最终可以在播放时覆盖这些属性。

在序列中最后的 Keyframe ,意味着具有最高 Keyframe 属性的 Keyframe.Time 决定了动画的长度。

关键帧顺序结构

关键帧序列作为一个容器,可以容纳 Keyframes .关键帧代表在动画中“关键”框架,在播放期间进行间歇处理。

关键帧包含 Poses .Poses ,特定于每个BasePart 被动画,包含应用于CFrame 连接两部分的Motor6D 。姿势与 BasePart 匹配他们通过名称对应的数据,并将其数据应用到与此相同名称的部分 Motor6D 上,该部分被识别为 Motor6D.P1 。因此,动画需要不同的部件名称才能正确播放。

姿势遵循基于共同层次的结构。每个Pose的父对应于它附属的部分的Pose。在实践中,这意味着位置分支从根部分离。请参阅下面的视觉示例。

制作动画时使用关键帧序列

您必须先将关键帧序列上传到 Roblox,才能在体验中播放。在工作室中,右击键框顺序并单击“保存到 Roblox”。或者,你可以使用 Plugin:SaveSelectedToRoblox() 函数。任何方法都会带起动画上传窗口,允许您将键帧顺序上传为动画。

在某些情况下,您可能想在上传到 Roblox 网站之前预览动画。您可以使用 KeyframeSequenceProvider:RegisterKeyframeSequence() 生成临时 id。这将生成一个可用于本地化动画测试的哈希 ID。

获取关键帧序列

在某些情况下,您可能希望下载与已上传的动画相对应的关键帧序列。您可以使用 AnimationClipProvider:GetAnimationClipAsync() 下载动画。

代码示例

This sample contains a simple function that will get the length of a KeyframeSequence by finding the Keyframe with the highest Keyframe.Time value.

Get KeyframeSequence Length

local function getSequenceLength(keyframeSequence)
local length = 0
for _, keyframe in pairs(keyframeSequence:GetKeyframes()) do
if keyframe.Time > length then
length = keyframe.Time
end
end
return length
end
local keyframeSequence = Instance.new("KeyframeSequence")
getSequenceLength(keyframeSequence)

This code sample contains a simple function to generate an Animation with a generated hash ID to preview a KeyframeSequence locally.

Create temporary animation

local KeyframeSequenceProvider = game:GetService("KeyframeSequenceProvider")
local function createPreviewAnimation(keyframeSequence)
local hashId = KeyframeSequenceProvider:RegisterKeyframeSequence(keyframeSequence)
local Animation = Instance.new("Animation")
Animation.AnimationId = hashId
return Animation
end
local keyframeSequence = Instance.new("KeyframeSequence")
local animation = createPreviewAnimation(keyframeSequence)
print(animation)

This sample demonstrates how a basic KeyframeSequence can be created.

KeyframeSequence Instantiation

-- create the keyframesequence
local keyframeSequence = Instance.new("KeyframeSequence")
keyframeSequence.Loop = false
keyframeSequence.Priority = Enum.AnimationPriority.Action
-- create a keyframe
local keyframe = Instance.new("Keyframe")
keyframe.Time = 0
-- create sample poses
local rootPose = Instance.new("Pose")
rootPose.Name = "HumanoidRootPart"
rootPose.Weight = 0
local lowerTorsoPose = Instance.new("Pose")
lowerTorsoPose.Name = "LowerTorso"
lowerTorsoPose.Weight = 1
-- set the sequence hierarchy
rootPose:AddSubPose(lowerTorsoPose) -- lowerTorsoPose.Parent = rootPose
keyframe:AddPose(rootPose) -- rootPose.Parent = keyframe
keyframeSequence:AddKeyframe(keyframe) -- keyframe.Parent = keyframeSequence
-- parent the sequence
keyframeSequence.Parent = workspace

概要

属性

继承自AnimationClip属性

方法

属性

AuthoredHipHeight

隐藏
插件安全性
读取并联

包含使用于编写此 的模型的臀部高度。默认值为 1.35,因为这是标准 R15 Character|character 的臀部高度设置。

方法

AddKeyframe

()

这个函数将添加一个 KeyframeKeyframeSequence ,将它作为父来抚养到 KeyframeSequence 。它与设置键框的 Instance.ParentKeyframeSequence 功能相同。

注意,当使用 keyframe 参数为 Keyframe 以外的实例时,此函数不会发生错误,并且会成功地将其作为父级。

参数

keyframe: Instance

要添加的 Keyframe

默认值:""

返回

()

代码示例

This sample demonstrates how a basic KeyframeSequence can be created.

KeyframeSequence Instantiation

-- create the keyframesequence
local keyframeSequence = Instance.new("KeyframeSequence")
keyframeSequence.Loop = false
keyframeSequence.Priority = Enum.AnimationPriority.Action
-- create a keyframe
local keyframe = Instance.new("Keyframe")
keyframe.Time = 0
-- create sample poses
local rootPose = Instance.new("Pose")
rootPose.Name = "HumanoidRootPart"
rootPose.Weight = 0
local lowerTorsoPose = Instance.new("Pose")
lowerTorsoPose.Name = "LowerTorso"
lowerTorsoPose.Weight = 1
-- set the sequence hierarchy
rootPose:AddSubPose(lowerTorsoPose) -- lowerTorsoPose.Parent = rootPose
keyframe:AddPose(rootPose) -- rootPose.Parent = keyframe
keyframeSequence:AddKeyframe(keyframe) -- keyframe.Parent = keyframeSequence
-- parent the sequence
keyframeSequence.Parent = workspace

GetKeyframes

Instances

获取关键帧 返回包含所有 Keyframes 已添加到 KeyframeSequence 的阵列。


返回

Instances

一个 Keyframe 阵列。

代码示例

This sample contains a simple function that will get the length of a KeyframeSequence by finding the Keyframe with the highest Keyframe.Time value.

Get KeyframeSequence Length

local function getSequenceLength(keyframeSequence)
local length = 0
for _, keyframe in pairs(keyframeSequence:GetKeyframes()) do
if keyframe.Time > length then
length = keyframe.Time
end
end
return length
end
local keyframeSequence = Instance.new("KeyframeSequence")
getSequenceLength(keyframeSequence)

RemoveKeyframe

()

这个函数通过将其父设置为 Keyframe 来从 KeyframeSequence 中移除一个 nil 。它与设置关键帧的父为 nil 功能相同。

这将关键帧的父设置为 nil ,但不会破坏它。这意味着,只要另一个键帧参考仍然存在,之后就可以重新父辈它了。

注意,当使用键帧参数 Instance 以外的其他 Keyframe 时,此函数不会出错。

参数

keyframe: Instance

要删除的 Keyframe

默认值:""

返回

()

代码示例

This sample adds a Keyframe to a KeyframeSequence before removing it and adding it again. Note that once a Keyframe is removed it is not destroyed, meaning it can be re-added later.

KeyframeSequence RemoveKeyframe

local keyframeSequence = Instance.new("KeyframeSequence")
keyframeSequence.Parent = workspace
local keyframe = Instance.new("Keyframe")
keyframeSequence:AddKeyframe(keyframe)
task.wait(2)
keyframeSequence:AddKeyframe(keyframe)

活动