키 프레임은 애니메이션에서 특정 시점의 Poses를 적용한 Model 에 있는 관절에 적용됩니다. Keyframes 은 애니메이션 플레이백 중에 인터폴됩니다.
대부분의 경우 애니메이션 편집기가 대부분의 애니메이션 기능을 커버하기 때문에 개발자는 KeyframeSequences 를 조작할 필요가 없습니다. 그러나 일부 경우 개발자는 애니메이션을 생성하려고 하거나 자신의 플러그인을 빌드하려고 하는 경우에만 Script 에서 애니메이션
구조
키 프레임은 키 프레임 순서 내에 있으며 KeyframeSequence 에 키 프레임 개체가 포함되어 있습니다. 키 프레임은 Pose 에 부모되며 공동 계층 구
참고, Poses는 해당하는 BaseParts에 따라 이름이 지정되지만 애니메이션은 올바르게 플레이할 수 있도록 특별한 부품 이름이 필요합니다.
인터플래시
애니메이션 플레이백 동안 키프레임 간의 포즈는 인터폴됩니다. 이를 통해 매끄러운 애니메이션을 만들어 모든 프레임을 정의할 필요 없습니다. 참고 키프레임 개체에는 인터폴 스타일이 결정됩니다. 키프레임 개체는
코드 샘플
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)
요약
속성
메서드
키 프레임에 부모로 지정하여 키 프레임을 추가합니다. KeyframeMarker에 부모로 지정하면 키 프레임에 추가됩니다.
키프레임에 부모로 지정하여 키프레임에 추가합니다. Pose
Class.Keyframe에 추가된 모든 Keyframe를 포함하는 배열을 반환합니다.
Class.Keyframe에 추가된 모든 Keyframe 배열을 반환합니다.
설정에 따라 KeyframeMarker를 제거하고 Keyframe에서 부모 Instance.Parent 로 설정 하 여 제거 합니다.
Class.Pose를 Keyframe 에 설정하여 제거합니다.
속성
Time
이 속성은 애니메이션에서 키 프레임 내의 Keyframe 시간 위치 (in seconds)를 제공합니다. 이렇게 하면 키 프레임 내의 Poses가 표시될 때의 시간을 결정합니다.
Class.Keyframe 는 애니메이션 길이를 결정하기 위해 사용된 가장 오래된 타이머입니다.
코드 샘플
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)
메서드
AddMarker
이 함수는 키프레임에 부모로 지정하여 키프레임에 추가합니다 KeyframeMarker 을 키프레임에 설정하는 기능을 추가합니다. 키프레임에 마커의 Keyframe 를 설정하는 것과 기능적으로 동일합니다.
참고, 키 프레임 마커가 아닌 인스턴스에 이 매개 변수를 지정하면 이 함수에 오류가 발생하지 않으며 부모가 되어 성공적으로 자식을 만듭니다.
키 프레임에 대해 자세히 알아보기
Keyframe 이름은 고유하지 않아도 됩니다. 예를 들어, 애니메이션에 세 개의 "Particles"라는 키 프레임이 있으면 연결된 이벤트가 반환하는 AnimationTrack:GetMarkerReachedSignal() 에서 각 키 프레임을 확인할 때마다 발생합니다.
Keyframe 이름은 애니메이션을 만들거나 편집할 때 Roblox 애니메이션 편집기에서 설정할 수 있습니다. 그러나 애니메이션을 플레이하기 전에 기존 애니메이션에 대한 Script 에 의해 설정될 수 없습니다.
또한 참조하십시오.
매개 변수
반환
코드 샘플
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
이 함수는 키프레임에 부모로 지정하여 Pose를 추가하고, 키프레임에 부모로 지정하여 Keyframe를 설정합니다. 이 함수는 포즈의 Instance.Parent를 키프레임에 설정하는 것과 함수적으로 동일합니다.
참고, 이 함수는 Pose가 아닌 인스턴스에 포즈 매개 변수로 지정된 경우에도 오류가 발생하지 않고 부모가 되어 성공적으로 상속됩니다.
매개 변수
반환
코드 샘플
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
이 함수는 모든 KeyframeMarkers 를 포함하는 배열을 반환합니다. 참고, 이 함수는 모든 유형의 Keyframe 에 대해 키 프레임 마커를 반환합니다.
키 프레임에 대해 자세히 알아보기
Keyframe 이름은 고유하지 않아도 됩니다. 예를 들어, 애니메이션에 세 개의 "Particles"라는 키 프레임이 있으면 연결된 이벤트가 반환하는 AnimationTrack:GetMarkerReachedSignal() 에서 각 키 프레임을 확인할 때마다 발생합니다.
Keyframe 이름은 애니메이션을 만들거나 편집할 때 Roblox 애니메이션 편집기에서 설정할 수 있습니다. 그러나 애니메이션을 플레이하기 전에 기존 애니메이션에 대한 Script 에 의해 설정될 수 없습니다.
또한 참조하십시오.
반환
Class.Keyframe 에 추가된 모든 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
이 함수는 Poses 를 모두 포함하는 배열을 반환합니다. Keyframe 에 추가된 모든 Class.Pose|Poses 를 반환합니다.
반환
Class.Pose|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
이 함수는 KeyframeMarker를 설정하여 Keyframe에서 제거합니다.
키 프레임 마커의 Instance.Parent 는 일반적으로 0으로 설정되지만 파괴되지는 않습니다. 이렇게 하면 마커가 참조된 후 다시 부모가 될 수 있습니다.
참고, 키 프레임 마커가 아닌 인스턴스에 이 매개 변수가 지정된 경우에는 이 함수에 오류가 발생하지 않습니다.
키 프레임에 대해 자세히 알아보기
Keyframe 이름은 고유하지 않아도 됩니다. 예를 들어, 애니메이션에 세 개의 "Particles"라는 키 프레임이 있으면 연결된 이벤트가 반환하는 AnimationTrack:GetMarkerReachedSignal() 에서 각 키 프레임을 확인할 때마다 발생합니다.
Keyframe 이름은 애니메이션을 만들거나 편집할 때 Roblox 애니메이션 편집기에서 설정할 수 있습니다. 그러나 애니메이션을 플레이하기 전에 기존 애니메이션에 대한 Script 에 의해 설정될 수 없습니다.
또한 참조하십시오.
매개 변수
반환
코드 샘플
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
이 함수는 제거 Pose 를 클래스 Keyframe 에서 설정하여 제거하고 제거 Instance.Parent 를 2>nil2> 로 복제하여 다시 부모가 될 수 있습니다. 이렇게 하면 제공된 포즈가 참조되고 나중에 다시 부모가 될 수
참고, 이 함수는 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