애니메이션 그래프 편집기는 기술 아티스트와 애니메이터가 Roblox Studio 내에서 복잡한 애니메이션 논리를 직접 구축할 수 있도록 하는 시각적 노드 기반 도구입니다. 블렌드 트리와 같은 동작을 생성하기 위한 간소화된 인터페이스를 제공함으로써 캐릭터 모션에 대한 전통적인 수동 스크립팅 의존성을 제거합니다.
이 시스템은 기존 애니메이션 워크플로와 함께 작동합니다:
- 애니메이션 편집기: 개별 클립을 작성하고 키프레임 및 곡선을 미세 조정하기 위한 기본 도구로 애니메이션 편집기를 계속 사용합니다.
- 애니메이션 그래프 편집기: 이 도구를 사용하여 이러한 클립을 논리 트리로 구성하여 정교한 게임 플레이 동작을 구동합니다.
협업을 강화하도록 설계된 시각적 그래프는 개발자가 애니메이터가 생성한 논리를 신속하게 검사하고 디버그하며 이해할 수 있도록 합니다. 아티스트가 상호작용하는 모션을 다듬는 동안, 개발자는 여전히 블렌드 애니메이션과 상태에 대한 직접적인 제어를 위해 애니메이션 그래프 노드에 프로그래밍적으로 접근할 수 있습니다.
그래프 구축
애니메이션 가능한 캐릭터에 대한 논리를 구축하려면 Studio 리본의 아바타 탭을 통해 애니메이션 그래프 편집기에 접근합니다. 다음 단계에서는 기본 걷기 및 손 흔들기 애니메이션을 사용하여 리그를 초기화하고 기본 노드 네트워크를 구성하는 방법을 보여줍니다.
실용적인 응용 프로그램에 대한 더 깊은 탐구를 위해, 애니메이션 그래프 참조 파일을 탐색할 수 있으며, 이 파일에는 기본 및 복잡한 구현 예제가 포함되어 있습니다.
자신만의 애니메이션 그래프를 만들려면, 참조에서 제공된 기본 예제와 유사하게 다음 단계를 사용하십시오:
Studio에서 아바타 탭으로 이동하여 캐릭터 ⟩ 내 아바타를 선택하여 애니메이션 가능한 리그를 추가합니다.

아바타 탭에서 그래프 편집기로 이동하여 애니메이션 그래프 편집기를 엽니다.

3D 뷰포트에서 애니메이션 가능한 리그를 선택하고 그래프 만들기를 선택합니다.
그래프 편집기에서 마우스 오른쪽 버튼을 클릭하고 클립을 선택합니다.

새 클립 노드에서 애니메이션 ID를 설정합니다.
애니메이션 ID 드롭다운을 선택합니다.
특정 애니메이션 자산 ID를 제출하려면 가져오기를 클릭합니다.

애니메이션 ID 필드에 기본 걷기 애니메이션을 추가합니다: 507777826.
가져오기를 선택합니다.
기본 손 흔들기 애니메이션: 507770239를 사용하여 4-5단계를 반복하여 또 다른 클립 노드를 추가합니다.

그래프 편집기에서 마우스 오른쪽 버튼을 클릭하고 추가를 선택합니다.

클립 노드를 추가 노드에 연결하려면 오른쪽 상단 출력 커넥터를 적절한 포트로 드래그합니다:
- 걷기 애니메이션이 있는 클립 노드를 기본 포트에 연결합니다.
- 손 흔들기 애니메이션이 있는 클립 노드를 부가적 포트에 연결합니다.

추가 노드에서 오른쪽 상단 출력 커넥터를 그래프 출력 포즈 포트에 연결합니다.

- 선택 사항Speed 변수에 매개변수를 할당합니다.
녹색 속도 포트를 빈 영역으로 클릭하고 드래그합니다. 새 매개변수 노드가 표시됩니다.

그래프 편집기 왼쪽 상단에서 매개변수 창을 사용하여 노드의 매개변수를 신속하게 수정합니다. 또한 프로그래밍적으로 접근할 수 있습니다.

재생 버튼을 눌러 애니메이션을 테스트합니다.

다양한 가중치, 속도, 재생 모드 및 기타 애니메이션을 테스트해 보십시오. 개별 노드에 대한 자세한 내용은 노드 참조를 참조하십시오.
API 통합
애니메이션 그래프를 생성하고 배포하는 것은 표준 Roblox 애니메이션 파이프라인을 따릅니다. 애니메이션 그래프 편집기에서 리그를 선택하면 새로운 AnimationGraphDefinition 자산이 생성됩니다. 이 자산은 노드, 연결 및 매개변수의 컨테이너 역할을 합니다. 논리가 완료되면 그래프를 게시하여 표준 자산 ID를 받습니다.
스크립트에서 이러한 그래프와 상호작용하려면 전통적인 애니메이션처럼 Animator에 로드합니다. 그래프의 내부 논리를 구동하려면 AnimationTrack:SetParameter()를 사용하여 이동 속도나 상태 불리언과 같은 실시간 값을 그래프의 변수에 직접 전달합니다.
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://123456789" -- 게시된 그래프 ID
local animationTrack = animator:LoadAnimation(animation)
animationTrack:Play()
-- RunService를 통한 동적 매개변수 업데이트
game:GetService("RunService").Stepped:Connect(function(_, dt)
local currentSpeed = humanoidRootPart.AssemblyLinearVelocity.Magnitude
animationTrack:SetParameter("humanoidSpeed", currentSpeed)
end)노드 참조
모든 애니메이션 그래프 노드는 캐릭터 리그에 도달하기 전에 애니메이션 데이터를 처리하는 논리 게이트 또는 데이터 소스 역할을 합니다. 이 섹션에서는 애니메이션 그래프 편집기 내의 기능 블록에 대한 기술적 분석을 제공합니다. 현재 모든 노드는 애니메이션 포즈를 출력합니다.
각 노드 섹션에는 다음이 포함됩니다:
- 정의 – 노드의 목적과 그래프 내 역할에 대한 요약.
- 입력 – 노드에 들어오는 데이터 스트림. 여러 입력은 Input1, Input2, ..., InputN으로 표시됩니다.
- 입력 속성 – 특정 입력에 직접 연결된 설정(Blend1D 노드에서 0.5의 위치에 할당된 대기 입력).
- 이벤트 데이터 – 내부 그래프 논리 또는 외부 Luau 스크립트를 트리거하기 위해 노드에서 방출되거나 소비되는 이벤트. 이 동작은 베타 개발 과정에서 변경될 수 있습니다.
전역 이벤트 규칙
모든 노드 및 전환에 대해 기본적으로 다음 규칙이 적용됩니다:
- 이벤트는 소스 노드에서 그래프를 통해 위로 전파됩니다. 각 이벤트는 최종 블렌드에서 소스의 영향을 나타내는 가중치를 포함합니다. 가중치가 어느 시점에서든 0에 도달하면 이벤트는 침묵합니다.
- 사용자 정의 이벤트 논리가 없는 노드는 모든 이벤트를 변경 없이 통과시킵니다. 입력 간 블렌드 또는 선택을 수행하는 노드는 가중치를 조정하거나 비주요 입력에서 이벤트를 차단할 수 있습니다(각 노드 이벤트 섹션 참조).
- 그래프 상단에 도달한 마커 이벤트는 AnimationTrack:GetMarkerReachedSignal()을 통해 관찰할 수 있습니다.
클립

AnimationClip 자산에 대한 참조입니다. 이는 그래프의 리프 노드로, 다른 노드에 블렌딩, 선택 또는 수정할 원시 애니메이션 데이터를 생성합니다.
- 입력
- 없음
- 속성
속성 유형 설명 AnimationId 문자열 재생할 애니메이션 자산(예: rbxassetid://12345). PlayMode Enum.AnimationNodePlayMode 클립이 지속 시간의 끝에 도달했을 때의 동작을 정의합니다.
- 루프(기본값): 클립이 끝나면 자동으로 처음부터 다시 시작합니다.
- 핑퐁: 시작부터 끝까지 재생한 후 즉시 끝에서 시작으로 재생합니다.
- 한 번 재생하고 유지: 한 번 재생하고 완료 시 최종 포즈를 유지합니다.
- 한 번 재생하고 초기화: 한 번 재생하고 완료 시 초기 시작 포즈로 돌아갑니다.
Reverse 부울 재생 방향을 제어합니다. Speed 숫자 재생 속도에 대한 배수입니다. 0.0은 그래프를 일시 정지하고, 1.0은 정상 속도이며, 2.0은 두 배 속도입니다. Trim 부울 클립의 지속 시간을 잘라낼지 여부를 전환합니다. TrimStart 숫자 재생이 시작되어야 하는 절대 타임스탬프(초 단위)입니다. TrimEnd 숫자 재생이 종료되어야 하는 절대 타임스탬프(초 단위)입니다. - 이벤트 데이터
- 이벤트 처리: 없음. 자식이 없는 리프 노드입니다.
- 이벤트 방출: 애니메이션 클립에 내장된 사용자 정의 마커(예: "Footstep", "WeaponSwing")를 읽고 발생하는 정확한 프레임에서 이름이 지정된 이벤트로 방출합니다. 클립이 잘리면 정의된 [TrimStart, TrimEnd] 간격(포함) 내의 마커만 방출됩니다.
선택

선택 속성을 통해 여러 입력 중에서 선택합니다. 현재 선택이 변경될 때마다 새로운 전환을 트리거합니다.
- 입력
- Input1...InputN
- 속성
속성 유형 설명 Selection 문자열 선택할 입력의 고유 ID로, 입력 연결의 이름과 일치합니다(예: "Walk"). - 이벤트 데이터
- 이벤트 처리: 현재 선택된 입력의 이벤트는 가중치가 변경되지 않고 통과합니다.
- 이벤트 방출: 현재 선택된 입력에서만 모든 이벤트가 통과합니다. 전환 중에는 이벤트 방출이 전역 이벤트 규칙을 따릅니다.
우선 선택

위에서 아래로 연결된 입력 목록을 평가하고 조건이 true로 평가되는 첫 번째 입력을 재생합니다. 이를 통해 특정 논리를 기반으로 한 계층적 애니메이션 선택이 가능합니다. 현재 선택이 변경될 때마다 새로운 전환을 트리거합니다.
- 입력
- Input1...InputN
- Trigger (부울): 이 입력을 활성화하기 위해 true여야 하는 논리 조건입니다. 현재 버전에서는 이 조건이 부울 매개변수에 연결되어 있습니다.
- TransitionOverrideInterruptible (Enum.AnimationNodeInterruptible): 이 활성 애니메이션이 더 높은 우선 순위 입력에 의해 중단될 수 있는 규칙을 정의합니다. 노드 수준의 DefaultInterruptible 설정을 재정의합니다.
- 항상(기본값): 입력은 언제든지 더 높은 우선 순위 조건에 의해 중단될 수 있습니다.
- 완료: 현재 애니메이션이 재생을 완료해야 더 높은 우선 순위 입력이 차지할 수 있습니다.
- Trigger: 입력은 InterruptibleTrigger가 true로 설정된 경우에만 중단 가능합니다.
- InterruptibleTrigger (부울): TransitionOverrideInterruptible가 Trigger로 설정된 경우에만 사용할 수 있습니다. 이 특정 표현식이 true일 때 입력이 중단될 수 있습니다.
- 속성
속성 유형 설명 DefaultInterruptible Enum.AnimationNodeInterruptible 모든 입력에 적용되는 기본 중단 규칙입니다. 각 입력은 자신의 TransitionOverrideInterruptible 입력 속성으로 이를 재정의할 수 있습니다. - 이벤트 데이터
- 이벤트 처리: 현재 선택된 입력의 이벤트는 가중치가 변경되지 않고 통과합니다.
- 이벤트 방출: 현재 선택된 입력에서만 모든 이벤트가 통과합니다. 전환 중에는 이벤트 방출이 전역 이벤트 규칙을 따릅니다.
시퀀스

정의된 대기 조건에 따라 연결된 입력을 특정 순서로 활성화합니다. 현재 선택이 변경될 때마다 새로운 전환을 트리거합니다.
- 입력
- Input1...InputN
- TransitionOverrideWaitFor (Enum.AnimationNodeWaitFor): 시퀀스가 다음 입력으로 진행되기 전에 충족해야 하는 조건을 지정합니다. 노드 수준의 DefaultWaitFor 설정을 재정의합니다.
- 완료(기본값): 현재 입력이 사이클을 완료하면 다음 입력으로 진행합니다. 진행 동작은 연결된 입력에 따라 다릅니다:
- 한 번 재생하는 클립: 클립이 끝나면 진행합니다.
- 루프 클립: 한 번의 전체 루프가 완료되면 진행합니다.
- 무한 루프가 있는 시퀀스: 모든 입력을 통해 한 번의 전체 사이클이 완료되면 진행합니다.
- 유한 루프가 있는 시퀀스: 모든 루프가 완료되면 진행합니다.
- Trigger: 사용자 정의 논리 표현식이 true로 평가될 때 다음 입력을 활성화합니다.
- WaitForTrigger (부울): TransitionOverrideWaitFor가 Trigger로 설정된 경우에만 사용할 수 있습니다.
- 속성
속성 유형 설명 LoopCount 숫자 전체 시퀀스를 몇 번 반복할지를 나타냅니다. 0(기본값)의 값은 무한 루프를 나타냅니다. 카운트에 도달하면 노드는 최종 입력의 루프 또는 유지 설정을 존중합니다. DefaultWaitFor Enum.AnimationNodeWaitFor 모든 입력에 적용되는 기본 대기 조건입니다. 각 입력은 자신의 TransitionOverrideWaitFor 입력 속성으로 이를 재정의할 수 있습니다. - 이벤트 데이터
- 이벤트 처리: 현재 활성 입력의 이벤트는 가중치가 변경되지 않고 통과합니다.
- 이벤트 방출: 시퀀스에서 현재 활성 입력의 모든 이벤트가 통과합니다. 전환 중에는 이벤트 방출이 전역 이벤트 규칙을 따릅니다.
랜덤 시퀀스

연결된 입력 중 하나를 무작위로 선택하고 재생합니다. 현재 선택된 애니메이션이 완료되면 노드는 무작위로 다른 입력을 선택하여 재생합니다. 각 입력에 특정 가중치를 할당하여 선택될 확률에 영향을 줄 수 있습니다. 현재 선택이 변경될 때마다 새로운 전환을 트리거합니다.
- 입력
- Input1...InputN
- Weight (숫자): 이 입력이 선택될 확률을 결정합니다. 더 높은 가중치는 선택될 확률을 증가시킵니다.
- 속성
속성 유형 설명 PlayCount 숫자 노드가 멈추기 전에 재생할 입력의 수입니다. 도달하면 노드는 최종 입력의 루프 또는 유지 설정을 존중합니다. 기본값은 무한을 위한 0입니다. Seed 숫자 무작위 수 생성기(RNG)를 초기화하는 데 사용되는 값으로, 서로 다른 클라이언트 간에 시퀀스가 일관되게 유지되도록 합니다. 기본값은 무작위 시드를 위한 -1입니다. - 이벤트 데이터
- 이벤트 처리: 현재 활성 입력의 이벤트는 가중치가 변경되지 않고 통과합니다.
- 이벤트 방출: 시퀀스에서 현재 활성 입력의 모든 이벤트가 통과합니다. 전환 중에는 이벤트 방출이 전역 이벤트 규칙을 따릅니다.
오버

오버 포즈를 기본 포즈 위에 레이어링합니다. 마스크 노드와 결합하면 오버 포즈에서 마스킹된 관절이 기본 포즈를 완전히 드러내어 투명한 오버레이 효과를 생성합니다.
- 입력
- Base: 배경 또는 하위 레이어로, 일반적으로 이동 또는 대기 상태와 같은 전체 신체 애니메이션입니다.
- Over: 기본 위에 적용될 전경 또는 상위 레이어로, 손 제스처 또는 도구 사용 애니메이션과 같은 것입니다.
- 속성
속성 유형 설명 Weight 숫자 오버 포즈를 감쇠하는 데 사용되는 블렌드 가중치입니다. 기본값은 1.0(전체 오버라이드)이며 클램프되지 않습니다. - 이벤트 데이터
- 이벤트 처리:
- 노드는 기본 및 오버 입력 모두에서 이벤트를 수신합니다.
- 이벤트 방출:
- 기본 이벤트: 기본 입력의 모든 이벤트는 변경 없이 통과합니다.
- 오버 이벤트: 오버 입력의 이벤트는 가중치 속성에 의해 스케일링됩니다.
- 가중치 0.5에서, 오버 이벤트는 절반의 가중치로 전파됩니다.
- 가중치 0에서, 이벤트는 침묵합니다.
추가

부가적 포즈를 기본 포즈에 추가하며, 특정 가중치에 의해 감쇠됩니다(클램프되지 않음).
- 입력
- Base: 기본 애니메이션 포즈입니다.
- Additive: 기본 위에 레이어링될 포즈입니다.
- 속성
속성 유형 설명 Weight 숫자 기본에 적용되는 부가적 포즈의 강도를 결정합니다. - 이벤트 데이터
- 이벤트 처리: 노드는 기본 및 부가적 입력 모두에서 이벤트를 수신합니다.
- 이벤트 방출: 기본 및 부가적 입력의 모든 이벤트는 변경 없이 통과합니다.
빼기

애니메이션을 부가적 포즈로 변환하여 대상 포즈에서 상대 기본 포즈를 빼냅니다(). Weight는 빼기 전에 B 포즈를 스케일링합니다(클램프되지 않음).
- 입력
- A: 대상 애니메이션 포즈입니다.
- B: 빼낼 상대 기본 포즈입니다.
- 속성
속성 유형 설명 Weight 숫자 B 포즈가 A에서 빼지기 전에 스케일링합니다. 1.0(기본값)에서 B는 완전히 빼지고, 0.0에서는 빼기가 발생하지 않습니다. - 이벤트 데이터
- 이벤트 처리: 노드는 Input A 및 Input B 모두에서 이벤트를 수신합니다.
- 이벤트 방출: Input A 및 Input B의 모든 이벤트는 변경 없이 통과합니다.
Blend1D

단일 축에서 현재 입력 위치에 가장 가까운 두 애니메이션 포즈 간에 선형 보간을 수행합니다.
- 입력
- Input1...InputN
- Position (숫자): 블렌드 축에서 각 후속 입력에 대한 특정 좌표입니다.
- 속성
속성 유형 설명 Position 숫자 애니메이션을 샘플링하는 데 사용되는 블렌드 축의 현재 활성 값입니다. Position이 정의된 입력 위치의 범위를 벗어나면 노드는 가장 가까운 두 입력을 사용하여 외삽합니다. PhaseSync Enum.AnimationNodePhaseSync 자식 입력의 타이밍을 동기화할지 여부를 구성합니다.
- 동기화(기본값): 정규화된 동기화. 노드는 활성 입력의 가중 평균을 기반으로 "가상 지속 시간"을 계산합니다. 각 입력 노드의 시간 단계가 조정되어 모든 자식이 동일한 단계로 수렴하여 서로 다른 길이의 애니메이션이 동기화됩니다.
- 비동기화: 클립이 독립적으로 자신의 재생 속도로 진행되는 표준 블렌딩입니다.
- 이벤트 데이터
- 이벤트 처리: 노드는 현재 활성 자식 노드의 모든 이벤트를 수신합니다.
- 이벤트 방출: 가장 높은 가중치의 활성 입력에서만 이벤트가 전파되며, 해당 블렌드 가중치로 스케일링됩니다. 보조 입력의 이벤트는 침묵합니다.
Blend2D

2D 좌표 공간 내에서 두 입력 매개변수를 기반으로 여러 애니메이션 포즈를 혼합합니다. 이는 Blend1D 노드를 일반화하여 이동 방향과 속도를 동시에 기반으로 혼합하는 복잡한 시나리오를 처리합니다.
- 입력
- Input1...InputN
- X (숫자): 각 후속 입력에 대한 X 좌표입니다.
- Y (숫자): 각 후속 입력에 대한 Y 좌표입니다.
- 속성
속성 유형 설명 InputMode Enum.AnimationNodeBlend2DInputMode 블렌드 공간을 평가하는 데 사용되는 좌표계를 정의합니다:
- 카르테시안(기본값): 표준 2D 그리드 좌표를 사용합니다. X와 Y는 블렌드 공간 내의 현재 위치를 나타냅니다.
- 극좌표: 각도 및 크기 값을 사용합니다. X는 라디안으로 방향을 나타내고, Y는 이동의 크기 또는 강도를 나타냅니다. 방향은 크기보다 더 큰 비중을 두므로, 유사한 각도에서 서로 다른 크기의 입력이 서로 다른 각도에서 입력보다 더 부드럽게 혼합됩니다.
X 숫자 현재 X 좌표(카르테시안) 또는 방향(극좌표)입니다. Y 숫자 현재 Y 좌표(카르테시안) 또는 크기(극좌표)입니다. PhaseSync Enum.AnimationNodePhaseSync 자식 입력의 타이밍을 동기화할지 여부를 구성합니다.
- 동기화(기본값): 정규화된 동기화. 노드는 활성 입력의 가중 평균을 기반으로 "가상 지속 시간"을 계산합니다. 각 입력 노드의 시간 단계가 조정되어 모든 자식이 동일한 단계로 수렴하여 서로 다른 길이의 애니메이션이 동기화됩니다.
- 비동기화: 클립이 독립적으로 자신의 재생 속도로 진행되는 표준 블렌딩입니다.
- 이벤트 데이터
- 이벤트 처리: 노드는 현재 활성 자식 노드의 모든 이벤트를 수신합니다.
- 이벤트 방출: 가장 높은 가중치의 활성 입력에서만 이벤트가 전파되며, 해당 블렌드 가중치로 스케일링됩니다. 보조 입력의 이벤트는 침묵합니다.
마스크

입력 포즈에 미리 정의된 마스크를 적용합니다. 마스크는 리그 계층 구조의 각 객체(예: 관절)에 대한 가중치로 정의되어 애니메이션의 정밀한 제어 또는 "페더링"을 가능하게 합니다.
- 입력
- Pose: 마스킹할 애니메이션 포즈입니다.
- 속성
속성 유형 설명 Mask ObjectValue 마스크 가중치를 정의하는 ObjectValue(마스크 AnimationNodeDefinition의 직접 자식으로 생성됨)입니다. 두 가지 방식으로 작동할 수 있습니다:
- 직접: ObjectValue 자체가 리그 객체 이름을 특정 가중치 값에 매핑하는 속성을 포함합니다.
마스크를 생성할 때 리그 스키마(HumanoidRigDescription 또는 픽커)를 선택하여 계층 구조를 채울 수 있습니다.
- HumanoidRigDescription: 인간 캐릭터에 대한 마스크를 표준화합니다.
- 픽커: 사용자가 작업 공간에서 특정 리그를 선택하여 마스크 계층 구조를 채울 수 있도록 합니다.
Invert 부울 true일 때 가중치 값을 1 - weight로 적용합니다. 이를 통해 새 자산을 생성하지 않고도 마스크를 반대로 재사용할 수 있습니다. - 이벤트 데이터
- 이벤트 처리: 노드는 입력 포즈의 모든 이벤트를 수신합니다.
- 이벤트 방출: 입력 포즈의 모든 이벤트는 변경 없이 통과합니다.
속도

들어오는 애니메이션 포즈의 재생 속도를 수정합니다.
- 입력
- Pose: 재생 속도가 수정될 애니메이션 포즈 또는 서브 그래프입니다.
- 속성
속성 유형 설명 Speed 숫자 시간 델타()에 적용되는 배수입니다. 0.0은 그래프를 일시 정지하고, 1.0은 정상 속도이며, 2.0은 두 배 속도입니다. - 이벤트 데이터
- 이벤트 처리: 노드는 입력 포즈의 이벤트를 수신합니다.
- 이벤트 방출: 입력 포즈의 모든 이벤트는 변경 없이 통과합니다. 시각적 재생 속도가 변경되는 동안 방출된 이벤트(예: 마커)의 타이밍은 수정된 재생 속도에 따라 조정됩니다.
그래프 출력

그래프의 최종 평가된 포즈를 나타냅니다. 이 노드는 애니메이션 그래프 편집기의 모든 새 그래프에 자동으로 포함됩니다. 이 노드의 존재는 그래프가 항상 유효하며 일관되게 애니메이션 포즈를 생성하도록 보장합니다.
- 입력
- Pose: 리그에 적용될 최종 처리된 애니메이션 데이터입니다.
- 속성
- 없음
- 이벤트 데이터
- 이벤트 처리: 노드는 최종 연결된 입력에서 통과된 모든 이벤트를 수신합니다.
- 이벤트 방출: 이 노드는 애니메이션 파이프라인의 종료 지점 역할을 하며 그래프 내로 신호를 방출하지 않습니다.
전환
애니메이션 그래프의 여러 노드(예: 선택, 우선 선택, 시퀀스, 랜덤 시퀀스)는 활성 입력 간 전환 시 애니메이션이 혼합되는 방식을 관리합니다. 노드 참조에서 중복을 방지하기 위해 이러한 동작은 표준화된 전환 속성 그룹으로 정의됩니다.
기본 전환

노드가 새 활성 입력으로 전환될 때 적용되는 기본 혼합 동작입니다.
- DefaultTransitionDuration (숫자): 새 포즈로 완전히 혼합되는 데 걸리는 시간(초 단위)입니다.
- DefaultTransitionCurve (Enum.PoseEasingStyle): 혼합 중에 적용되는 완화 함수입니다. 현재 Enum.PoseEasingStyle.Linear 및 Enum.PoseEasingStyle.CubicV2만 지원합니다.
전환 재정의
기본 전환을 초과하는 입력별 링크 속성입니다. 이러한 속성은 노드가 특정 입력으로 전환될 때 적용됩니다.
- TransitionOverrideDuration (숫자): 기본 전환 지속 시간을 재정의합니다.
- TransitionOverrideCurve (Enum.PoseEasingStyle): 기본 전환 곡선을 재정의합니다. 현재 Enum.PoseEasingStyle.Linear 및 Enum.PoseEasingStyle.CubicV2만 지원합니다.
복제
애니메이션 그래프 매개변수 및 내부 노드 상태는 자동으로 복제됩니다. 복제 모드는 애니메이션 스크립트가 생성될 때 Workspace.AuthorityMode에 의해 결정됩니다:
- Enum.AuthorityMode.Automatic: AnimationTrack:SetParameter()를 통해 설정된 매개변수는 자동으로 다른 피어에 복제됩니다.
- Enum.AuthorityMode.Server: 서버가 전체 그래프 시뮬레이션을 구동합니다. Enum.AnimationNodeType.ClipNode의 경과 시간과 같은 모든 노드 상태 및 그래프 매개변수는 서버에서 클라이언트로 자동으로 복제됩니다. 소유 플레이어의 클라이언트는 부드러운 로컬 재생을 위해 예측을 사용합니다.
샘플 애니메이트 스크립트
리그의 애니메이션 그래프를 구동하기 위한 예제 스크립트를 생성하려면 애니메이션 그래프 편집기에서 그래프 -> 애니메이트 스크립트 생성을 사용합니다. 이는 StarterCharacterScripts(플레이어 캐릭터의 경우) 또는 리그에 직접 배치된 스크립트 계층 구조를 생성합니다:
Animate (ModuleScript)
├── RunClient (LocalScript)
└── RunServer (Script, RunContext = Legacy)애니메이트 ModuleScript는 그래프 로딩 논리를 포함합니다. RunClient 및 RunServer 스크립트는 적절한 컨텍스트에서 이를 호출합니다. 포함되는 스크립트는 사용 사례에 따라 다릅니다:
| 사용 사례 | 포함된 스크립트 | 동작 |
|---|---|---|
| NPC (모든 모드) | RunServer | 서버가 그래프를 로드하고 재생합니다. 상태는 자동으로 모든 클라이언트에 복제됩니다. |
| 플레이어 + Enum.AuthorityMode.Server | RunServer + RunClient | 서버가 권한을 가지고 그래프를 구동합니다. 소유 클라이언트는 롤백 기반 로컬 예측을 위해 Enum.PredictionMode를 활성화합니다. |
| 플레이어 + Enum.AuthorityMode.Automatic | RunClient | 소유 클라이언트가 그래프를 로드하고 재생합니다. 매개변수는 서버 및 다른 클라이언트에 자동으로 복제됩니다. |
다음 속성은 애니메이트 스크립트에 저장되며 동작을 구성합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
| GraphName | 문자열 | 애니메이션 그래프 자산의 이름입니다. |
| CharacterName | 문자열 | 그래프가 대상으로 하는 리그의 이름입니다. |
| SourceAssetId | 문자열 | 그래프의 게시된 자산 ID입니다. 게시된 게임에서 런타임에 사용됩니다. |
| IsServerAuthority | 부울 | Workspace.AuthorityMode가 Server로 설정되어 스크립트가 생성되었는지 여부입니다. 복제 전략을 결정합니다. |
| PreviewInStudio | 부울 | true일 때(기본값), Studio 플레이 테스트는 게시되지 않은 그래프를 로컬로 로드하여 게시하지 않고 반복할 수 있습니다. Studio에서 게시된 자산을 테스트하려면 false로 설정합니다. 현재 Enum.AuthorityMode.Server에서는 지원되지 않습니다. |
자동 모드에서의 매개변수 복제
Workspace.AuthorityMode가 자동일 때:
- 소유 클라이언트가 플레이어 캐릭터 그래프를 구동하고, 서버가 NPC 그래프를 구동합니다.
- AnimationTrack:SetParameter()를 통해 설정된 매개변수는 자동으로 다른 피어에 복제됩니다. 단일 프레임 내에서 여러 SetParameter 호출은 합쳐집니다(마지막 작성자가 이긴다).
- 매개변수 전송을 위한 추가 스크립팅이 필요하지 않습니다. 엔진이 내부적으로 복제를 처리합니다.
- 다른 클라이언트는 매개변수 업데이트를 약간의 지연(하나의 전송 간격 및 네트워크 대기 시간)으로 봅니다.
서버 권한
Workspace.AuthorityMode가 서버일 때:
- 서버가 모든 그래프에 대해 권한을 가집니다. 시뮬레이션을 실행하고 전체 그래프 상태를 복제합니다.
- 복제되는 것: 경과 시간, 현재 선택, 전환 진행, 루프 수 및 RNG 시드를 포함한 매개변수 및 내부 노드 상태. 이를 통해 모든 클라이언트가 동일한 애니메이션 동작을 볼 수 있습니다.
- 플레이어 캐릭터: 서버가 그래프를 구동합니다. 소유 클라이언트의 RunClient 스크립트는 자동으로 Enum.PredictionMode를 Animator에서 활성화하므로 로컬 플레이어는 부드럽고 예측된 애니메이션을 보고 서버와의 불일치 시 조정됩니다.
- NPC: 서버가 그래프를 독점적으로 구동합니다. 클라이언트는 복제된 상태를 관찰하며 로컬 시뮬레이션이 없습니다.
매개변수 구동
그래프를 실행하는 모든 스크립트에서 AnimationTrack:SetParameter()를 사용하십시오:
- 플레이어 캐릭터가 Enum.AuthorityMode.Server인 경우: RunServer와 RunClient 모두에서 SetParameter를 호출합니다. 서버는 권한 있는 시뮬레이션을 구동하기 위해 매개변수가 필요하고, 소유 클라이언트는 로컬 예측을 구동하기 위해 동일한 매개변수가 필요합니다.
- 플레이어 캐릭터가 Enum.AuthorityMode.Automatic인 경우: RunClient(또는 AnimationTrack에 접근할 수 있는 모든 클라이언트 LocalScript에서)에서 SetParameter를 호출합니다.
생성된 애니메이트 스크립트에는 시작점으로서 주석 처리된 SetParameter 블록이 포함되어 있습니다. 이를 주석 해제하고 수정하여 게임 플레이 상태(이동 속도, 인간형 상태, 입력 방향 등)에서 매개변수를 구동하십시오.