Keyframe
*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.
Un cadre clé maintient le Poses appliqué aux jointures dans un Model à un point donné du temps dans une animations.Keyframes sont interpolés pendant la lecture d'animation.
Remarque, dans la plupart des cas, les développeurs n'ont pas besoin de manipuler KeyframeSequences car l'éditeur d'animation couvre la plupart des fonctionnalités d'animation.Cependant, dans certains cas, un développeur peut souhaiter générer une animation à partir d'un Script ou construire son propre plugin.
Structure
Les cadres clés sont contenus dans un KeyframeSequence et contiennent Pose des objets.Les poses sont nommées en fonction de la BaseParts qu'elles correspondent et sont structurées en termes de hiérarchie commune.Cela signifie que chacun Pose est parenté au Pose correspondant à la partie dont il est attaché.
Remarque, comme Poses sont nommés en fonction du BaseParts auquel ils correspondent, les animations nécessitent des noms de parties distincts pour jouer correctement.
Interpolisation
Pendant la lecture d'animation, les poses dans différents keyframes sont interpolées entre elles.Cela permet de créer une animation fluide sans avoir à définir chaque cadre.Remarque, le style d'interpolation est déterminé dans l'objet Pose.L'objet Keyframe ne contient que le Poses à un point défini dans l'animation (Keyframe.Time).
Échantillons de code
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.
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)
Résumé
Propriétés
Méthodes
Ajoute un KeyframeMarker à la Keyframe en le parentant à la image-clé.
Ajoute un Pose à la Keyframe en le parentant à la image-clé.
Renvoie un tableau contenant tous les KeyframeMarkers qui ont été ajoutés au Keyframe.
Renvoie un tableau contenant tous les Poses qui ont été ajoutés à un Keyframe .
Supprime un KeyframeMarker de la Keyframe par le biais de paramètres son Instance.Parent à nil .
Supprime un Pose de la Keyframe en définissant son Instance.Parent à nil .
Propriétés
Time
Cette propriété donne la position du temps Keyframe (en secondes) dans une animations.Cela détermine le moment où le Poses à l'intérieur du cadre clé sera affiché.
Remarquez le Keyframe avec la valeur de temps la plus élevée dans un KeyframeSequence est utilisé pour déterminer la longueur de l'animations.
Échantillons de code
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)
Méthodes
AddMarker
Cette fonction ajoute un KeyframeMarker à la Keyframe en le parentant au image-clé.Il est fonctionnellement identique à définir le marqueur Instance.Parent à la Keyframe.
Remarque, cette fonction ne rencontrera pas d'erreur lorsqu'une instance autre qu'un marqueur Keyframe sera donnée en tant que paramètre et la parent avec succès.
Plus sur les cadres clés
Keyframe les noms n'ont pas besoin d'être uniques.Par exemple, si une animation a trois cadres clés nommés «Particules», l'événement connecté retourné par AnimationTrack:GetMarkerReachedSignal() se déclenchera chaque fois qu'un de ces cadres clés est atteint.
Keyframe les noms peuvent être définis dans l'éditeur d'animation Roblox lors de la création ou de l'édition d'une animations.Cependant, elles ne peuvent pas être définies par un Script sur une animation existante avant de la jouer.
Voir aussi :
Paramètres
Le KeyframeMarker étant parenté au Keyframe.
Retours
Échantillons de code
This example demonstrates the Keyframe:AddMarker() and Keyframe:RemoveMarker() functions. Note these are functionally equivalent to parenting and un-parenting the markers.
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
Cette fonction ajoute un Pose à la Keyframe en le parentant au image-clé.Il est fonctionnellement identique à définir la pose de Instance.Parent à la clé.
Remarque, cette fonction ne rencontrera pas d'erreur lorsqu'une instance autre qu'une Pose sera donnée en tant que paramètre de pose et la parent avec succès.
Paramètres
Retours
Échantillons de code
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.
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.
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
Cette fonction renvoie un tableau contenant tous les KeyframeMarkers qui ont été ajoutés au Keyframe.Remarque, cette fonction ne retournera que instances de type KeyframeMarker.
Plus sur les cadres clés
Keyframe les noms n'ont pas besoin d'être uniques.Par exemple, si une animation a trois cadres clés nommés «Particules», l'événement connecté retourné par AnimationTrack:GetMarkerReachedSignal() se déclenchera chaque fois qu'un de ces cadres clés est atteint.
Keyframe les noms peuvent être définis dans l'éditeur d'animation Roblox lors de la création ou de l'édition d'une animations.Cependant, elles ne peuvent pas être définies par un Script sur une animation existante avant de la jouer.
Voir aussi :
Retours
Un tableau contenant tout KeyframeMarkers qui a été ajouté au Keyframe.
Échantillons de code
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.
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
Cette fonction renvoie un tableau contenant tous les Poses qui ont été ajoutés à un Keyframe .
Retours
Un ensemble de Poses .
Échantillons de code
This code sample includes a function to reset the CFrame of the Poses in a Keyframe.
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
Cette fonction supprime un KeyframeMarker de la Keyframe par le biais de la configuration de son Instance.Parent à nil .
Le marqueur de cadre clé est défini sur mais il n'est pas détruit.Cela signifie que, à condition que le marqueur soit référencé, il peut être ré-parenté plus tard.
Remarque, cette fonction ne rencontrera pas d'erreur lorsqu'une instance autre qu'un marqueur Keyframe sera donnée en tant que paramètre.
Plus sur les cadres clés
Keyframe les noms n'ont pas besoin d'être uniques.Par exemple, si une animation a trois cadres clés nommés «Particules», l'événement connecté retourné par AnimationTrack:GetMarkerReachedSignal() se déclenchera chaque fois qu'un de ces cadres clés est atteint.
Keyframe les noms peuvent être définis dans l'éditeur d'animation Roblox lors de la création ou de l'édition d'une animations.Cependant, elles ne peuvent pas être définies par un Script sur une animation existante avant de la jouer.
Voir aussi :
Paramètres
Retours
Échantillons de code
This example demonstrates the Keyframe:AddMarker() and Keyframe:RemoveMarker() functions. Note these are functionally equivalent to parenting and un-parenting the markers.
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
Cette fonction supprime un Pose de la Keyframe en définissant son Instance.Parent à nil sans le détruire.Cela signifie que la pose fournie est référencée et qu'elle peut être réparentée plus tard.
Remarque, cette fonction ne rencontrera pas d'erreur lorsqu'une instance autre qu'une Pose sera donnée en tant que paramètre de pose.
Paramètres
Retours
Échantillons de code
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.
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