Keyframe
*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.
Un Keyframe contient le Poses appliqué aux joints dans un Model à un moment donné dans une animations. Keyframes sont interpolés pendant la lecture de l'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 leur propre plugin.
Structure
Les keyimes sont placés dans un KeyframeSequence et contiennent Pose objets. Les poses sont nommées en fonction de la hiérarchie jointe. Ce signifie que chaque BaseParts est parenté à la hiérarchie 2>Class.Pose2> correspondant à la partie qu
Remarquez que, comme Poses sont nommés selon le BaseParts qu'ils correspondent à, les animations nécessitent des noms de parties distincts pour s'exécuter correctement.
Interprétation
Pendant la lecture d'animation, les poses dans différents cadres clés sont interpolées entre elles. Cela permet une animation fluide de créer sans avoir à définir chaque cadre. Notez que le style d'interpolation est déterminé dans l'objet Pose . L'objet Keyframe ne contient que le Poses à un moment donné dans l'animation ( Keyframe.Time ).
Échantillons de code
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 faisant apparaître en tant que parent de la clé.
Ajoute un Pose à la Keyframe en le faisant apparaître dans la fenêtre de classe.
Renvoie un tableau contenant tous les KeyframeMarkers qui ont été ajoutés au Keyframe.
Retourne un tableau contenant tous les Poses qui ont été ajoutés à un Keyframe .
Supprime un KeyframeMarker du Keyframe par le biais de ses paramètres Instance.Parent à zéro.
Supprime un Pose du Keyframe en définissant son Instance.Parent à zéro.
Propriétés
Time
Cette propriété donne la position dans le temps Keyframe dans une animations. Cela détermine le temps à cui le Poses à l'intérieur du cadre de classe sera affiché.
Notez que le Keyframe avec la plus haute valeur du temps dans une KeyframeSequence est utilisé pour déterminer la durée de l'animations.
Échantillons de code
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 par le biais de sa parenté avec la image-clé. Elle est fonctionnellement identique à la définition du marqueur Instance.Parent sur la clé.
Remarquez que cette fonction ne se produira pas d'erreur lorsqu'une instance autre qu'un marqueur de clé sera donnée en tant que paramètre et le parentera avec succès.
Plus sur les clés
Keyframe les noms ne doivent pas être uniques. Par exemple, si une animation a trois cadres clés nommés «Particles», l'événement connecté renvoyé par AnimationTrack:GetMarkerReachedSignal() lancera 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. Ils ne peuvent cependant pas être définis par un Script sur une ancienne animation avant de la jouer.
Voir aussi :
Paramètres
Le KeyframeMarker étant associé au Keyframe .
Retours
Échantillons de code
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 faisant apparaître dans la fenêtre de classement. Elle est fonctionnellement identique à la définition du Instance.Parent de la position.
Remarquez que cette fonction ne se produira pas d'erreur lorsqu'une instance autre qu'une Pose sera donnée comme paramètre de pose et le parentera avec succès.
Paramètres
Retours
Échantillons de code
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)
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 . Notez que cette fonction ne renverra que instances de type KeyframeMarker.
Plus sur les clés
Keyframe les noms ne doivent pas être uniques. Par exemple, si une animation a trois cadres clés nommés «Particles», l'événement connecté renvoyé par AnimationTrack:GetMarkerReachedSignal() lancera 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. Ils ne peuvent cependant pas être définis par un Script sur une ancienne animation avant de la jouer.
Voir aussi :
Retours
Un tableau contenant tous les KeyframeMarkers qui ont été ajoutés au Keyframe .
Échantillons de code
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 tableau de Poses .
Échantillons de code
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 du Keyframe par le biais de ses paramètres Instance.Parent à zéro.
Le marqueur Keyframe est référencé à zéro, mais il n'est pas détruit. Cela signifie que, si le marqueur est référencé, il peut être ré-parenté plus tard.
Remarquez que cette fonction ne se produira pas d'erreur lorsqu'une instance autre qu'un marqueur de clé est donnée comme argument.
Plus sur les clés
Keyframe les noms ne doivent pas être uniques. Par exemple, si une animation a trois cadres clés nommés «Particles», l'événement connecté renvoyé par AnimationTrack:GetMarkerReachedSignal() lancera 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. Ils ne peuvent cependant pas être définis par un Script sur une ancienne animation avant de la jouer.
Voir aussi :
Paramètres
Retours
Échantillons de code
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 à partir du Keyframe par définition de son Instance.Parent à 2>nil2> sans le détruire. Cela signifie que la position fournie est référencée et qu'elle peut être re-parentée plus tard.
Remarquez que cette fonction ne se produira pas d'erreur lorsqu'une instance autre qu'une Pose est donnée comme paramètre de pose.
Paramètres
Retours
Échantillons de code
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