Keyframe

Mostrar obsoleto

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Um Quadro-Chave mantém o Poses aplicado aos joints em um Model em um determinado ponto de tempo em uma animações.Keyframes são interpolados entre durante a reprodução de animação.

Observe, na maioria dos casos, os desenvolvedores não precisam manipular KeyframeSequences como o editor de animação cobre a maioria das funcionalidades de animação.No entanto, em alguns casos, um desenvolvedor pode desejar gerar uma animação a partir de um Script ou construir seu próprio plugin.

Estrutura

Os quadros-chave são mantidos dentro de um KeyframeSequence e contêm objetos Pose .As poses são nomeadas de acordo com a BaseParts que elas correspondem e são estruturadas em termos de hierarquia conjunta.Isso significa que cada Pose é parente do Pose correspondente à parte a que está anexado.

Observe, como Poses são nomeados de acordo com o BaseParts a que correspondem, as animações requerem nomes de partes distintas para tocar corretamente.

Interpolação

Durante a reprodução de animação, as poses em diferentes quadros-chave são interpoladas entre.Isso permite que uma animação suave seja criada sem precisar definir cada quadro.Observe, o estilo de interpolação é determinado no ObjetoPose.O objeto Keyframe apenas mantém o Poses em um ponto de tempo definido na animação (Keyframe.Time).

Amostras de código

This sample includes a function that will generate a 'blank' keyframe containing blank poses for all of the model's connected parts in the correct hierarchical order.

Keyframe Generate Poses

local function generateKeyframe(model)
if not model.PrimaryPart then
warn("No primary part set")
return
end
local rootPart = model.PrimaryPart:GetRootPart()
if not rootPart then
warn("Root part not found")
return
end
local partsAdded = {}
partsAdded[rootPart] = true
local function addPoses(part, parentPose)
-- get all of the joints attached to the part
for _, joint in pairs(part:GetJoints()) do
-- we're only interested in Motor6Ds
if joint:IsA("Motor6D") then
-- find the connected part
local connectedPart = nil
if joint.Part0 == part then
connectedPart = joint.Part1
elseif joint.Part1 == part then
connectedPart = joint.Part0
end
if connectedPart then
-- make sure we haven't already added this part
if not partsAdded[connectedPart] then
partsAdded[connectedPart] = true
-- create a pose
local pose = Instance.new("Pose")
pose.Name = connectedPart.Name
parentPose:AddSubPose(pose)
-- recurse
addPoses(connectedPart, pose)
end
end
end
end
end
local keyframe = Instance.new("Keyframe")
-- populate the keyframe
local rootPose = Instance.new("Pose")
rootPose.Name = rootPart.Name
addPoses(rootPart, rootPose)
keyframe:AddPose(rootPose)
return keyframe
end
local character = script.Parent
local keyframe = generateKeyframe(character)
print(keyframe)

Resumo

Propriedades

  • Ler Parallel

    A posição de tempo Keyframe na animações(em segundos) determina o momento em que o Poses dentro do quadro de chave será mostrado.

Métodos

Propriedades

Time

Ler Parallel

Essa propriedade dá a posição de tempo Keyframe na animações(em segundos) em uma propriedade.Isso determina o momento em que o Poses dentro do quadro de chave será mostrado.

Observe o Keyframe com o maior valor de tempo em uma KeyframeSequence é usado para determinar a duração da animações.

Amostras de código

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)

Métodos

AddMarker

()

Essa função adiciona um KeyframeMarker ao Keyframe pela parentalização com o keyframe.É funcionalmente idêntico a definir o marcador Instance.Parent para o Keyframe.

Observe, essa função não irá errar quando uma instância diferente de um Marcador Keyframe for dada como parâmetro e será pai dela com sucesso.

Mais sobre Keyframes

Keyframe nomes não precisam ser únicos.Por exemplo, se uma Animação tiver três quadros-chave chamados "Partículas", o evento conectado retornado por AnimationTrack:GetMarkerReachedSignal() disparará cada vez que um desses quadros-chave for alcançado.

Keyframe nomes podem ser definidos no Editor de Animação Roblox ao criar ou editar uma animações.No entanto, eles não podem ser definidos por um Script em uma animação existente antes de tocá-la.

Veja também:

Parâmetros

marker: Instance

O KeyframeMarker sendo pai para o Keyframe.

Valor Padrão: ""

Devolução

()

Amostras de código

This example demonstrates the Keyframe:AddMarker() and Keyframe:RemoveMarker() functions. Note these are functionally equivalent to parenting and un-parenting the markers.

Add Marker/Remove Marker

local keyframe = Instance.new("Keyframe")
keyframe.Parent = workspace
local marker = Instance.new("KeyframeMarker")
marker.Name = "FootStep"
marker.Value = 100
keyframe:AddMarker(marker) --marker.Parent = keyframe
task.wait(2)
keyframe:RemoveMarker(marker) --marker.Parent = nil

AddPose

()

Essa função adiciona um Pose ao Keyframe pela parentalização com o keyframe.É funcionalmente idêntico a definir o Instance.Parent da posição para o quadro de chaves.

Observe, essa função não dará erro quando uma instância diferente de uma Pose for dada como parâmetro de posição e a filiará com sucesso.

Parâmetros

pose: Instance

O Pose a ser adicionado.

Valor Padrão: ""

Devolução

()

Amostras de código

This sample includes a function that will generate a 'blank' keyframe containing blank poses for all of the model's connected parts in the correct hierarchical order.

Keyframe Generate Poses

local function generateKeyframe(model)
if not model.PrimaryPart then
warn("No primary part set")
return
end
local rootPart = model.PrimaryPart:GetRootPart()
if not rootPart then
warn("Root part not found")
return
end
local partsAdded = {}
partsAdded[rootPart] = true
local function addPoses(part, parentPose)
-- get all of the joints attached to the part
for _, joint in pairs(part:GetJoints()) do
-- we're only interested in Motor6Ds
if joint:IsA("Motor6D") then
-- find the connected part
local connectedPart = nil
if joint.Part0 == part then
connectedPart = joint.Part1
elseif joint.Part1 == part then
connectedPart = joint.Part0
end
if connectedPart then
-- make sure we haven't already added this part
if not partsAdded[connectedPart] then
partsAdded[connectedPart] = true
-- create a pose
local pose = Instance.new("Pose")
pose.Name = connectedPart.Name
parentPose:AddSubPose(pose)
-- recurse
addPoses(connectedPart, pose)
end
end
end
end
end
local keyframe = Instance.new("Keyframe")
-- populate the keyframe
local rootPose = Instance.new("Pose")
rootPose.Name = rootPart.Name
addPoses(rootPart, rootPose)
keyframe:AddPose(rootPose)
return keyframe
end
local character = script.Parent
local keyframe = generateKeyframe(character)
print(keyframe)

This sample demonstrates quickly the Keyframe.AddPose, Keyframe.RemovePose and Pose.AddSubPose and Pose.RemoveSubPose functions. Note these are functionally equivalent to parenting and un-parenting the poses.

Keyframe Add/Remove Pose

local keyframe = Instance.new("Keyframe")
keyframe.Parent = workspace
local pose = Instance.new("Pose")
pose.EasingStyle = Enum.PoseEasingStyle.Cubic
pose.EasingDirection = Enum.PoseEasingDirection.Out
local pose2 = Instance.new("Pose")
pose2.EasingStyle = Enum.PoseEasingStyle.Cubic
pose2.EasingDirection = Enum.PoseEasingDirection.Out
keyframe:AddPose(pose) -- pose.Parent = keyframe
task.wait(2)
keyframe:RemovePose(pose) -- pose.Parent = nil
task.wait(2)
keyframe:AddPose(pose) -- pose.Parent = keyframe
task.wait(2)
pose:AddSubPose(pose2) -- pose2.Parent = pose
task.wait(2)
pose:RemoveSubPose(pose2) -- pose2.Parent = nil

GetMarkers

Instances

Essa função retorna um array que contém todos os KeyframeMarkers que foram adicionados ao Keyframe.Observe, essa função retornará apenas instances do tipo KeyframeMarker.

Mais sobre Keyframes

Keyframe nomes não precisam ser únicos.Por exemplo, se uma Animação tiver três quadros-chave chamados "Partículas", o evento conectado retornado por AnimationTrack:GetMarkerReachedSignal() disparará cada vez que um desses quadros-chave for alcançado.

Keyframe nomes podem ser definidos no Editor de Animação Roblox ao criar ou editar uma animações.No entanto, eles não podem ser definidos por um Script em uma animação existente antes de tocá-la.

Veja também:


Devolução

Instances

Um array que contém todos os KeyframeMarkers que foram adicionados ao Keyframe.

Amostras de código

This example demonstrates the Keyframe:AddMarker() and Keyframe:GetMarkers() functions. After adding two markers, marker1 and marker2 to the keyframe, this example gets and prints the names of the added markers.

Get Keyframe Markers Attached to a Keyframe

local keyframe = Instance.new("Keyframe")
keyframe.Parent = workspace
local marker1 = Instance.new("KeyframeMarker")
marker1.Name = "FootStep"
marker1.Value = 100
local marker2 = Instance.new("KeyframeMarker")
marker2.Name = "Wave"
marker2.Value = 100
keyframe:AddMarker(marker1) --marker.Parent = keyframe
keyframe:AddMarker(marker2) --marker.Parent = keyframe
local markers = keyframe:GetMarkers()
for _, marker in pairs(markers) do
print(marker.Name)
end

GetPoses

Instances

Essa função retorna um array que contém todos os Poses que foram adicionados a um Keyframe .


Devolução

Instances

Um array de Poses .

Amostras de código

This code sample includes a function to reset the CFrame of the Poses in a Keyframe.

Keyframe Reset Poses

local function resetPoses(parent)
-- both functions are equivalent to GetChildren
local poses = parent:IsA("Keyframe") and parent:GetPoses() or parent:IsA("Pose") and parent:GetSubPoses()
for _, pose in pairs(poses) do
if pose:IsA("Pose") then
pose.CFrame = CFrame.new()
-- recurse
resetPoses(pose)
end
end
end

RemoveMarker

()

Essa função remove um KeyframeMarker de sua Keyframe por definir suas Instance.Parent para nil .

O marcador do Keyframe está definido para mas não é destruído.Isso significa, desde que o marcador seja referenciado, ele pode ser re-paternizado mais tarde.

Observe, essa função não dará erro quando uma instância diferente de um Marcador Keyframe for dada como parâmetro.

Mais sobre Keyframes

Keyframe nomes não precisam ser únicos.Por exemplo, se uma Animação tiver três quadros-chave chamados "Partículas", o evento conectado retornado por AnimationTrack:GetMarkerReachedSignal() disparará cada vez que um desses quadros-chave for alcançado.

Keyframe nomes podem ser definidos no Editor de Animação Roblox ao criar ou editar uma animações.No entanto, eles não podem ser definidos por um Script em uma animação existente antes de tocá-la.

Veja também:

Parâmetros

marker: Instance

O marcador sendo removido do Keyframe .

Valor Padrão: ""

Devolução

()

Amostras de código

This example demonstrates the Keyframe:AddMarker() and Keyframe:RemoveMarker() functions. Note these are functionally equivalent to parenting and un-parenting the markers.

Add Marker/Remove Marker

local keyframe = Instance.new("Keyframe")
keyframe.Parent = workspace
local marker = Instance.new("KeyframeMarker")
marker.Name = "FootStep"
marker.Value = 100
keyframe:AddMarker(marker) --marker.Parent = keyframe
task.wait(2)
keyframe:RemoveMarker(marker) --marker.Parent = nil

RemovePose

()

Essa função remove um Pose de seu Keyframe definindo seu Instance.Parent para nil sem destruí-lo.Isso significa que a postura fornecida foi referenciada e pode ser re-parentada mais tarde.

Observe, essa função não dará erro quando uma instância diferente de uma Pose for dada como parâmetro de posição.

Parâmetros

pose: Instance

O Pose a ser removido.

Valor Padrão: ""

Devolução

()

Amostras de código

This sample demonstrates quickly the Keyframe.AddPose, Keyframe.RemovePose and Pose.AddSubPose and Pose.RemoveSubPose functions. Note these are functionally equivalent to parenting and un-parenting the poses.

Keyframe Add/Remove Pose

local keyframe = Instance.new("Keyframe")
keyframe.Parent = workspace
local pose = Instance.new("Pose")
pose.EasingStyle = Enum.PoseEasingStyle.Cubic
pose.EasingDirection = Enum.PoseEasingDirection.Out
local pose2 = Instance.new("Pose")
pose2.EasingStyle = Enum.PoseEasingStyle.Cubic
pose2.EasingDirection = Enum.PoseEasingDirection.Out
keyframe:AddPose(pose) -- pose.Parent = keyframe
task.wait(2)
keyframe:RemovePose(pose) -- pose.Parent = nil
task.wait(2)
keyframe:AddPose(pose) -- pose.Parent = keyframe
task.wait(2)
pose:AddSubPose(pose2) -- pose2.Parent = pose
task.wait(2)
pose:RemoveSubPose(pose2) -- pose2.Parent = nil

Eventos