该对象存储所有的 Keyframes 对于动画,决定动画是否循环,并决定其对其他动画的优先级。
什么是关键帧顺序?
Roblox 构建在动画播放中使用的动画数据,由键帧序列中的 Animation.AnimationId 属性引用。每个动画都内部指向键框顺序或曲线动画。虽然通常由 Roblox 动画编辑器创建,但键帧顺序也可以由其他插件或甚至手动创建。一旦上传到 Roblox,Roblox 将为 属性分配一个内容 ID,用于引用上传的 KeyframeSequence。
请注意,在大多数情况下,您不需要操作关键帧序列,因为动画编辑器覆盖了大部分动画功能。然而,在某些情况下,您可能希望从 Script 或构建自己的插件生成动画。但是,只有 Roblox Studio 可以使用在这样的方式创建的关键帧序列。如果您想使用此类关键帧序列,您需要将其上传到 Roblox 如下所述。
关键帧顺序属性
KeyframeSequence.Priority 和 KeyframeSequence.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.
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.
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.
-- 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
概要
方法
将 Keyframe 添加到 KeyframeSequence 并将其作为父级,将其添加到 KeyframeSequence 。
返回包含所有 Keyframes 在一个 KeyframeSequence 中的阵列。
这个函数通过将其父设置为 Keyframe 来从 KeyframeSequence 中移除一个 nil 。
属性
方法
AddKeyframe
这个函数将添加一个 Keyframe 到 KeyframeSequence ,将它作为父来抚养到 KeyframeSequence 。它与设置键框的 Instance.Parent 到 KeyframeSequence 功能相同。
注意,当使用 keyframe 参数为 Keyframe 以外的实例时,此函数不会发生错误,并且会成功地将其作为父级。
参数
返回
代码示例
This sample demonstrates how a basic KeyframeSequence can be created.
-- 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
获取关键帧 返回包含所有 Keyframes 已添加到 KeyframeSequence 的阵列。
返回
一个 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.
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 时,此函数不会出错。
参数
返回
代码示例
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.
local keyframeSequence = Instance.new("KeyframeSequence")
keyframeSequence.Parent = workspace
local keyframe = Instance.new("Keyframe")
keyframeSequence:AddKeyframe(keyframe)
task.wait(2)
keyframeSequence:AddKeyframe(keyframe)