애니메이션 그래프 편집기

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

애니메이션 그래프 편집기는 Roblox Studio 내에서 기술 아티스트와 애니메이터가 복잡한 애니메이션 논리를 직접 구축할 수 있게 해주는 시각적 노드 기반 도구입니다. 블렌드 트리와 같은 동작을 생성하기 위한 간소화된 인터페이스를 제공하여, 캐릭터 모션을 위한 전통적인 수동 스크립팅 의존도를 제거합니다.

이 시스템은 기존 애니메이션 워크플로우와 함께 작동합니다:

  • 애니메이션 편집기: 개별 클립을 작성하고 키프레임 및 곡선을 세밀하게 조정하는 주요 도구로 애니메이션 편집기를 계속 사용하세요.
  • 애니메이션 그래프 편집기: 이 새로운 작업 공간을 사용하여 이러한 클립을 정리하고 정교한 게임 플레이 동작을 유도하는 논리 트리로 구성하세요.

협업을 강화하기 위해 설계된 시각적 그래프는 개발자가 애니메이터가 생성한 논리를 신속하게 검사, 디버깅 및 이해할 수 있게 해줍니다. 아티스트가 상호 작용하는 모션을 다듬는 동안, 개발자는 여전히 애니메이션 그래프 노드에 프로그램적으로 접근하여 블렌드된 애니메이션 및 상태에 대한 직접적인 제어를 할 수 있습니다.

그래프 구축


애니메이션이 가능한 캐릭터를 위한 논리 구축을 시작하려면, Studio 리본의 아바타 탭을 통해 애니메이션 그래프 편집기에 접근하세요. 다음 단계에서는 기본 걷기 및 손 흔들기 애니메이션을 사용하여 리그를 초기화하고 기본 노드 네트워크를 구성하는 방법을 보여줍니다.

실제 애플리케이션에 대한 깊은 이해를 위해, 애니메이션 그래프 참조 파일을 탐색할 수 있으며, 이는 기본 및 복잡한 구현 예제를 포함하고 있습니다.

자신만의 애니메이션 그래프를 만들려면, 참조에서 제공된 기본 예제와 유사하게 다음 단계를 사용하세요:

  1. Studio에서 아바타 탭으로 이동하여 애니메이션 가능한 리그를 추가하고 캐릭터내 아바타를 선택합니다.

    스튜디오 툴바에서 강조된 캐릭터 버튼.
  2. 아바타 탭에서 그래프 편집기로 이동하여 애니메이션 그래프 편집기를 엽니다.

    스튜디오 툴바에서 표시된 애니메이션 그래프 편집기.
  3. 3D 뷰포트에서 애니메이션 가능한 리그를 선택하고 그래프 생성을 선택합니다.

  4. 그래프 편집기에서 오른쪽 클릭하고 클립을 선택합니다.

    우클릭 메뉴의 노드 목록
  5. 새 클립 노드에서 애니메이션 ID를 설정합니다.

    1. 애니메이션 ID 드롭다운을 선택합니다.

    2. 특정 애니메이션 자산 ID를 제출하려면 가져오기를 클릭합니다.

      애니메이션 ID 추가를 위해 애니메이션 가져오기 모듈의 필드 표시
    3. 애니메이션 ID 필드에 기본 걷기 애니메이션을 추가합니다: 507777826.

    4. 가져오기를 선택합니다.

  6. 기본 손 흔들기 애니메이션: 507770239를 사용하여 단계를 4-5 반복하여 또 다른 클립 노드를 추가합니다.

    채워진 애니메이션 ID와 함께 있는 두 개의 클립 노드
  7. 그래프 편집기에서 오른쪽 클릭하고 추가를 선택합니다.

    추가 노드
  8. 클립 노드를 추가 노드에 연결합니다. 상단 오른쪽의 출력 커넥터를 적절한 포트로 드래그합니다:

    1. 걷기 애니메이션의 클립 노드를 베이스 포트에 연결합니다.
    2. 손 흔들기 애니메이션의 클립 노드를 가감 포트에 연결합니다.
    추가 노드에 연결된 두 개의 클립 노드
  9. 추가 노드에서 상단 오른쪽 출력 커넥터를 그래프 출력 포즈 포트에 연결합니다.

    최종 출력 노드에 연결된 모든 노드
  10. (선택 사항) Speed 변수에 매개변수를 할당합니다.

    1. 초록색 Speed 포트를 비어있는 영역으로 클릭하고 드래그합니다. 새로운 매개변수 노드가 표시됩니다.

      클립 노드의 Speed 포트에서 커넥터 클릭 및 드래그
    2. 그래프 편집기 왼쪽 상단에서 매개변수 창을 사용하여 노드의 매개변수를 빠르게 수정합니다. 또한 프로그램적으로 이 접근할 수 있습니다.

      매개변수 창, 매개변수 노드 및 공유 값이 표시된 클립 노드.
  11. 재생 버튼을 눌러 애니메이션을 테스트합니다.

    애니메이션 미리보기를 위한 재생 버튼 아이콘
  12. 다양한 웨이트, 속도, 재생 모드 및 다른 애니메이션을 테스트해 보세요. 개별 노드에 대한 자세한 정보는 노드 참조를 참조하세요.

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 자산에 대한 참조입니다. 이는 그래프 내에서 리프 노드로 기능하며, 다른 노드에 블렌딩, 선택 또는 수정하기 위한 원시 애니메이션 데이터를 생성합니다.

입력
  • 없음
속성
속성유형설명
클립자산 ID재생할 애니메이션 자산 (예: rbxassetid://12345).
재생 모드Enum.AnimationNodePlayMode

클립이 기간을 끝내고 난 후의 동작을 정의합니다.

  • 루프 (기본값): 클립이 끝나면 자동으로 처음부터 다시 시작합니다.
  • 핑퐁: 시작부터 끝까지 재생한 후 즉시 반대 방향으로 다시 시작합니다.
  • 한 번 재생하고 유지: 한 번 재생하고 완료 후 최종 포즈를 유지합니다.
  • 한 번 재생하고 리셋: 한 번 재생하고 완료 후 초기 시작 포즈로 스냅합니다.
리버스부울재생 방향을 제어합니다.
속도숫자재생 속도에 곱해지는 비율입니다. 0.0은 그래프를 일시 중지하고, 1.0은 정상 속도이며, 2.0은 두 배 속도입니다.
트리밍부울클립의 기간을 잘라야 하는지를 전환합니다.
트리밍 시작숫자재생이 시작되어야 할 절대 타임스탬프(초 단위)입니다.
트리밍 종료숫자재생이 종료되어야 할 절대 타임스탬프(초 단위)입니다.
이벤트 데이터
  • 이벤트 처리: 없음. 이것은 자식이 없는 리프 노드입니다.
  • 이벤트 발행: 애니메이션 클립에 내장된 사용자 지정 마커를 읽고 (예: "발자국", "무기 휘두르기") 이들이 발생하는 정확한 프레임에서 명명된 이벤트로 발행합니다. 클립이 잘리면 정의된 [트리밍 시작, 트리밍 종료] 인터벌 내의 마커만 발행됩니다.

선택

선택 노드

선택 속성을 통해 임의의 입력 중에서 선택합니다. 현재 선택이 변경될 때마다 새로운 전환을 트리거합니다.

입력
  • Input1...InputN
속성
속성유형설명
선택문자열선택할 입력의 고유 ID로, 입력 연결의 이름과 일치합니다 (예: "Walk").
이벤트 데이터
  • 이벤트 처리: 현재 선택된 입력에서 수신된 이벤트가 웨이트 변경 없이 통과됩니다.
  • 이벤트 발행: 현재 선택된 입력에서 수신된 모든 이벤트만 통과됩니다. 전환 중에는 이벤트 발행이 글로벌 이벤트 규칙을 따릅니다.

우선 순위 선택

우선 순위 선택 노드

위에서 아래로 연결된 입력 목록을 평가하고 조건이 true로 평가되는 첫 번째 입력을 재생합니다. 이는 특정 논리에 기반한 계층 애니메이션 선택을 허용합니다. 현재 선택이 변경될 때마다 새로운 전환을 트리거합니다.

입력
  • Input1...InputN
    • Trigger (부울): 이 입력이 활성화되기 위해 true여야 하는 논리 조건입니다. 현재 버전에서는 이것이 불리언 매개변수에 연결되어 있습니다.
    • 중단 가능 (Enum.AnimationNodeInterruptible): 이 활성 애니메이션이 우선 순위가 높은 입력 의해 중단될 수 있는 규칙을 정의합니다.
      • 항상 (기본값): 이 입력은 언제든지 우선 순위가 높은 조건에 의해 중단될 수 있습니다.
      • 완료됨: 현재 애니메이션이 재생을 완료해야 우선 순위가 높은 입력이 인수됩니다.
      • 트리거: 입력은 InterruptibleTrigger가 true로 설정되어 있을 때만 중단 가능합니다.
    • InterruptibleTrigger (부울): InterruptibleTrigger로 설정된 경우에만 사용 가능합니다. 이 특정 표현이 true일 때만 중단할 수 있습니다.
속성
속성유형설명
DefaultInterruptibleEnum.AnimationNodeInterruptible모든 입력에 적용되는 기본 중단 규칙입니다. 각 입력은 자신의 Interruptible 입력 속성으로 이를 오버라이드할 수 있습니다.
DefaultInterruptibleTrigger부울입력의 결정된 Interruptible 모드가 Trigger일때 사용되는 기본 트리거 값입니다. 각 입력은 자신의 InterruptibleTrigger 입력 속성으로 이를 오버라이드할 수 있습니다.
이벤트 데이터
  • 이벤트 처리: 현재 선택된 입력에서 수신된 이벤트가 웨이트 변경 없이 통과됩니다.
  • 이벤트 발행: 현재 선택된 입력에서 수신된 모든 이벤트만 통과됩니다. 전환 중에는 이벤트 발행이 글로벌 이벤트 규칙을 따릅니다.

시퀀스

시퀀스 노드

정의된 대기 조건에 따라 특정 순서로 연결된 입력을 활성화합니다. 현재 선택이 변경될 때마다 새로운 전환을 트리거합니다.

입력
  • Input1...InputN
    • WaitFor (Enum.AnimationNodeWaitFor): 시퀀스가 다음 입력에 진행되기 위해 충족해야 할 조건을 지정합니다.
      • 완료됨 (기본값): 현재 입력이 한 사이클을 완료할 때 다음 입력으로 진행합니다. 진행 동작은 연결된 입력에 따라 다릅니다:
        • 한 번 재생하는 클립: 클립이 완료되면 진행합니다.
        • 루프 클립: 한 전체 루프가 완료되면 진행합니다.
        • 무한 루프가 있는 시퀀스: 모든 입력을 통해 한 전체 사이클이 완료된 후 진행합니다.
        • 루프가 있는 시퀀스: 모든 루프가 완료된 후 진행합니다.
      • 트리거: 사용자 정의 논리 표현이 true로 평가되면 다음 입력을 활성화합니다.
    • WaitForTrigger (부울): WaitForTrigger로 설정된 경우에만 사용 가능합니다.
속성
속성유형설명
루프 수숫자전체 시퀀스를 순환하는 횟수 (기본값은 1). 값이 0이면 무한 루프를 나타냅니다. 카운트가 도달하면 노드는 최종 입력의 루프 또는 유지 설정을 존중합니다.
기본 대기 조건Enum.AnimationNodeWaitFor모든 입력에 적용되는 기본 대기 조건입니다. 각 입력은 자신의 WaitFor 입력 속성으로 이를 오버라이드할 수 있습니다.
이벤트 데이터
  • 이벤트 처리: 현재 활성 입력에서 수신된 이벤트가 웨이트 변경 없이 통과됩니다.
  • 이벤트 발행: 시퀀스 내에서 현재 활성 입력에서 수신된 모든 이벤트만 통과됩니다. 전환 중에는 이벤트 발행이 글로벌 이벤트 규칙을 따릅니다.

랜덤 시퀀스

랜덤 시퀀스 노드

연결된 입력 중 하나를 임의로 선택하고 재생합니다. 현재 선택된 애니메이션이 완료되면 노드는 재생할 다른 입력을 무작위로 선택합니다. 각 입력에 특정 웨이트를 할당하여 선택 확률에 영향을 줄 수 있습니다. 현재 선택이 변경될 때마다 새로운 전환을 트리거합니다.

입력
  • Input1...InputN
    • 웨이트 (숫자): 이 입력이 선택될 확률을 결정합니다; 높은 웨이트는 선택 확률을 증가시킵니다.
속성
속성유형설명
재생 수숫자노드가 멈추기 전에 재생할 입력 수입니다. 이 수에 도달하면 노드는 최종 입력의 루프 또는 유지 설정을 존중합니다. 기본값은 0으로 무한입니다.
시드숫자난수 생성기(RNG)를 초기화하는 데 사용되는 값으로, 서로 다른 클라이언트 간에 시퀀스가 일관성을 유지하도록 합니다. 기본값은 무작위 시드를 위해 -1입니다.
이벤트 데이터
  • 이벤트 처리: 현재 활성 입력에서 수신된 이벤트가 웨이트 변경 없이 통과됩니다.
  • 이벤트 발행: 시퀀스 내에서 현재 활성 입력에서 수신된 모든 이벤트만 통과됩니다. 전환 중에는 이벤트 발행이 글로벌 이벤트 규칙을 따릅니다.

오버

오버 노드

오버 포즈를 기본 포즈 위에 레이어합니다. 마스크 노드와 결합하면 오버 포즈에서 마스킹된 관절이 완전히 기본 포즈를 드러내어 투명한 오버레이 효과를 생성합니다.

입력
  • 기본: 배경 또는 하위 레이어, 일반적으로 보행 또는 대기 상태와 같은 전신 애니메이션입니다.
  • 오버: 기본 위에 적용될 전경 또는 상위 레이어, 예를 들어 손 제스처 또는 도구 사용 애니메이션입니다.
속성
속성유형설명
웨이트숫자오버 포즈를 감쇠하는 데 사용되는 블렌드 웨이트입니다. 기본값은 1.0 (전면 오버라이드)로 제한이 없습니다.
이벤트 데이터
  • 이벤트 처리:
    • 이 노드는 기본오버 입력에서 수신된 이벤트를 청취합니다.
  • 이벤트 발행:
    • 기본 이벤트: 기본 입력의 모든 이벤트가 변경되지 않고 통과됩니다.
    • 오버 이벤트: 오버 입력의 이벤트가 웨이트 속성에 의해 스케일됩니다.
      • 웨이트가 0.5일 때, 오버 이벤트는 반으로 스케일됩니다.
      • 웨이트가 0일 때, 이벤트가 침묵합니다.

추가

추가 노드

특정 웨이트 (제한이 없는)를 사용하여 가감 포즈를 기본 포즈에 추가합니다.

입력
  • 기본: 주요 애니메이션 포즈입니다.
  • 가감: 기본에 레이어링될 포즈입니다.
속성
속성유형설명
웨이트숫자기본에 적용된 추가 포즈의 강도를 결정합니다.
이벤트 데이터
  • 이벤트 처리: 노드는 기본가감 입력에서 수신된 이벤트를 들여옵니다.
  • 이벤트 발행: 기본 및 가감 입력에서 수신된 모든 이벤트가 변경되지 않고 통과됩니다.

빼기

빼기 노드

애니메이션을 애드리티브 포즈로 변환하기 위해 상대 기본 포즈를 타겟 포즈에서 빼서 (ABA - B) 생성합니다. 결과는 특정 웨이트 (제한이 없는)로 감쇠됩니다.

입력
  • A: 타겟 애니메이션 포즈입니다.
  • B: 빼야 할 상대 기본 포즈입니다.
속성
속성유형설명
웨이트숫자결과에 적용되는 감쇠 효과의 강도를 결정합니다.
이벤트 데이터
  • 이벤트 처리: 노드는 입력 A입력 B 양쪽에서 수신된 이벤트를 들여옵니다.
  • 이벤트 발행: 입력 A 및 입력 B 양쪽에서 수신된 모든 이벤트가 변경되지 않고 통과됩니다.

블렌드1D

블렌드1D 노드

단일 축에서 현재 입력 위치에 가장 가까운 두 애니메이션 포즈 간에 선형 보간을 수행합니다.

입력
  • Input1...InputN
    • Position (숫자): 블렌드 축에서 각 후속 입력에 대한 특정 좌표입니다.
속성
속성유형설명
Position숫자애니메이션을 샘플링하는 데 사용되는 블렌드 축에서 현재 활성 값입니다. Position이 정의된 입력 위치의 범위를 벗어나면 노드는 가장 가까운 두 입력을 사용하여 외삽합니다.
PhaseSyncEnum.AnimationNodePhaseSync

자식 입력의 타이밍을 동기화할지를 설정합니다.

  • 동기화됨 (기본값): 정규화된 동기화. 노드는 활성 입력의 가중 평균에 따라 "가상 지속 시간"을 계산합니다. 모든 자식의 타임 스텝은 동일한 단계에 집합되도록 조정되어 서로 다른 길이의 애니메이션이 일치하게 유지됩니다.
  • 비동기화됨: 클립이 독립적으로 자신의 재생 속도를 업데이트합니다.
이벤트 데이터
  • 이벤트 처리: 노드는 현재 활성 자식 노드에서 수신된 모든 이벤트를 경청합니다.
  • 이벤트 발행: 가장 높은 웨이트의 활성 입력에서만 이벤트가 전파되며, 블렌드 웨이트에 의해 스케일됩니다. 보조 입력의 이벤트는 침묵합니다.

블렌드2D

블렌드2D 노드

2D 좌표 공간 내 두 개의 입력 매개변수를 기반으로 다수의 애니메이션 포즈를 혼합합니다. 이것은 블렌드1D 노드를 일반화하여 이동 방향과 속도를 동시에 혼합하는 복잡한 시나리오를 처리할 수 있습니다.

입력
  • Input1...InputN
    • X (숫자): 각 후속 입력을 위한 X좌표.
    • Y (숫자): 각 후속 입력을 위한 Y좌표.
속성
속성유형설명
입력 모드Enum.AnimationNodeBlend2DInputMode

블렌드 공간을 평가하는 데 사용되는 좌표계를 정의합니다:

  • 데카르트 (기본값): 표준 2D 격자 좌표를 사용합니다. X 및 Y는 블렌드 공간 내의 현재 위치를 나타냅니다.
  • 극좌표: 각도 및 크기 값을 사용합니다. X는 라디안으로 방향을 나타내고, Y는 이동의 크기 또는 강도를 나타냅니다. 방향이 크기보다 더 중요한 가중치를 가지므로 유사한 각도의 입력이지만 크기가 다른 경우 더 매끄럽게 혼합됩니다.
X숫자현재 X좌표(데카르트) 또는 방향(라디안)(극좌표).
Y숫자현재 Y좌표(데카르트) 또는 크기(극좌표).
PhaseSyncEnum.AnimationNodePhaseSync

자식 입력의 타이밍을 동기화할지를 설정합니다.

  • 동기화됨 (기본값): 정규화된 동기화. 노드는 활성 입력의 가중 평균에 따라 "가상 지속 시간"을 계산합니다. 모든 자식 노드의 타임 스텝은 동일한 단계에 집합되도록 조정되어 서로 다른 길이의 애니메이션이 일치하게 유지됩니다.
  • 비동기화됨: 클립이 독립적으로 자신의 재생 속도를 업데이트합니다.
이벤트 데이터
  • 이벤트 처리: 노드는 현재 활성 자식 노드에서 수신된 모든 이벤트를 경청합니다.
  • 이벤트 발행: 가장 높은 웨이트의 활성 입력에서만 이벤트가 전파되며, 블렌드 웨이트에 의해 스케일됩니다. 보조 입력의 이벤트는 침묵합니다.

마스크

마스크 노드

입력 포즈에 미리 정의된 마스크를 적용합니다. 마스크는 리그 계층 구조의 각 객체(예: 관절)에 대한 웨이트로 정의되어 애니메이션의 정밀한 제어 또는 "페더링"을 가능하게 합니다.

입력
  • 포즈: 마스킹된 애니메이션 포즈입니다.
속성
속성유형설명
마스크ObjectValue

마스크 웨이트를 정의하는 ObjectValue (마스크 AnimationNodeDefinition의 직접 자식으로 생성됨). 두 가지 방법 중 하나로 기능할 수 있습니다:

  • 직접: ObjectValue 자체가 리그 객체 이름을 특정 웨이트 값에 매핑하는 속성을 포함합니다.
  • 참조에 의한: ObjectValue는 매핑 속성을 포함하는 또 다른 Instance를 참조합니다. 이는 그래프 내의 여러 노드 간에 공유된 마스크를 허용합니다.

마스크를 생성할 때, 계층을 채우기 위해 리그 스키마 (HumanoidRigDescription 또는 픽커)를 선택할 수 있습니다.

  • HumanoidRigDescription: 인간 캐릭터에 대한 마스크를 표준화합니다.
  • 픽커: 사용자가 작업 공간에서 특정 리그를 선택하여 마스크 계층 구조를 채울 수 있도록 허용합니다.
반전부울true인 경우, 웨이트 값을 1 - 웨이트로 적용합니다. 이를 통해 새로운 자산을 생성하지 않고 반대로 마스크를 재사용할 수 있습니다.
이벤트 데이터
  • 이벤트 처리: 노드는 입력 포즈에서 수신된 모든 이벤트를 청취합니다.
  • 이벤트 발행: 입력 포즈에서 수신된 모든 이벤트가 변경되지 않고 통과됩니다.

속도

속도 노드

들어오는 애니메이션 포즈의 재생 속도를 수정합니다.

입력
  • 포즈: 재생 속도가 수정될 애니메이션 포즈 또는 서브그래프입니다.
속성
속성유형설명
속도숫자시간 델타(dtdt)에 적용되는 곱합니다. 0.0은 그래프를 일시 중지하고, 1.0은 정상 속도이며, 2.0은 두 배 속도입니다.
이벤트 데이터
  • 이벤트 처리: 노드는 입력 포즈에서 수신된 이벤트를 들여옵니다.
  • 이벤트 발행: 입력 포즈에서 수신된 모든 이벤트가 변경되지 않고 통과됩니다. 시각적 재생 속도가 변경되지만, 발행된 이벤트(예: 마커)의 타이밍은 수정된 재생 속도에 따라 비례하여 조정됩니다.

그래프 출력

그래프 출력 노드

그래프의 최종 평가된 포즈를 나타냅니다. 이 노드는 애니메이션 그래프 편집기 내에서 모든 새로운 그래프에 자동으로 포함됩니다. 이 노드의 존재는 그래프가 항상 유효하며 일관된 애니메이션 포즈를 생산하도록 보장합니다.

입력
  • 포즈: 리그에 적용될 최종 처리된 애니메이션 데이터입니다.
속성
  • 없음
이벤트 데이터
  • 이벤트 처리: 최종 연결된 입력을 통해 전달된 모든 이벤트를 청취합니다.
  • 이벤트 발행: 이 노드는 애니메이션 파이프라인의 출구 역할을 하며 그래프에 신호를 다시 발행하지 않습니다.

전환

애니메이션 그래프의 여러 노드(예: 선택, 우선 순위 선택, 시퀀스, 랜덤 시퀀스)는 활성 입력 간 전환될 때 애니메이션이 혼합되는 방법을 관리합니다. 노드 참조의 중복성을 방지하기 위해 이러한 동작은 표준화된 전환 속성 그룹에 의해 정의됩니다.

기본 전환

기본 전환

노드가 새로운 활성 입력으로 전환될 때 적용되는 기본 혼합 동작입니다.

전환 오버라이드

기본 전환을 초과하는 입력별 링크 속성입니다. 이들은 노드가 특정 입력으로 전환될 때 적용됩니다.

복제

애니메이션 그래프 매개변수는 각 AnimationTrack에 로컬적이며 자동으로 복제되지 않습니다. 이는 향후 업데이트에서 변경될 수 있지만, 현재 추천되는 접근 방식은 다음과 같습니다:

  • 클라이언트 → 서버: 소유 클라이언트에서 서버로 정해진 틱 비율로 매개변수를 전송하기 위한 RemoteEvent입니다.
  • 서버 → 다른 클라이언트: 모든 클라이언트에 자동으로 복제되는 인스턴스 속성입니다.

플레이어 캐릭터

클라이언트 스크립트는 플레이어 캐릭터를 구동합니다. 현재의 게임 상태(이동 입력, 인간형 상태 등)는 오직 소유 클라이언트만 알고 있으므로, 매개변수는 소유 클라이언트에서 서버로 그리고 모든 다른 클라이언트로 흐르는 방식으로 이루어져야 합니다.

설정

StarterCharacterScripts 아래에서:

  • 클라이언트 측 애니메이션 및 매개변수 구동을 위한 LocalScript를 생성합니다.
  • 서버 측 복제를 위한 Script를 생성합니다.
  • 클라이언트-서버 통신을 위한 RemoteEvent를 생성합니다.

클라이언트 스크립트

소유 클라이언트는 게임 플레이 이벤트에서 매개변수를 구동하여 주기적으로 서버로 전송합니다. 다른 클라이언트는 서버 스크립트에서 복제된 속성을 읽습니다.


local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- 애니메이션 그래프 로드
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- 자신의 게시된 그래프 ID로 교체
local track = animator:LoadAnimation(animation)
track:Play()
local isLocalCharacter = Players:GetPlayerFromCharacter(character) == Players.LocalPlayer
if not isLocalCharacter then
-- 서버 스크립트에서 복제된 매개변수 읽기
local animateServer = script.Parent:WaitForChild("AnimateServer")
for attribute, value in animateServer:GetAttributes() do
track:SetParameter(attribute, value)
end
animateServer.AttributeChanged:Connect(function(attribute)
track:SetParameter(attribute, animateServer:GetAttribute(attribute))
end)
return
end
-- 로컬 플레이어: 게임 플레이에서 매개변수 구동
local params = {}
local function setParam(key, value)
track:SetParameter(key, value)
params[key] = value
end
-- 예제: 인간형 상태에서 매개변수 구동
humanoid.Running:Connect(function(speed)
setParam("Speed", speed)
setParam("State", if speed < 0.1 then "Idle" else "Moving")
end)
-- 고정 틱 비율로 서버에 매개변수 전송
local replicateEvent = script.Parent:WaitForChild("ReplicateEvent")
local TICK_RATE = 1 / 20
local lastSendTime = 0
RunService.Stepped:Connect(function(gameTime)
if gameTime - lastSendTime > TICK_RATE then
lastSendTime = gameTime
replicateEvent:FireServer(params)
end
end)

서버 스크립트

소유 클라이언트에서 매개변수를 수신하고 서버 측 애니메이션 그래프를 구동하며, 다른 클라이언트에게 복제를 위해 속성으로 값을 전파합니다.


local Players = game:GetService("Players")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- 서버에서 동일한 애니메이션 그래프 로드
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- 클라이언트와 동일한 그래프 ID
animation.Parent = script
local track = animator:LoadAnimation(animation)
track:Play()
-- 소유 클라이언트에서 매개변수를 수신하고 속성을 통해 복제
local replicateEvent = script.Parent:WaitForChild("ReplicateEvent")
replicateEvent.OnServerEvent:Connect(function(player, params)
if Players:GetPlayerFromCharacter(character) ~= player then
return
end
for key, value in params do
track:SetParameter(key, value)
script:SetAttribute(key, value)
end
end)

NPC

서버가 NPC 애니메이션을 소유하므로 서버-클라이언트 복제만 필요합니다. 서버에서 애니메이션 그래프를 구동하고, 서버 스크립트에서 속성을 통해 매개변수를 작성하며, 클라이언트에서 같은 Instance.AttributeChanged 패턴을 사용하여 읽습니다.

지연

다른 클라이언트는 틱 간격(최대 20Hz에서 50ms)과 네트워크 지연을 더한 소량의 지연으로 애니메이션을 보게 됩니다. 틱 간격을 늘리면 더 높은 네트워크 트래픽의 대가로 틱 간격을 줄일 수 있습니다. 20Hz는 현명한 기본값이며 애니메이션 블렌딩은 소량의 지연이 알아차리기 어렵도록 관대합니다.

©2026 Roblox Corporation. Roblox 및 Roblox 로고, 'Powering Imagination'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.