Keyframe
*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.
Một Keyframe giữ Poses đã được áp dụng đến các khớp nối trong một Model ở một điểm thời gian nhất định trong một hoạt hiệu ứng độngsống động. Keyframes được liên hệ giữa trong khi chơi lại hoạt ảnh
Lưu ý, trong hầu hết các trường hợp, các nhà phát triển không cần phải manipulate KeyframeSequences như hoạt họa editor bao gồm hầu hết các chức năng hoạt họa. Tuy nhiên, ở một số trường hợp, một nhà phát triển có thể muốn tạo ra một hoạt plugin
Cấu trúc
Keyframes được giữ trong một KeyframeSequence và chứa Pose đối tượng. Các tư thế được tên theo cấp độ thuộc tính và được cấu tr
Lưu ý, như Poses được gọi theo tên theo thứ tự theo BaseParts mà chúng đại diện, yêu cầu để tên riêng của các bộ phận để chơi đúng cách.
Biểu tượng
Trong khi phát lại hoạt họa, các tư thế trong các khung giới hạn khác nhau được liên kết với nhau. Điều này cho phép tạo ra một hoạt họa mượt mà không cần phải định nghĩa mọi khung. Ghi chú, kiể
Mẫu mã
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)
Tóm Tắt
Thuộc Tính
Phương Pháp
Thêm một KeyframeMarker vào Keyframe bằng cách gắn nó vào keyframe.
Đó là một loạt trả về tất cả các KeyframeMarkers đã được thêm vào Keyframe .
Điều chỉnh một dàn trùng chứa tất cả các Poses đã được thêm vào một Keyframe .
Loại bỏ một KeyframeMarker từ Keyframe bằng cách cài đặt nó Instance.Parent để nil.
Loại bỏ một Pose từ Keyframe bằng cách đặt nó Instance.Parent thành nil.
Thuộc Tính
Time
Thuộc tính này cung cấp vị trí thời gian Keyframe trong một hiệu ứng động. Điều này xác định thời gian mà Poses bên trong keyframe sẽ được hiển thị.
Lưu ý rằng Keyframe với giá trị thời gian cao nhất trong một KeyframeSequence được sử dụng để xác định chiều dài hoạt hiệu ứng động.
Mẫu mã
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)
Phương Pháp
AddMarker
Hàm này thêm một Keyframe vào Instance.Parent bằng cách làm cho nó là cha của nó. Nó hoàn toàn tương tự với việc đặt 1> Class.Instance.Parent1> của nó vào Keyframe.
Lưu ý, chức năng này sẽ không bị lỗi khi một instância khác ngoài một Keyframe Marker được đưa làm tham số và sẽ nuôi dưỡng nó thành công.
Thêm về Keyframes
Keyframe tên không cần phải độc đáo. Ví dụ, nếu một hoạt họa có ba khung hình chủ đề "Particles" được gọi bằng các sự kiện kết nối bởi AnimationTrack:GetMarkerReachedSignal() thì sẽ kích hoạt mỗi khi một trong những khung hình này được kích hoạ
Keyframe tên có thể được thiết lập trong Roblox Animation Editor khi tạo hoặc chỉnh sửa một hiệu ứng động. Tuy nhiên, chúng không thể được thiết lập bởi một Script trên một hoạt họa hiện có trước khi chơi nó.
Xem thêm:
Tham Số
The KeyframeMarker được gắn với Keyframe .
Lợi Nhuận
Mẫu mã
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
Hàm này thêm một Pose vào Keyframe bằng cách làm cho nó là cha của nó. Nó hoàn toàn tương tự với việc đặt Instance.Parent của nó vào 2>Class.Keyframe2> .
Lưu ý, hành động này sẽ không bị lỗi khi một instância khác ngoài một Pose được đưa làm tham số hình ảnh và sẽ nuôi dưỡng nó thành công.
Tham Số
Lợi Nhuận
Mẫu mã
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
Hàm này trả về một hàng chứa tất cả các KeyframeMarkers đã được thêm vào Keyframe . Ghi chú, hàm này sẽ chỉ trả về instances của kiểu KeyframeMarker.
Thêm về Keyframes
Keyframe tên không cần phải độc đáo. Ví dụ, nếu một hoạt họa có ba khung hình chủ đề "Particles" được gọi bằng các sự kiện kết nối bởi AnimationTrack:GetMarkerReachedSignal() thì sẽ kích hoạt mỗi khi một trong những khung hình này được kích hoạ
Keyframe tên có thể được thiết lập trong Roblox Animation Editor khi tạo hoặc chỉnh sửa một hiệu ứng động. Tuy nhiên, chúng không thể được thiết lập bởi một Script trên một hoạt họa hiện có trước khi chơi nó.
Xem thêm:
Lợi Nhuận
Một mat阵 chứa tất cả các KeyframeMarkers đã được thêm vào Keyframe .
Mẫu mã
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
Hàm này trả về một dàn trùng chứa tất cả Poses đã được thêm vào một Keyframe .
Lợi Nhuận
Một dàn Poses .
Mẫu mã
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
Hành động này xóa một KeyframeMarker từ Keyframe bằng cách cài đặt nó Instance.Parent đến nil.
Class.Instance.Parent của Marker Keyframe được đặt thành nil nhưng nó không bị phá hủy. Điều này có nghĩa là, miễn là thẻ này được tham chiếu, nó có thể được phụ huynh lại sau đó.
Ghi chú, hàm này sẽ không bị lỗi khi một instância khác ngoài một Keyframe Marker được đưa vào làm tham số.
Thêm về Keyframes
Keyframe tên không cần phải độc đáo. Ví dụ, nếu một hoạt họa có ba khung hình chủ đề "Particles" được gọi bằng các sự kiện kết nối bởi AnimationTrack:GetMarkerReachedSignal() thì sẽ kích hoạt mỗi khi một trong những khung hình này được kích hoạ
Keyframe tên có thể được thiết lập trong Roblox Animation Editor khi tạo hoặc chỉnh sửa một hiệu ứng động. Tuy nhiên, chúng không thể được thiết lập bởi một Script trên một hoạt họa hiện có trước khi chơi nó.
Xem thêm:
Tham Số
Lợi Nhuận
Mẫu mã
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
Hành động này xóa một Pose từ Class.Keyframe bằng cách thiết lập nó Keyframe để Instance.Parent nó mà không phải phá hủy nó. Điều này có nghĩa là hình ảnh được tham chiếu và nó có thể được thiế
Ghi chú, hành động này sẽ không xảy ra lỗi khi một instância khác ngoài một Pose được đưa làm tham số.
Tham Số
Lợi Nhuận
Mẫu mã
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