Keyframe

Pokaż przestarzałe

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Kluczowy kadr przechowuje zastosowany do stawów w danym momencie w animacja.Keyframes są wstawiane pomiędzy podczas odtwarzania animacji.

Zauważ, że w większości przypadków programiści nie muszą manipulować KeyframeSequences, ponieważ edytor animacji pokrywa większość funkcjonalności animacji.Jednak w niektórych przypadkach programista może chcieć wygenerować animację z Script lub stworzyć własny dodatek plug-in.

Struktura

Kluczowe ramy są przechowywane w KeyframeSequence i zawierają obiekty Pose.Pozy są nazywane zgodnie z BaseParts odpowiadają i są strukturyzowane pod względem wspólnej hierarchii.Oznacza to, że każdy Pose jest powiązany z Pose odpowiadającym części, do której jest przymocowany.

Zauważ, że jako Poses są nazywane zgodnie z BaseParts, odpowiadającymi, animacje wymagają odrębnych nazw części, aby poprawnie odtwarzać.

Interpolacja

Podczas odtwarzania animacji pozy w różnych kluczowych klatkach są wypełniane pomiędzy.Umożliwia to tworzenie płynnej animacji bez potrzeby definiowania każdego kadru.Zauważ, że styl interpolacji jest określony w obiekcie Pose.Obiekt kluczowy po prostu przechowuje Poses w określonym momencie w animacji (Keyframe.Time).

Przykłady kodu

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)

Podsumowanie

Właściwości

  • Odczyt równoległy

    Pozycja czasowa Keyframe w animacja(w sekundach) określa czas, w którym Poses wewnątrz kluczowej ramy zostanie wyświetlony.

Metody

Właściwości

Time

Odczyt równoległy

Właściwość ta daje pozycję czasu Keyframe w animacja(w sekundach).To określa czas, w którym Poses wewnątrz kluczowej ramy zostanie wyświetlony.

Zauważ Keyframe z najwyższą wartością czasu w KeyframeSequence jest używany do określenia długości animacja.

Przykłady kodu

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)

Metody

AddMarker

()

Funkcja ta dodaje KeyframeMarker do Keyframe poprzez powiązanie jej z kluczowym ramieniem.Jest funkcjonalnie identyczny z ustawieniem znacznika Instance.Parent do kluczowej ramy.

Uwaga: ta funkcja nie wystąpi błąd, gdy jako parametr podany zostanie inny niż KeyframeMarker instancja i zostanie ją pomyślnie przypisana.

Więcej o kluczowych ramach

Keyframe nazwy nie muszą być unikalne.Na przykład, jeśli animacja ma trzy kluczowe ramy o nazwie "Cząsteczki", połączone wydarzenie wysłane przez AnimationTrack:GetMarkerReachedSignal() zostanie uruchomione za każdym razem, gdy jeden z tych kluczowych ram zostanie osiągnięty.

Keyframe nazwy można ustawić w edytorze animacji Roblox podczas tworzenia lub edytowania animacja.Nie mogą jednak zostać ustawione przez Script na istniejącej animacji przed jej odtworzeniem.

Zobacz także:

Parametry

marker: Instance

The KeyframeMarker bycie rodzicem dla Keyframe.

Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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

()

Funkcja ta dodaje Pose do Keyframe poprzez powiązanie jej z kluczowym ramieniem.Jest funkcjonalnie identyczny z ustawieniem Instance.Parent pozy do kluczowej ramy.

Uwaga: ta funkcja nie będzie błędna, gdy jako parametr pozy podany zostanie inny niż Pose instancja i zostanie ją pomyślnie rozpoczęta.

Parametry

pose: Instance

The Pose które należy dodać.

Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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

Funkcja ta zwraca tablicę zawierającą wszystkie KeyframeMarkers, które zostały dodane do Keyframe.Uwaga: ta funkcja zwróci tylko instances typu KeyframeMarker.

Więcej o kluczowych ramach

Keyframe nazwy nie muszą być unikalne.Na przykład, jeśli animacja ma trzy kluczowe ramy o nazwie "Cząsteczki", połączone wydarzenie wysłane przez AnimationTrack:GetMarkerReachedSignal() zostanie uruchomione za każdym razem, gdy jeden z tych kluczowych ram zostanie osiągnięty.

Keyframe nazwy można ustawić w edytorze animacji Roblox podczas tworzenia lub edytowania animacja.Nie mogą jednak zostać ustawione przez Script na istniejącej animacji przed jej odtworzeniem.

Zobacz także:


Zwroty

Instances

Matryca zawierająca wszystkie KeyframeMarkers, które zostały dodane do Keyframe.

Przykłady kodu

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

Funkcja ta zwraca tablicę zawierającą wszystkie Poses, które zostały dodane do Keyframe.


Zwroty

Instances

Matryca z Poses.

Przykłady kodu

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

()

Funkcja ta usuwa KeyframeMarker z Keyframe przez ustawienie jej Instance.Parent na nil .

KeyframeMarker's Instance.Parent jest ustawiony na nil ale nie jest zniszczony.Oznacza to, że pod warunkiem, że znacznik jest odwołany, może zostać ponownie adoptowany później.

Uwaga: ta funkcja nie wystąpi błąd, gdy jako parametr podany zostanie instancja inna niż KeyframeMarker.

Więcej o kluczowych ramach

Keyframe nazwy nie muszą być unikalne.Na przykład, jeśli animacja ma trzy kluczowe ramy o nazwie "Cząsteczki", połączone wydarzenie wysłane przez AnimationTrack:GetMarkerReachedSignal() zostanie uruchomione za każdym razem, gdy jeden z tych kluczowych ram zostanie osiągnięty.

Keyframe nazwy można ustawić w edytorze animacji Roblox podczas tworzenia lub edytowania animacja.Nie mogą jednak zostać ustawione przez Script na istniejącej animacji przed jej odtworzeniem.

Zobacz także:

Parametry

marker: Instance

Marker jest usuwany z Keyframe.

Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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

()

Funkcja ta usuwa Pose z Keyframe poprzez ustawienie jej Instance.Parent na nil bez jej niszczenia.Oznacza to, że dostarczona poza jest odwołana i można ją ponownie adoptować później.

Uwaga: ta funkcja nie będzie błędna, gdy jako parametr pozy podany zostanie inny niż Pose instancja.

Parametry

pose: Instance

The Pose do usunięcia.

Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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

Zdarzenia