Keyframe

Veraltete anzeigen

*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.

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)

Zusammenfassung

Eigenschaften

  • Parallel lesen

    Die Keyframe Zeitposition (in Sekunden) in einer Animationen. Dies bestimmt die Zeit, in der die Poses Innerhalb des Schlüsselfrahmens angezeigt wird.

Methoden

Eigenschaften

Time

Parallel lesen

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.

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)

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

marker: Instance

Die KeyframeMarker wird zum Elternteil der Keyframe.

Standardwert: ""

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.

Marker hinzufügen/Marker entfernen

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

pose: Instance

Das Pose wird hinzugefügt.

Standardwert: ""

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.

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

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

Instances

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.

Hole Keyframe-Marker an einen Keyframe an

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

Instances

Diese Funktion gibt eine Liste zurück, die alle Poses enthält, die zu einem Keyframe hinzugefügt wurden.


Rückgaben

Instances

Ein Array von Poses.

Code-Beispiele

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

()

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

marker: Instance

Der Marker wird aus der Keyframe entfernt.

Standardwert: ""

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.

Marker hinzufügen/Marker entfernen

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

pose: Instance

Die Pose zu entfernen.

Standardwert: ""

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.

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

Ereignisse