Keyframe

Tampilkan yang Tidak Digunakan Lagi

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Sebuah Keyframe menyimpan Poses yang diterapkan pada persambungan di sebuah Model pada saat tertentu dalam animasi.Keyframes dianalisis di antara selama pemutaran animasi.

Catatan, dalam kebanyakan kasus pengembang tidak perlu memanipulasi KeyframeSequences sebagai editor animasi mencakup sebagian besar fungsi animasi.Namun, dalam beberapa kasus seorang pengembang mungkin ingin menghasilkan animasi dari Script atau membangun plugin mereka sendiri.

Struktur

Keyframe disimpan dalam KeyframeSequence dan berisi objek Pose.Posisi diberi nama sesuai dengan BaseParts yang mereka sesuaikan dan diatur dalam hal hierarki bersama.Ini berarti masing-masing adalah diasuh ke bagian yang terkait dengan bagian yang diberikan kepadanya.

Catatan, sebagai Poses diberi nama sesuai dengan BaseParts yang mereka sesuaikan, animasi memerlukan nama bagian yang berbeda untuk dimainkan dengan benar.

Interpolasi

Selama pemutaran animasi posisi di berbagai keyframe berinterpolasi di antara.Ini memungkinkan animasi mulus dibuat tanpa perlu mendefinisikan setiap frame.Perhatikan, gaya interpolasi ditentukan dalam objek Pose.Objek Keyframe hanya menyimpan Poses pada titik waktu yang ditentukan dalam animasi ( Keyframe.Time ).

Contoh Kode

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)

Rangkuman

Properti

  • Baca Paralel

    Posisi waktu Keyframe pada saat animasi (dalam detik) di sebuah animasi. Ini menentukan waktu ketika Poses di dalam keyframe akan ditampilkan.

Metode

Properti

Time

Baca Paralel

Properti ini memberikan posisi waktu Keyframe di sebuah animasi (dalam detik).Ini menentukan waktu ketika Poses di dalam keyframe akan ditampilkan.

Perhatikan Keyframe dengan nilai waktu tertinggi di dalam KeyframeSequence digunakan untuk menentukan panjang animasi.

Contoh Kode

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)

Metode

AddMarker

()

Fungsi ini menambahkan KeyframeMarker ke Keyframe dengan membesarkannya ke keyframe.Ini secara fungsional identik dengan menetapkan Instance.Parent penanda ke Keyframe.

Catatan, fungsi ini tidak akan berhasil ketika instansi lain selain KeyframeMarker diberikan sebagai parameter dan akan membesarkannya dengan sukses.

Lebih lanjut tentang Keyframes

Keyframe nama tidak perlu unik.Sebagai contoh, jika Animasi memiliki tiga keyframe yang disebut "Particles" peristiwa terhubung yang dikembalikan oleh AnimationTrack:GetMarkerReachedSignal() akan menembak setiap kali salah satu keyframe ini tercapai.

Keyframe nama dapat ditetapkan di Editor Animasi Roblox saat membuat atau mengedit animasi.Namun mereka tidak dapat ditetapkan oleh Script pada animasi yang ada sebelum memainkannya.

Lihat juga:

Parameter

marker: Instance

The KeyframeMarker yang menjadi orangtua ke Keyframe .

Nilai Default: ""

Memberikan nilai

()

Contoh Kode

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

()

Fungsi ini menambahkan Pose ke Keyframe dengan membesarkannya ke keyframe.Ini secara fungsional identik dengan menetapkan pose Instance.Parent ke keyframe.

Catatan, fungsi ini tidak akan berhasil ketika instansi lain selain Pose diberikan sebagai parameter posisi dan akan membesarkannya dengan sukses.

Parameter

pose: Instance

The Pose untuk ditambahkan.

Nilai Default: ""

Memberikan nilai

()

Contoh Kode

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

Fungsi ini mengembalikan array yang berisi semua KeyframeMarkers yang telah ditambahkan ke Keyframe.Catatan, fungsi ini hanya akan mengembalikan instances dari jenis KeyframeMarker.

Lebih lanjut tentang Keyframes

Keyframe nama tidak perlu unik.Sebagai contoh, jika Animasi memiliki tiga keyframe yang disebut "Particles" peristiwa terhubung yang dikembalikan oleh AnimationTrack:GetMarkerReachedSignal() akan menembak setiap kali salah satu keyframe ini tercapai.

Keyframe nama dapat ditetapkan di Editor Animasi Roblox saat membuat atau mengedit animasi.Namun mereka tidak dapat ditetapkan oleh Script pada animasi yang ada sebelum memainkannya.

Lihat juga:


Memberikan nilai

Instances

Sebuah array yang berisi semua KeyframeMarkers yang telah ditambahkan ke Keyframe .

Contoh Kode

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

Fungsi ini men返ikan array yang berisi semua Poses yang telah ditambahkan ke Keyframe .


Memberikan nilai

Instances

Sebuah array dari Poses .

Contoh Kode

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

()

Fungsi ini menghapus KeyframeMarker dari Keyframe dengan mengatur ulang Instance.Parent ke nil .

KeyframeMarker Instance.Parent diatur ke nil tetapi tidak dihancurkan.Ini berarti, asalkan penanda dinyatakan referensinya, nantinya bisa diberi kembali ke orang tua lagi.

Catatan, fungsi ini tidak akan berhasil ketika instansi lain selain KeyframeMarker diberikan sebagai parameter.

Lebih lanjut tentang Keyframes

Keyframe nama tidak perlu unik.Sebagai contoh, jika Animasi memiliki tiga keyframe yang disebut "Particles" peristiwa terhubung yang dikembalikan oleh AnimationTrack:GetMarkerReachedSignal() akan menembak setiap kali salah satu keyframe ini tercapai.

Keyframe nama dapat ditetapkan di Editor Animasi Roblox saat membuat atau mengedit animasi.Namun mereka tidak dapat ditetapkan oleh Script pada animasi yang ada sebelum memainkannya.

Lihat juga:

Parameter

marker: Instance

Penanda yang dihapus dari Keyframe .

Nilai Default: ""

Memberikan nilai

()

Contoh Kode

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

()

Fungsi ini menghapus Pose dari Keyframe dengan menetapkan Instance.Parent ke nil tanpa menghancurkannya.Ini berarti posisi yang disediakan disebutkan dan dapat diberi kembali nanti.

Catatan, fungsi ini tidak akan berhasil ketika instansi lain selain Pose diberikan sebagai parameter posisi.

Parameter

pose: Instance

The Pose yang harus dihapus.

Nilai Default: ""

Memberikan nilai

()

Contoh Kode

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

Acara