Keyframe
*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.
Ein Schlüsselfrahmen enthält die Poses an Joints angewendete an einem bestimmten Zeitpunkt in einer Animationenangewendete Model .Keyframes werden während des Animationsabspiels zwischen interpoliert.
Beachten Sie, in den meisten Fällen müssen Entwickler nicht manipulieren KeyframeSequences, da der Animations-Editor die meisten Animation-Funktionen abdeckt.In einigen Fällen möchte jedoch ein Entwickler möglicherweise eine Animation von einem Script oder erstellt sein eigenes Plug-in.
Struktur
Schlüsselframes werden innerhalb eines KeyframeSequence gehalten und enthalten Pose Objekte.Die Posen werden nach dem BaseParts benannt, zu denen sie entsprechen, und sind strukturiert in Bezug auf die gemeinsame Hierarchie.Das bedeutet, dass jedes Pose seinem entsprechenden Pose zugewiesen wird, dem es angehängt ist.
Beachten Sie, als sind nach dem Namen benannt, dem sie entsprechen, benötigen Animationen unterschiedliche Teilnamen, um richtig abgespielt zu werden.
Interpolierung
Während des Animationsabspiels werden die Posen in verschiedenen Schlüsselframes zwischen interpoliert.Dies ermöglicht eine reibungslose Animation zu erstellen, ohne jeden Frame definieren zu müssen.Beachten Sie, dass der Stil der Interpolation im Pose -Objekt festgelegt wird.Das Schlüsselframe-Objekt enthält nur die Poses an einem bestimmten Zeitpunkt in der Animation (Keyframe.Time).
Code-Beispiele
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)
Zusammenfassung
Eigenschaften
Methoden
Fügt einen KeyframeMarker zu dem Keyframe hinzu, indem es es zum Keyframepflegt.
Fügt einen Pose zu dem Keyframe hinzu, indem es es zum Keyframepflegt.
Gibt ein Array zurück, das alle KeyframeMarkers enthält, die zum Keyframe hinzugefügt wurden.
Gibt ein Array zurück, das alle Poses enthält, die zu einem Keyframe hinzugefügt wurden.
Entfernt ein KeyframeMarker von der Keyframe durch Einstellung seiner Instance.Parent auf nil .
Entfernt ein Pose von der Keyframe durch Festlegung seiner Instance.Parent auf nil .
Eigenschaften
Time
Diese Eigenschaft gibt die Keyframe Zeitposition (in Sekunden) in einer Animationenan.Dies bestimmt die Zeit, in der die Poses innerhalb des Schlüsselfelds angezeigt wird.
Beachten Sie die Keyframe mit dem höchsten Zeitwert in einer KeyframeSequence wird verwendet, um die Länge der Animationenzu bestimmen.
Code-Beispiele
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)
Methoden
AddMarker
Diese Funktion fügt einem KeyframeMarker einen Keyframe durch das Elternschaft hinzu, indem sie es zum Keyframehinzufügt.Es ist funktional identisch mit der Festlegung des Marker-Instance.Parent-Zeichens auf den Schlüsselfrahmen.
Beachten Sie, dass diese Funktion keinen Fehler auslöst, wenn eine Instanz außer einem KeyframeMarker als Parameter angegeben wird und sie erfolgreich verknüpft wird.
Mehr über Schlüsselframes
Keyframe Namen müssen nicht einzigartig sein.Wenn zum Beispiel eine Animation drei Schlüsselframes mit dem Namen "Particles" hat, wird das verbundene Ereignis ausgelöst, wenn jedes Mal einer dieser Schlüsselframes erreicht wird.
Keyframe Namen können im Roblox-Animations-Editor festgelegt werden, wenn eine Animationenerstellt oder bearbeitet wird.Sie können jedoch nicht durch ein Script auf einer vorhandenen Animation festgelegt werden, bevor sie abgespielt wird.
Siehe auch:
Parameter
Die KeyframeMarker wird zum Elternteil der Keyframe.
Rückgaben
Code-Beispiele
Dieses Beispiel zeigt die Keyframe:AddMarker()- und Keyframe:RemoveMarker()-Funktionen.Beachten Sie, dass diese funktional gleichwertig mit parenting und der Entfernung der Marker sind.
local keyframe = Instance.new("Keyframe")
keyframe.Parent = workspace
local marker = Instance.new("KeyframeMarker")
marker.Name = "FootStep"
marker.Value = 100
keyframe:AddMarker(marker) --Marker.Parent = Schlüsselfrahme
task.wait(2)
keyframe:RemoveMarker(marker) --marker.Parent = nil
AddPose
Diese Funktion fügt einem Pose einen Keyframe durch das Elternschaft hinzu, indem sie es zum Keyframehinzufügt.Es ist funktional identisch mit der Einstellung der Pose Instance.Parent auf den Keyframe.
Beachten Sie, dass diese Funktion keine Fehler macht, wenn eine Instanz außer einem Pose als Positions参数 gegeben wird und sie erfolgreich verknüpft wird.
Parameter
Rückgaben
Code-Beispiele
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
Diese Funktion gibt eine Liste zurück, die alle KeyframeMarkers enthält, die zum Keyframe hinzugefügt wurden.Beachten Sie, dass diese Funktion nur instances vom Typ KeyframeMarker zurückgibt.
Mehr über Schlüsselframes
Keyframe Namen müssen nicht einzigartig sein.Wenn zum Beispiel eine Animation drei Schlüsselframes mit dem Namen "Particles" hat, wird das verbundene Ereignis ausgelöst, wenn jedes Mal einer dieser Schlüsselframes erreicht wird.
Keyframe Namen können im Roblox-Animations-Editor festgelegt werden, wenn eine Animationenerstellt oder bearbeitet wird.Sie können jedoch nicht durch ein Script auf einer vorhandenen Animation festgelegt werden, bevor sie abgespielt wird.
Siehe auch:
Rückgaben
Ein Array, das alle KeyframeMarkers enthält, die zum Keyframe hinzugefügt wurden.
Code-Beispiele
Dieses Beispiel zeigt die Keyframe:AddMarker()- und Keyframe:GetMarkers()-Funktionen.Nach dem Hinzufügen von zwei Markern, marker1 und marker2 zum Schlüsselfrahmen, erhält und druckt dieses Beispiel die Namen der hinzugefügten Marker.
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 = Schlüsselfrahme
keyframe:AddMarker(marker2) --Marker.Parent = Schlüsselfrahme
local markers = keyframe:GetMarkers()
for _, marker in pairs(markers) do
print(marker.Name)
end
GetPoses
Diese Funktion gibt eine Liste zurück, die alle Poses enthält, die zu einem Keyframe hinzugefügt wurden.
Rückgaben
Ein Array von Poses.
Code-Beispiele
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
Diese Funktion entfernt ein KeyframeMarker von der Keyframe durch das Festlegen seiner Instance.Parent auf nil .
Der KeyframeMarker's Instance.Parent ist auf nil gesetzt, wird aber nicht zerstört.Das bedeutet, sofern der Marker referenziert wird, kann er später wieder adoptiert werden.
Beachten Sie, dass diese Funktion keinen Fehler auslöst, wenn eine Instanz außer einem KeyframeMarker als Parameter angegeben wird.
Mehr über Schlüsselframes
Keyframe Namen müssen nicht einzigartig sein.Wenn zum Beispiel eine Animation drei Schlüsselframes mit dem Namen "Particles" hat, wird das verbundene Ereignis ausgelöst, wenn jedes Mal einer dieser Schlüsselframes erreicht wird.
Keyframe Namen können im Roblox-Animations-Editor festgelegt werden, wenn eine Animationenerstellt oder bearbeitet wird.Sie können jedoch nicht durch ein Script auf einer vorhandenen Animation festgelegt werden, bevor sie abgespielt wird.
Siehe auch:
Parameter
Rückgaben
Code-Beispiele
Dieses Beispiel zeigt die Keyframe:AddMarker()- und Keyframe:RemoveMarker()-Funktionen.Beachten Sie, dass diese funktional gleichwertig mit parenting und der Entfernung der Marker sind.
local keyframe = Instance.new("Keyframe")
keyframe.Parent = workspace
local marker = Instance.new("KeyframeMarker")
marker.Name = "FootStep"
marker.Value = 100
keyframe:AddMarker(marker) --Marker.Parent = Schlüsselfrahme
task.wait(2)
keyframe:RemoveMarker(marker) --marker.Parent = nil
RemovePose
Diese Funktion entfernt ein Pose von der Keyframe durch Festlegung ihrer Instance.Parent auf nil ohne es zu zerstören.Das bedeutet, dass die bereitgestellte Pose referenziert wird und sie später wieder adoptiert werden kann.
Beachten Sie, dass diese Funktion keinen Fehler auslöst, wenn eine Instanz außer einem Pose als Positions参数 gegeben wird.
Parameter
Rückgaben
Code-Beispiele
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