Keyframe
*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 ke joint dalam Model pada titik waktu tertentu dalam animasi. Keyframes diinterpolasi selama playback animasi.
Catatan, dalam kebanyakan kasus pengembang tidak perlu menipu KeyframeSequences karena editor animasi menutangani kebanyakan fungsi animasi. Namun, dalam beberapa kasus pengembang mungkin ingin menghasilkan animasi dari Script atau membangun plugin mereka sendiri.
Struktur
Keyframes dipegang dalam sebuah KeyframeSequence dan berisi Pose objek. Pose disebut sesuai dengan BaseParts mereka mengacu dan dibuat dalam hal hierarki bersama. Ini berarti setiap 2>Class.
Catatan, seperti Poses bernama sesuai dengan BaseParts mereka berhubungan, animasi memerlukan nama bagian yang berbeda untuk dimainkan dengan benar.
Menerjemahkan
Selama pemutaran animasi, posisi di berbagai keyframe diinterpolasi antara. Ini memungkinkan animasi lancar untuk dibuat tanpa perlu mendefinisikan setiap frame. Catat, gaya interpolasi ditentukan dalam objek Pose . Objek Keyframe hanya mengandung gaya interpolasi Poses pada titik waktu tert
Contoh Kode
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
Metode
Menambahkan KeyframeMarker ke Keyframe dengan menjadikannya orangtua ke keyframe.
Menambahkan Pose ke Keyframe dengan menjadikannya orang tua ke keyframe.
Mengembalikan matriks yang berisi semua KeyframeMarkers yang telah ditambahkan ke Keyframe .
Mengembalikan array yang berisi semua Poses yang telah ditambahkan ke Keyframe .
Menghapus sebuah KeyframeMarker dari Keyframe dengan pengaturan bahwa Instance.Parent nya menjadi nol.
Menghapus sebuah Pose dari Keyframe dengan menetapkan Instance.Parent nya menjadi nol.
Properti
Time
Item ini memberikan posisi waktu Keyframe dalam animasi. Ini menentukan waktu di mana Poses di dalam keyframe akan ditampilkan.
Catat Keyframe dengan nilai waktu tertinggi dalam KeyframeSequence untuk menentukan panjang animasi.
Contoh Kode
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 menambahkannya ke keyframe. Ini secara fungsional sama dengan menetapkan Instance.Parent ke Keyframe.
Catat, fungsi ini tidak akan berhasil ketika instans instans lain selain Keyframe Marker diberikan sebagai parameter dan akan menjadi orang tua dengan sukses.
Lebih lanjut tentang Keyframes
Keyframe nama tidak perlu unik. Misalnya, jika Animasi memiliki tiga keyframe bernama "Particles" yang dikemas oleh AnimationTrack:GetMarkerReachedSignal() akan mengecualikan setiap kali salah satu dari keyframe ini diakses.
Keyframe nama dapat ditetapkan di Roblox Animation Editor saat membuat atau mengedit animasi. Mereka tidak dapat namun ditetapkan oleh Class.Script di animasi yang sudah ada sebelum dimainkan.
Lihat juga:
Parameter
The KeyframeMarker yang diwarisi ke Keyframe .
Memberikan nilai
Contoh Kode
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 menambahkannya ke keyframe. Ini secara fungsional sama dengan menetapkan posisi Instance.Parent ke keyframe.
Catatan, fungsi ini tidak akan mengalami kesalahan saat instansi selain Pose diberikan sebagai parameter posisi dan akan menjadikannya orang tua dengan sukses.
Parameter
Memberikan nilai
Contoh Kode
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
Fungsi ini mengembalikan matriks yang berisi semua KeyframeMarkers yang telah ditambahkan ke Keyframe . Catat, fungsi ini hanya akan mengembalikan instances dari jenis Keyframe Marker.
Lebih lanjut tentang Keyframes
Keyframe nama tidak perlu unik. Misalnya, jika Animasi memiliki tiga keyframe bernama "Particles" yang dikemas oleh AnimationTrack:GetMarkerReachedSignal() akan mengecualikan setiap kali salah satu dari keyframe ini diakses.
Keyframe nama dapat ditetapkan di Roblox Animation Editor saat membuat atau mengedit animasi. Mereka tidak dapat namun ditetapkan oleh Class.Script di animasi yang sudah ada sebelum dimainkan.
Lihat juga:
Memberikan nilai
Sebuah matriks berisi semua KeyframeMarkers yang telah ditambahkan ke Keyframe .
Contoh Kode
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
Fungsi ini mengembalikan matriks yang berisi semua Poses yang telah ditambahkan ke Keyframe .
Memberikan nilai
Sebuah matriks Poses .
Contoh Kode
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 pengaturan bahwa Instance.Parent nya menjadi nol.
Class.Instance.Parent Keyframe Marker diatur ke nol tetapi tidak dihancurkan. Ini berarti, asalkan pemasar dapat diacak kemudian nanti dapat diwarisi kembali.
Catat, fungsi ini tidak akan berhasil ketika instansi selain Marker Keyframe diberikan sebagai parameter.
Lebih lanjut tentang Keyframes
Keyframe nama tidak perlu unik. Misalnya, jika Animasi memiliki tiga keyframe bernama "Particles" yang dikemas oleh AnimationTrack:GetMarkerReachedSignal() akan mengecualikan setiap kali salah satu dari keyframe ini diakses.
Keyframe nama dapat ditetapkan di Roblox Animation Editor saat membuat atau mengedit animasi. Mereka tidak dapat namun ditetapkan oleh Class.Script di animasi yang sudah ada sebelum dimainkan.
Lihat juga:
Parameter
Memberikan nilai
Contoh Kode
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 2> nil2> tanpa menghancurkannya. Ini berarti bahwa posisi yang diberikan diacak dan dapat dibaca kembali nanti.
Catatan, fungsi ini tidak akan berhasil ketika instans instans lain selain Pose diberikan sebagai parameter posisi.
Parameter
Memberikan nilai
Contoh Kode
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