UDN
Search public documentation:

AnimationNodesKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 애니메이션 > 애니메이션 노드
UE3 홈 > 애니메이터 > 애니메이션 노드

애니메이션 노드


문서 변경내역: Laurent Delayen 작성. 홍성진 번역.

개요


애님 트리 에디터에서 사용할 수 있는 모든 베이스 애니메이션 노드에 대한 참고서입니다. 애니메이션 노드는 언리얼 엔진 3 애니메이션 시스템에 대한 빌딩 블록입니다. 언리얼 엔진 3 의 애니메이션 시스템에 대한 좋은 입문서 Animation Overview KR 페이지가 있으니, 읽어 보지 않으신 분들께는 먼저 읽어 보시기를 권해 드립니다. 각 애니메이션 노드는 그 자체로서 완전한 블랙 박스로, 애니메이션 노드나 애니메이션 시퀸스에서 입력을 받은 다음 결과를 출력하는 것입니다.

애님트리 제작시 애니메이션 블렌딩 고려 방법


애니메이션 블렌드 노드는 애니메이터가 만드는 애니메이션 데이터를 사용하여 연산을 합니다. 즉 입력을 받아 본 트랜슬레이션과 로테이션을 트랜스폼한 다음 결과를 출력하는 것입니다. 그렇게 한 애니메이션 블렌드 결과를 다른 것에 사용할 수 있는 것입니다. 애니메이션 블렌드 노드는 애님트리의 오닝(owning) 액터 안에 포함된 데이터를 요청할 수도 있습니다. 이로써 애니메이터가 대부분의 인스턴스에서 돌아가는 애님트리를 빠르게 셋업할 수 있는 것입니다. 좀 더 복잡한 행위가 필요해 지면 프로그래머가 끼어들어 복잡성을 더하면 되는 것입니다.

애니메이션 노드


AnimationNodeTemplate.jpg

  1. 제목줄 - 애니메이션 노드의 프로퍼티 이름 및/또는 관련 정보를 표시합니다.
  2. 본문 - 입출력 링크에 관련된 이름을 표시합니다.
  3. 블렌드 슬라이더 - 현재 블렌드 비율을 비주얼 슬라이더로 표시합니다. 왼클릭후 좌우로 끌어 블렌딩 비율을 수동 조절할 수도 있습니다.
  4. 블렌드 정보 - 현재 블렌딩 비율을 수치로 나타냅니다.
  5. 출력 - 애니메이션 노드 연산 결과를 출력하는 링크입니다.
  6. 입력 - 애니메이션 노드가 사용할 값을 받아들이는 링크입니다.

애니메이션 노드 변경하기

애니메이션 노드의 입력 상자에 우클릭하면 이 맥락 메뉴가 뜹니다. (애니메이션 노드가 허용하는 한) 입력이 현재 가진 링크를 끊고, 입력 이름을 바꾸거나 입력을 삭제할 수도 있습니다.

AnimNodeContextOnInput.jpg

애니메이션 노드 자체에 우클릭하면 이 맥락 메뉴가 뜹니다. (애니메이션 노드가 허락하는 한) 입력을 추가할 수도, 기존의 모든 링크를 끊을 수도, 애니메이션 노드를 삭제할 수도, 애니메이션 노드를 클립보드로 복사할 수도, 이 애님트리 에디터 안의 애니메이션 노드를 복제할 수도, 클립보드에 있는 애니메이션 노드를 붙여넣을 수도 있습니다.

AnimNodeContextOnAnimNode.jpg

디폴트로 애니메이션 노드는 애니메이션 노드 클래스 이름을 제목줄에 설정합니다. "Anim Node" 프로퍼티 카테고리 안에 있는 Node Name 프로퍼티를 사용하여 바꿀 수도 있습니다. Node Name 은 언리얼스크립트에서 애니메이션 노드를 식별하는 데 사용되기도 하므로, 런타임에 애니메이션 노드를 리퍼런스하려면 애니메이션 노드에 고유한 이름을 지어 주시기 바랍니다. 그렇지만 않다면야 꼭 그럴 필요는 없긴 합니다.

AnimNodeCustomNodeName.jpg

언리얼스크립트 안의 애니메이션 노드 리퍼런스하기

YourActorClass.uc
var Name AnimNodeBlendListName;
var AnimNodeBlendList AnimNodeBlendList;
var array<AnimNodeBlendList> AllAnimNodeBlendLists;

/* 
 * 이 액터를 오너로 갖는 스켈레탈 메시 컴포넌트에 대한 애님트리를 초기화한 후 호출됩니다.
 * 액터가 변경하는 스켈레탈 콘트롤러 등으로의 리퍼런스를 캐시하기 좋은 곳입니다.
 */
event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  local AnimNodeBlendList LocalAnimNodeBlendList;

  if (SkelComp == None)
  {
    return;
  }
  
  if (AnimNodeBlendListName != '' && AnimNodeBlendListName  != 'None')
  {
    // 이름으로 애니메이션 노드 블렌드 목록을 검색합니다.
    AnimNodeBlendList = AnimNodeBlendList(SkelComp.FindAnimNode(AnimNodeBlendListName));
    if (AnimNodeBlendList == None)
    {
      `Warn("AnimNodeBlendList is none.");
    }
  }
  else
  {
    // 클래스로 애니메이션 노드 블렌드 목록을 검색합니다.
    ForEach SkelComp.AllAnimNodes(class'AnimNodeBlendList', LocalAnimNodeBlendList)
    {
      AllAnimNodeBlendLists.AddItem(LocalAnimNodeBlendList);
    }
  }
}

액터 소멸시 모든 애님 노드를 비워주지 않으면 가비지 콜렉팅되지 않습니다.

YourActorClass.uc
simulated event Destroyed()
{
  Super.Destroyed();
  
  AnimNodeBlendList = None;
  AllAnimNodeBlendLists.Length = 0;
}

애님트리 오너십

애님트리 오너십에 대한 짧은 노트입니다. 스켈레탈 메시 컴포넌트를 소유하는 액터, 애님트리를 인스턴싱한 것은 애님트리의 액터 오너입니다. 이 사실을 꼭 기억해 두셔야 하는데, 애님트리의 액터 오너에서 변수를 찾아보는 애니메이션 노드가 몇 있기 때문입니다.

카테고리 없음

AnimNodeAimOffset


게임에서 캐릭터가 쥔 무기의 방향을 플레이어가 조준하는 곳으로 맞추고 싶을 때가 있습니다. 폰은 피치나 롤 축이 아닌 요 축으로만 회전할 수 있는 콜리전 실린더로 정의되기 때문에, 단순히 폰을 회전시켜 플레이어의 조준에 맞추기는 어렵습니다. 심지어 캐릭터의 발은 제자리에 고정되어 있어야 하겠지요.

빨강 화살표는 빨강 콜리전 실린더로 나타나 있는 폰의 로테이션을 나타냅니다. 초록 화살표는 플레이어가 조준하는 곳을 나타냅니다. 그러면 조준 방향을 폰의 베이스 로테이션에서의 상대 로테이션으로 정의할 수 있습니다.

AnimNodeAimOffset 은 조준 오프셋이 없는 (총이 앞을 향하는) 애니메이션을 입력으로 받습니다. AnimNodeAimOffset 은 로테이션과 트랜슬레이션 오프셋 조합을 추가하여 여러 개의 본을 변경할 수 있습니다. 이러한 오프셋은 아홉 포즈로 정의됩니다:

  • Center Center - 애니메이션 포즈는 피치나 요 조절 없이 앞을 조준하고 있습니다.

AimOffsetCenterCenter.jpg

  • Center Up - 애니메이션 포즈는 요 조절 없이 위를 조준하고 있습니다.

AimOffsetCenterUp.jpg

  • Center Down - 애니메이션 포즈는 요 조절 없이 아래를 조준하고 있습니다.

AimOffsetCenterDown.jpg

  • Left Center - 애니메이션 포즈는 피치 조절 없이 왼쪽을 조준하고 있습니다.

AimOffsetLeftCenter.jpg

  • Left Up - 애니메이션 포즈는 왼쪽 위를 조준하고 있습니다.

AimOffsetLeftUp.jpg

  • Left Down - 애니메이션 포즈는 왼쪽 아래를 조준하고 있습니다.

AimOffsetLeftDown.jpg

  • Right Center - 애니메이션 포즈는 피치 조절 없이 오른쪽을 조준하고 있습니다.

AimOffsetRightCenter.jpg

  • Right Up - 애니메이션 포즈는 오른쪽 위를 조준하고 있습니다.

AimOffsetRightUp.jpg

  • Right Down - 애니메이션 포즈는 오른쪽 아래를 조준하고 있습니다.

AimOffsetRightDown.jpg

여기 아홉 포즈를 선형 보간으로 블렌딩합니다. 애니메이터가 조준이나 바라보기 등에 사용할 방향으로 메시 포즈를 취할 수 있는 것입니다. 트랜스폼은 액터 스페이스에서 이루어지는데, 로컬 본 로테이션이 조준 결과에 영향을 끼치지 못하게 하기 위해서입니다. 이렇게 하여 팔을 흔들며 달리면서도 정확히 조준하는 캐릭터를 만들 수 있는 것입니다.

AnimNodeOffsetAnimTree.jpg

  1. 애님트리 에디터 안의 AnimNodeAimOffset 입니다. 애니메이션 노드를 더블클릭하면 AimOffset 에디터가 뜹니다.
  2. 2D 드래그가능 슬라이더로 애님트리 에디터 내 뷰포트에서 실시간으로 AnimNodeAimOffset 블렌딩 결과를 확인할 수 있습니다.

AnimNodeOffsetEditor.jpg

AimOffset 에디터는 AnimNodeAimOffset 이 사용하는 AimOffset 프로파일을 저작하는 데 사용됩니다.

아홉 포즈는 본래 직사각형으로 정의됩니다. AnimNodeAimOffset 은 사용할 포즈를 알아내는 데 정규화된 상대적 조준 오프셋을 사용합니다. 범위는 X, Y 순으로 [-1, -1] 에서 [+1, +1] 까지입니다. 즉 [0,0] 조준은 그냥 Center Center 를 사용할 것이며, [+1,0] 은 Right Center, [+0.5,0] 는 Center CenterRight Center 의 중간쯤을 사용할 것입니다.

AimOffset 에디터 사용하기
에디터를 사용할 때 가장 먼저 할 일은 새 프로파일을 만드는 것입니다. Profile 섹션에서 "New" 를 클릭한 다음 프로파일 이름을 입력합니다. 노드마다 프로파일을 여럿 추가할 수 있으며, 삭제할 수도 있습니다. 위의 툴바에서 "Open" 과 "Save" 아이콘으로 프로파일을 임포트하고 저장할 수 있습니다.

프로파일을 생성하고 나면, 그 다음으로 영향을 끼칠 본을 선택합니다. AimOffset 에디터의 "Add Bone" 버튼에 클릭하면 됩니다. 선택된 본은 인덱스와 이름이 오름차순 정렬되어 표시됩니다.

관련된 본을 선택하고나서, 이들 각각에 대해 아홉 포즈용 오프셋을 수정할 수 있습니다. 본은 Bones 콤보 박스에서 이름을 클릭하여 선택합니다. 포즈는 Aim Direction 그룹에서 관련된 버튼을 클릭하여 선택합니다.

위의 Aim Direction 그룹은 수정중인 본 트랜슬레이션이나 본 로테이션 중 하나를 선택하기 위한 툴바입니다. 토글시키면 대화식 편집이 가능하도록 실시간 뷰포트에 적절한 위젯 기즈모가 표시됩니다. "World Space Widget" 체크 박스는 로컬/월드 스페이스 위젯 편집을 토글합니다. 필드 수정을 통해 숫자값을 직접 입력할 수도 있습니다.

애니메이션에서 오프셋 굽기
오프셋을 손으로 쳐 넣거나 위젯 기즈모를 사용하는 것 이외에, 애니메이션에서 오프셋을 뽑아낼 수도 있습니다. 그리 하려면 노드의 프로퍼티로 가서 Profiles 섹션을 펼친 다음 수정하려는 프로파일 인덱스를 선택합니다. 그러면 AnimName_XX, XX 는 아홉 방향에 해당하는 이름의 변수를 찾을 수 있을 것입니다. 거기에 사용하려는 애니메이션 이름을 설정하고 bBakeFromAnimations 프로퍼티를 토글합니다. 아홉 포즈 전부에 애니메이션을 할당할 필요는 없으나, 최소한 오프셋을 뽑아내는 데 사용되는 기준 포즈인 Center Center 는 해 줘야 합니다. bBakeFromAnimations 가 클릭되면 노드는 각 포즈와 기준 포즈간의 차이점에 따라 오프셋을 뽑아낼 것입니다.

AnimNodeAimOffset 파라미터
  • Aim
    • X - 정규화된 가로 조준 오프셋입니다.
    • Y - 정규화된 세로 조준 오프셋입니다.
  • 앵글 오프셋
    • X - 처리 전 Aim 에 덧붙일 가로 조준 오프셋입니다.
    • Y - 처리 전 Aim 에 덧붙일 세로 조준 오프셋입니다.
  • ForceAimDir - ForcedAimDir 을 사용하십시오. 안그러면 AimAngle Offset 에 따라 출력을 처리합니다.
  • Bake From Animations - 체크하면 오프셋은 애니메이션에서 구워집니다.
  • ForcedAimDir - 강제된 조준 포즈입니다.
  • Profiles
    • Profile Name - 프로파일 이름으로, AnimOffset 에디터에 의해 설정됩니다.
    • Horizontal Range
      • X - 최소 가로 조준입니다.
      • Y - 최대 가로 조준입니다.
    • Vertical Range
      • X - 최소 세로 조준입니다.
      • Y - 최대 세로 조준입니다.
    • Anim Name LU - 왼쪽 위를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
    • Anim Name LC - 왼쪽을 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
    • Anim Name LD - 왼쪽 아래를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
    • Anim Name CU - 위를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
    • Anim Name CC - 앞을 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
    • Anim Name CD - 아래를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
    • Anim Name RU - 오른쪽 위를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
    • Anim Name RC - 오른쪽을 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
    • Anim Name RD - 오른쪽 아래를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.

게임에서 노드 사용하기
이 노드를 사용하려면 프로그래머의 도움이 필요합니다. 코드의 각 노드를 리퍼런스하여 폰이 직접 정규화된 Aim 파라미터를 변경하게 하거나 해야 합니다.

참고로 애니메이션 노드를 리퍼런스하는 경우, 액터 소멸시 그 노드를 비워주지 않으면 가비지 콜렉팅되지 않을 것입니다.

또한 노드는 마지막 수정된 프로파일과 함께 저장됩니다. 언리얼스크립트 에서 SetActiveProfileByName()SetActiveProfileByIndex() (이름/인덱스로 활성 프로파일 설정)과 함께 다음 함수를 호출하면 게임플레이 도중 프로파일을 바꿀 수 있습니다.

이 코드 스니펫에서 플레이어의 폰을 바라보는 폰을 만드는 법을 확인할 수 있습니다.

YourPawnClass.uc
var(Pawn) float ViewYawMin;
var(Pawn) float ViewYawMax;
var(Pawn) float AimSpeed;

var  AnimNodeAimOffset AimNode;
var Rotator DesiredAim;
var Rotator CurrentAim;

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  AimNode = AnimNodeAimOffset(SkelComp.FindAnimNode('AimNode'));
}

simulated event Destroyed()
{
  Super.Destroyed();

  AimNode = None;
}

simulated function Tick(float DeltaTime)
{
  local PlayerController PlayerController;

  Super.Tick(DeltaTime);

  PlayerController = GetALocalPlayerController();
  if (PlayerController != None && PlayerController.Pawn != None && AimNode != None)
  {
    DesiredAim = Rotator(Normal(Location - PlayerController.Pawn.Location));

    DesiredAim.Pitch = Clamp(DesiredAim.Pitch, ViewPitchMin, ViewPitchMax);
    DesiredAim.Yaw = Clamp(DesiredAim.Yaw, ViewYawMin, ViewYawMax);
    
    if (DesiredAim != CurrentAim)
    {
      CurrentAim = RLerp(CurrentAim, DesiredAim, AimSpeed * DeltaTime, false);
    }

    // 피치 조절
    if (CurrentAim.Pitch < 0)
    {
      AimNode.Aim.Y = Abs(float(CurrentAim.Pitch) / ViewPitchMax);
    }
    else if (CurrentAim.Pitch > 0)
    {
      AimNode.Aim.Y = float(CurrentAim.Pitch) / ViewPitchMin;
    }
    else
    {
      AimNode.Aim.Y = 0.f;
    }

    // 요 조절
    if (CurrentAim.Yaw > 0)
    {
      AimNode.Aim.X = float(CurrentAim.Yaw) / ViewYawMax;
    }
    else if (CurrentAim.Yaw < 0)
    {
      AimNode.Aim.X = Abs(float(CurrentAim.Yaw) / ViewYawMin) * -1.f;
    }
    else
    {
      AimNode.Aim.X = 0.f;
    }
  }
}

simulated function SetWeapAnimType(EWeapAnimType AnimType)
{
  if (AimNode != None)
  {
    switch(AnimType)
    {
    case EWAT_Default:
      AimNode.SetActiveProfileByName('Default');
      break;

    case EWAT_Pistol:
      AimNode.SetActiveProfileByName('SinglePistol');
      break;

    case EWAT_DualPistols:
      AimNode.SetActiveProfileByName('DualPistols');
      break;

    case EWAT_ShoulderRocket:
      AimNode.SetActiveProfileByName('ShoulderRocket');
      break;

    case EWAT_Stinger:
      AimNode.SetActiveProfileByName('Stinger');
      break;
    }
  }
}

defaultproperties
{
}

무기 얼라인먼트 이슈
애님트리는 포워드 키네마틱스(Forward Kinematics, 정운동학)를 사용하여 애니메이션을 블렌딩하는데, 본 포지션이 중요한 보간에서는 문제가 생길 수 있습니다. 불행히도 무기 조준이 그렇습니다. 아래 그림은 포워드 키네마틱스(FK)와 인버스 키네마틱스(IK) 보간의 차이점을 나타내 주는데, 이 문제를 이해하는 데 꼭 필요합니다.

FK 를 사용하여 두 애니메이션을 블렌딩할 때, 본 로테이션이 보간됩니다. 무기 조준의 경우 이렇게 되면 양쪽 손의 얼라인먼트가 맞지 않게 됩니다. 이 문제를 돌아가는 방법은 여러가지 있습니다. 한 가지는 오른손에서의 고정 오프셋으로 왼손을 교정시키는 것인데, 오른손 얼라인먼트가 안맞는 문제가 남기는 합니다. 문제의 핵심은 양손의 최종 위치를 보간해 주고 거기서 팔 위치를 결정하여 양손 얼라인먼트가 맞게 하는 것입니다. 그렇게 하기 위해서 인버스 키네마틱스를 사용할 필요가 있는 것입니다.

퍼포먼스 때문에 조준 노드에는 내장된 IK 옵션이 제공되지 않는데, Aim 노드 하나 하나마다 값을 구하는 것이 꽤나 비싸기 때문입니다. 그러나 특정 스켈레톤 계층구조를 사용하면 이 문제를 해결할 수 있습니다. "IK 본"(루트 본의 직계 자손)을 만들어서 트랜슬레이션으로만 움직이고, 프레임마다 손 위치를 밀접하게 일치시키는 것입니다. 이제 다른 애니메이션이 블렌드될 때 손은 (로테이션을 사용하니) 디폴트로 FK 블렌딩을 사용하고, IK 본은 (트랜슬레이션을 사용하니) IK 를 사용합니다. (단순한 2 본 IK 솔버 본 콘트롤러인) SkelControlLimbsimple 와 요청에 따라 트리거시켜 주면, 의지대로 FK 와 IK 전환이 가능합니다. 본 콘트롤러는 일종의 포스트 프로세스 이펙트로 사용되는데, 트리에 있는 모든 Aim 노드에 대해서가 아니라 딱 한 번만 처리되는 것입니다.

AnimNodeBlend


두 입력을 블렌딩하는 단순한 블렌드 노드입니다. 원하는 블렌드 타겟과 최종 웨이트로 블렌드하는 데 몇 초가 걸리게 할 것인지를 지정할 수 있습니다.

AnimNodeBlend.jpg

프로퍼티
  • Skip Blend When Not Rendered 렌더되지 않을 때 블렌드 생략 - 스켈레탈 메시가 렌더되고 있지 않을 때 블렌드 명령을 생략합니다.

언리얼스크립트 함수
  • SetBlendTarget(float BlendTarget, float BlendTime) - 이 블렌드 노드에 바라는 균형을 설정합니다.
    • BlendTarget - 둘째 입력에 놓을 타겟 웨이트 양입니다. 이 값은 0.f 에서 1.f 사이의 값이 되어야 합니다.
    • BlendTime - 블렌드 타겟에 이르는 데 걸리는 시간입니다.

언리얼스크립트에서 사용하는 법
아래는 0.5 초의 블렌드 시간으로 Child 1 과 Child 2 를 블렌딩하는 법을 보여주는 예제입니다.

YourActorClass.uc
var AnimNodeBlend AnimNodeBlend;

simulated event Destroyed()
{
  Super.Destroyed();

  AnimNodeBlend = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  AnimNodeBlend = AnimNodeBlend(SkelComp.FindAnimNode('AnimNodeBlend'));
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (AnimNodeBlend == None)
  {
    return;
  }

  if (AnimNodeBlend.BlendTimeToGo <= 0.f)
  {
    AnimNodeBlend.SetBlendTarget((AnimNodeBlend.Child2Weight >= 1.f) ? 0.f : 1.f, 0.5f);
  }
}

defaultproperties
{
}

AnimNodeCrossfader


이 블렌드 노드는 스크립트 콘트롤을 통해 애님트리가 두 애니메이션을 교차 페이드할 수 있도록 만들어 줍니다. 전형적으로 사용되는 곳이라면 플레이어 idle(빈둥) 애니메이션 둘을 블렌딩하는 것입니다. 이 블렌드 노드는 입력으로 두 개의 AnimNodeSequence 가 필요하며, 다른 종류의 애니메이션 블렌드 노드는 연결할 수 없습니다.

AnimNodeCrossfader.jpg

프로퍼티
  • Default Anim Seq Name 디폴트 애님 시퀸 이름 - 스타트업시 재생할 디폴트 애니메이션 시퀸스입니다.

언리얼스크립트 함수
  • PlayOneShotAnim(name AnimSeqName, optional float BlendInTime, optional float BlendOutTime, optional bool bDontBlendOut, optional float Rate) - 일회성 애니메이션을 재생합니다.
    • AnimSeqName - 재생할 애니메이션 시퀸스 이름입니다.
    • BlendInTime - 현재 애니메이션에서 이(새) 애니메이션으로 블렌딩해 들어갈 시간입니다.
    • BlendOutTime - 이 애니메이션( 재생이 끝나기 전, 여기)에서 예전 애니메이션으로 블렌딩해 나갈 시간입니다.
    • bDontBlendOut - 참이면 애니메이션은 마지막 프레임에 얼어 예전 것으로 역 블렌딩되지 않습니다.
    • Rate - 애니메이션 재생 속도입니다.
  • BlendToLoopingAnim(name AnimSeqName, optional float BlendInTime, optional float Rate) - 루핑 애니메이션을 블렌드 인 합니다.
    • AnimSeqName - 재생할 애니메이션 시퀸스 이름입니다.
    • BlendInTime - 현재 애니메이션에서 이(새) 애니메이션으로 블렌드해 들어갈 시간입니다.
    • Rate - 애니메이션 재생 속도입니다.
  • GetAnimName() - 현재 재생중인 애니메이션의 이름을 반환합니다.
  • GetActiveChild() - 현재 활성인 AnimNodeSequence 를 반환합니다.

언리얼스크립트에서 사용하는 법
이 코드 스니펫은 LoopingAnimNames 에 정의된 두 가지 다른 루핑 애니메이션을 1/4 초 블렌드 시간으로 교차 페이드하는 법을 보여주고 있습니다.

YourActorClass.uc
var(Pawn) array<Name> LoopingAnimNames;
var AnimNodeCrossfader AnimNodeCrossfader;
var float NextBlendTime;

simulated event Destroyed()
{
  Super.Destroyed();

  AnimNodeCrossfader = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  AnimNodeCrossfader = AnimNodeCrossfader(SkelComp.FindAnimNode('AnimNodeCrossfader'));
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (AnimNodeCrossfader == None)
  {
    return;
  }

  if (WorldInfo.TimeSeconds >= NextBlendTime)
  {
    AnimNodeCrossfader.BlendToLoopingAnim(LoopingAnimNames[Rand(LoopingAnimNames.Length)], 0.25f, 1.f);
    NextBlendTime = worldInfo.TimeSeconds + 2.f;
  }
}

defaultproperties
{
}

AnimNodePlayCustomAnim


이 블렌드 노드는 애님트리 브랜치를 커스텀 애니메이션으로 덮어쓰는 코드 콘트롤을 내고 있습니다. 노멀 브랜치는 노멀 트리 브랜치, 예를 들면 상체 입니다. 커스텀 브랜치는 AnimNodeSequence 에 연결되어야 합니다. 그래야 블렌드 노드가 상체를 차지하여 여러가지 파라미터가 주어진 커스텀 애니메이션을 재생할 수 있는 것입니다.

AnimNodePlayCustomAnim.jpg

언리얼스크립트 함수
  • PlayCustomAnim(name AnimName, float Rate, optional float BlendInTime, optional float BlendOutTime, optional bool bLooping, optional bool bOverride) - 이 함수는 애니메이션을 재생합니다.
    • AnimName - 재생할 애니메이션 시퀸스 이름입니다.
    • Rate - 애니메이션 재생 속도입니다.
    • BlendInTime - 애니메이션 블렌드 인에 걸리는 초 입니다.
    • BlendOutTime - 애니메이션 블렌드 아웃에 걸리는 초 입니다.
    • bLooping - 애니메이션을 되풀이합니다.
    • bOverride - 같은 애니메이션을 다시 재생하라고 설정된 경우, 애니메이션을 다시 재생합니다. 그렇지 않은 경우, 같은 애니메이션 시퀸스를 재생하라 해도 아무 일도 벌어지지 않습니다.
  • PlayCustomAnimByDuration(name AnimName, float Duration, optional float BlendInTime, optional float BlendOutTime, optional bool bLooping, optional bool bOverride) - x 초 동안 애니메이션을 쉽게 재생할 수 있는 함수입니다.
    • AnimName - 재생할 애니메이션 시퀸스 이름입니다.
    • Duration - 이 애니메이션을 재생할 초 단위 기간입니다.
    • BlendInTime - 애니메이션 블렌드 인에 걸리는 초 입니다.
    • BlendOutTime - 애니메이션 블렌드 아웃에 걸리는 초 입니다.
    • bLooping - 애니메이션 되풀이 입니다.
    • bOverride - 같은 애니메이션을 다시 재생하라고 설정된 경우, 애니메이션을 다시 재생합니다. 그렇지 않은 경우, 같은 애니메이션 시퀸스를 재생하라 해도 아무 일도 벌어지지 않습니다.
  • StopCustomAnim(float BlendOutTime) - 현재 재생중인 애니메이션을 중지합니다.
    • BlendOutTime - 애니메이션 블렌드 아웃에 걸리는 초 입니다.
  • SetCustomAnim(Name AnimName) - 현재 재생 애니메이션을 다른 것으로 전환합니다.
    • AnimName - 애니메이션 시퀸스 이름입니다.
  • SetActorAnimEndNotification(bool bNewStatus) - OnAnimEnd() 이벤트를 켜거나 끕니다.
    • bNewStatus - 참이나 거짓이면 이벤트를 켜거나 끕니다.
  • GetCustomAnimNodeSeq() - 사용되고 있는 AnimNodeSequence 인스턴스를 반환합니다.
  • SetRootBoneAxisOption(optional ERootBoneAxis AxisX, optional ERootBoneAxis AxisY, optional ERootBoneAxis AxisZ) - 루트 모션 에 사용되는 루트 본 축을 설정합니다.
    • AxisX - X 축.
    • AxisY - Y 축.
    • AxisZ - Z 축.

언리얼스크립트에서 사용하는 법
이 코드 스니펫은 AnimNodePlayCustomAnim 노드 사용법을 보여줍니다. CustomAnimNames 에 정의된 임의의 애니메이션을 1/10 초 블렌드 인/아웃 시간을 두고 재생합니다. 같은 애니메이션이 다시 선택되도 다시 재생합니다.

YourActorClass.uc
var(Pawn) array<Name> CustomAnimNames;
var AnimNodePlayCustomAnim AnimNodePlayCustomAnim;

simulated event Destroyed()
{
  Super.Destroyed();

  AnimNodePlayCustomAnim = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  AnimNodePlayCustomAnim = AnimNodePlayCustomAnim(SkelComp.FindAnimNode('AnimNodePlayCustomAnim'));
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (AnimNodePlayCustomAnim == None)
  {
    return;
  }

  if (!AnimNodePlayCustomAnim.bIsPlayingCustomAnim)
  {
    AnimNodePlayCustomAnim.PlayCustomAnim(CustomAnimNames[Rand(CustomAnimNames.Length)], 1.f, 0.1f, 0.1f, false, true);
  }
}

defaultproperties
{
}

AnimNodeScalePlayRate


이 애니메이션 노드는 입력 애니메이션 재생 속도를 덮어쓰는 애님트리 콘트롤이 가능합니다. 이로써 한 곳에서 애니메이션 스케일을 조절할 수 있습니다.

AnimNodeScalePlayRate.jpg

프로퍼티
  • Scale By Value 값으로 스케일 - 백분율로 애니메이션 재생 스케일을 합니다.

언리얼스크립트에서 사용하는 법
이 예제는 애니메이션 재생 속도를 스케일하는 데 AnimNodeScalePlayRate 노드를 사용하는 법을 보여줍니다. 재생 속도는 사인형 재생 리듬을 내기 위해 Sin 을 사용하여 스케일합니다.

YourActorClass.uc
var(AnimTree) const Name ScalePlayRateAnimNodeName;
var(AnimTree) const float PlayRateOffset;

var AnimNodeScalePlayRate AnimNodeScalePlayRate;

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  if (ScalePlayRateAnimNodeName != '')
  {
    AnimNodeScalePlayRate = AnimNodeScalePlayRate(SkelComp.FindAnimNode(ScalePlayRateAnimNodeName));
  }
}

simulated event Destroyed()
{
  Super.Destroyed();
  AnimNodeScalePlayRate = None;
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);
  AnimNodeScalePlayRate.ScaleByValue = (Sin(WorldInfo.TimeSeconds + PlayRateOffset) + 1) * 0.5f;
}

defaultproperties
{
}

AnimNodeScaleRateBySpeed


이 애니메이션 노드는 오닝(owning) 액터의 속도 크기에 따라 입력 애니메이션 재생 속도를 덮어쓸 수 있도록 하는 기능을 애님 트리에 주는 노드입니다.

AnimNodeScaleRateBySpeed.jpg

프로퍼티
  • Base Speed 기본 속력 - 최종 속력을 구하는 데 사용할 기본 속력입니다. 예들 들면 이 값은 폰의 최대 속력에 해당하는 값, 디폴트로 600.f 일 것입니다. 속도의 크기아 600.f 면 재생속도는 1.f 또는 보통 속도가 됩니다. 속도의 크기가 300.f 면 재생 속도는 0.5f 또는 절반 속도일 것입니다.

언리얼스크립트에서 사용하는 법
이 코드 스니펫에는 남은 체력에 따라 GroundSpeed 를 조절하는 폰이 있습니다. 폰이 대미지를 입으면 더욱 느리게 움직이며, 애니메이션 재생도 느려집니다.
YourActorClass.uc
event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)
{
  Super.TakeDamage(Damage, InstigatedBy, HitLocation, Momentum, DamageType, HitInfo, DamageCauser);

  GroundSpeed = default.GroundSpeed * (float(Health) / float(HealthMax));
}

defaultproperties
{
}

AnimNodeSlot


마티네에서 사용할 수 있는 AnimNodeSlot 은 Matinee Anim Control Track KR 에서도 다루고 있습니다.

기본적으로 이 노드는 마티네나 언리얼스크립트 에서 그 입력을 하나 이상의 애니메이션으로 덮어쓸 수 있도록 해 주는 "슬롯"을 만듭니다.

이 노드의 목적은 꼭 애님트리 안에 있지 않은 것이어도 요청에 따라 애니메이션을 재생하는 것입니다. 코드로 트리거되는 (휴식 중지, 특수 이동, 근접 공격, 실행, 사망 등) 일회성 애니메이션이 최적의 예제입니다. 이로써 엄청난 수의 일회성/고유 애니메이션을 재생하면서도 애님트리의 크기를 적정선으로 유지할 수 있는 것입니다.

AnimNodeSlots 는 애디티브 애니메이션을 다루는 법을 압니다. 디폴트로는 애디티브 애니메이션을 Source 입력에 추가합니다. 그러나 애디티브 애니메이션을 보통의 애니메이션처럼 취급할 수도 있으며, (트리에 애디티브 데이터로만 취급되는 서브 브랜치를 만들고자 한다면) 스위치를 할 수도 있습니다. 그렇게 하려면 bAdditiveAnimationsOverrideSource (애디티브 애니메이션이 소스 덮어쓰기) 옵션을 참으로 설정해야 합니다.

AnimNodeSlot.jpg

프로퍼티
  • Early Anim End Notify 빠른 AnimEnd 노티파이 - 참이면 애니메이션 블렌딩 아웃 시작시 오닝 액터에서 OnAnimEnd 이벤트를 실행합니다. 블렌딩 아웃이 완전 끝날 때까지 기다리지 않고, 블렌딩 아웃 시작과 동시에 다른 애니메이션을 재생시킬 수 있으니, 보통 트랜지션과 블렌딩 감이 향상됩니다.
  • Skip Blend When Not Rendered 렌더되지 않을 때 블렌딩 생략 - 스켈레탈 메시가 보이지 않을 때 블렌딩하지 않습니다.
  • Additive Animations Override Source 애디티브 애니메이션이 소스 덮어쓰기 - 참이면 애디티브 애니메이션이 소스 입력을 덮어씁니다. 거짓이면 애디티브 애니메이션은 소스 입력에 더해집니다.

언리얼스크립트 함수
  • PlayCustomAnim(name AnimName, float Rate, optional float BlendInTime, optional float BlendOutTime, optional bool bLooping, optional bool bOverride, optional float StartTime, optional float EndTime)
    • AnimName - 재생할 애니메이션 이름입니다.
    • Rate - 애니메이션을 재생할 속도입니다.
    • BlendInTime - 애니메이션 블렌드 인 에 걸리는 초 입니다.
    • BlendOutTime - 애니메이션 블렌드 아웃에 걸리는 초 입니다.
    • bLooping - 애니메이션을 멈추라 하기 전까지 영원히 되풀이할지 입니다.
    • bOverride - 참으로 설정했을 때만 같은 애니메이션을 반복 재생합니다.
    • StartTime - 애니메이션을 언제 시작할지 입니다. (예로 애니메이션 2초 지점에서 시작)
    • EndTime - 애니메이션을 언제 끝낼지 입니다. (예로 애니메이션 4초 지점에서 종료)
  • PlayCustomAnimByDuration(name AnimName, float Duration, optional float BlendInTime, optional float BlendOutTime, optional bool bLooping, optional bool bOverride) - 위의 함수와 비슷하나, 애니메이션 재생 기간을 초 단위로 제어할 수 있다는 점이 다릅니다.
    • AnimName - 재생할 애니메이션 이름입니다.
    • Duration - 애니메이션을 재생할 초 단위 기간입니다.
    • BlendInTime - 애니메이션 블렌드 인 에 걸리는 초 입니다.
    • BlendOutTime - 애니메이션 블렌드 아웃에 걸리는 초 입니다.
    • bLooping - 애니메이션을 멈추라 하기 전까지 영원히 되풀이할지 입니다.
    • bOverride - 참으로 설정했을 때만 같은 애니메이션을 반복 재생합니다.
  • GetPlayedAnimation() - 현재 재생되는 애니메이션 이름이나 없으면 '' 를 반환합니다.
  • StopCustomAnim(float BlendOutTime) - 커스텀 애니메이션 재생을 중지합니다.
    • BlendOutTime - 애니메이션 블렌드 아웃에 걸리는 초 입니다.
  • SetCustomAnim(Name AnimName) - 현재 재생되는 애니메이션을 다른 것으로 전환합니다.
    • AnimName - 재생할 애니메이션 이름입니다.
  • SetActorAnimEndNotification(bool bNewStatus) - OnAnimEnd() 이벤트를 켜거나 끕니다.
    • bNewStatus - 참이나 거짓이면 이벤트를 켜거나 끕니다.
  • GetCustomAnimNodeSeq() - 현재 애니메이션 재생에 선택된 AnimNodeSequence 를 반환합니다.
  • SetRootBoneAxisOption(optional ERootBoneAxis AxisX, optional ERootBoneAxis AxisY, optional ERootBoneAxis AxisZ) - 커스텀 애니메이션 루트 본 옵션을 설정합니다.
    • AxisX - X 축.
    • AxisY - Y 축.
    • AxisZ - Z 축.
  • SetRootBoneRotationOption(optional ERootRotationOption AxisX, optional ERootRotationOption AxisY, optional ERootRotationOption AxisZ) - 커스텀 애니메이션 루트 로테이션 옵션을 설정합니다.
    • AxisX - Roll 축.
    • AxisY - Yaw 축.
    • AxisZ - Pitch 축.
  • AddToSynchGroup(name GroupName) - 이 애니메이션을 다른 것과 동기화시킵니다.
    • GroupName - 동기화 그룹 이름입니다.
  • TickChildWeights(float DeltaSeconds) - 자식 웨이트 관련 시간을 진전시킵니다.
    • DeltaSeconds - 자식 웨이트를 진전시킬 초 단위 시간입니다.

언리얼스크립트에서 사용하는 법
이 코드 스니펫은 예전 애니메이션 절반쯤에서 CustomAnimNames 에 정의된 랜덤 애니메이션을 재생하는 법을 보여줍니다. AnimNodeSlot 에 슬롯이 넘치는 한, 그 사이로 부드럽게 트윈할 수 있을 것입니다.
YourActorClass.uc
var(Pawn) array<Name> CustomAnimNames;
var AnimNodeSlot AnimNodeSlot;
var float NextAnimationTime;

simulated event Destroyed()
{
  Super.Destroyed();

  AnimNodeSlot = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  AnimNodeSlot = AnimNodeSlot(SkelComp.FindAnimNode('AnimNodeSlot'));
}

simulated event Tick(float DeltaTime)
{
  local float Duration;

  Super.Tick(DeltaTime);

  if (AnimNodeSlot == None)
  {
    return;
  }

  if (WorldInfo.TimeSeconds >= NextAnimationTime)
  {
    Duration = AnimNodeSlot.PlayCustomAnim(CustomAnimNames[Rand(CustomAnimNames.Length)], 1.f, 0.3f, 0.3f, false, true);
    NextAnimationTime = WorldInfo.TimeSeconds + (Duration * 0.5f);
  }
}

defaultproperties
{
}

AnimNodeSynch


AnimNodeSynch 노드는 이제 구식이 되어, (블렌드 트리의 루트 노드) 애님트리 노드에서 찾을 수 있는 AnimGroup 시스템으로 대체되었습니다. 자세한 것은 애니메이션 개요 페이지를 확인하시기 바랍니다. AnimNodeSynch 는 계속 작동하기는 하나 서포트가 중지될 예정이니 새 시스템으로 넘어가시는 것이 좋습니다.

아래 스크린샷은 애님트리에 새로운 애니메이션 그룹을 추가하는 법에 대한 데모입니다.

AnimNodeSynch.jpg

애니메이션 그룹 셋업을 마치면, 애니메이션 노드 시퀸스가 애니메이션 그룹 일부가 되도록 설정해 줘야 합니다.

AnimNodeSynchAnimNodeSequence.jpg

UDKAnimBlendByDriving / UTAnimBlendByDriving


이 노드는 오너가 비히클을 운전하고 있거나 비히클이 운전되고 있는 경우, 자동으로 'Driving' 브랜치로 블렌드해 갑니다.

AnimNodes_UDKAnimBlendByDriving.jpg

언리얼스크립트 함수
  • UpdateDrivingState() - 운전 상태를 강제 업데이트합니다. 애니메이션 블렌드가 현재 관련되어 있지 않아 tick 되지 않을 경우에 좋습니다.

UDKAnimBlendByHoverboardTilt / UTAnimBlendByHoverboardTilt


이 노드는 호버 보드 위에 있는 플레이어의 틸트 상태를 반영하기 위해 두 브랜치를 자동 블렌딩합니다.

AnimNodes_UDKAnimBlendByHoverboardTilt.jpg

프로퍼티
  • TiltScale 틸트 스케일 - 기울기 가중치 스케일입니다.
  • TiltDeadZone 틸트 데드 존 - 회전 세기가 이 값 아래면 노드는 'Flat' 브랜치로 블렌딩합니다.
  • TiltYScale 틸트 Y 스케일 - 틸트 각 계산에 사용되는 업 벡터 스케일입니다.

UDKAnimBlendByHoverboardTurn / UTAnimBlendByHoverboardTurn


이 노드는 호버 보드 위에 있는 플레이어의 회전 상태를 반영하기 위해 두 브랜치를 자동 블렌딩합니다.

AnimNodes_UDKAnimBlendByHoverboardTurn.jpg

프로퍼티
  • TurnScale 회전 스케일 - 회전 속도 스케일로, 결과 가중치 스케일입니다.
  • MaxBlendPerSec 최대 초당 블렌딩 - 최대 초당 블렌딩 변화량을 설정하여, 브랜치 블렌딩 빠르기를 조절합니다.

UDKAnimBlendBySpeed / UTAnimBlendBySpeed


이 노드는 스켈레탈 메시 컴포넌트의 오너 속도에 따라 'Slow' 와 'Fast' 를 자동으로 블렌딩합니다. AnimBlendBySpeed 의 단순화 버전입니다.

AnimNodes_UDKAnimBlendBySpeed.jpg

프로퍼티
  • MinSpeed 최소 속력 - 최소 속력으로, 이 이하의 속력에서 노드는 'Slow' 브랜치로 블렌딩합니다.
  • MaxSpeed 최대 속력 - 최대 속력으로, 이 이상의 속력에서 노드는 'Fast' 브랜치로 블렌딩합니다.

UDKAnimNodeCopyBoneTranslation / UTAnimNodeCopyBoneTranslation


이 노드는 애님트리가 다양한 무기 장착 스타일을 시뮬레이션할 수 있도록 하기 위해 본 이동을 자동으로 복사합니다. 이 노드는 AnimNodeAimOffset, UDKAnimNodeSeqWeap / UTAnimNodeSeqWeap, UDKAnimBlendByWeapType / UTAnimBlendByWeapType 과 함께 사용됩니다. 이 노드는 부착된 aim 노드에서 프로파일 변화를 감지한 다음, 연결된 모든 UDKAnimNodeSeqWeap / UTAnimNodeSeqWeap, UDKAnimBlendByWeapType / UTAnimBlendByWeapType 노드에 프로파일 변화를 업데이트합니다. 소스 본 트랜스폼을 대상 본 트랜스폼으로 복사하기도 합니다.

AnimNodes_UDKAnimNodeCopyBoneTranslation.jpg

프로퍼티
  • DefaultBoneCopyArray 디폴트 본 복사 배열 - 소스와 대상 본 이름 배열입니다.
    • SrcBoneName 소스 본 이름 - 본 트랜스폼을 구할 소스 본 이름입니다.
    • DstBoneName 대상 본 이름 - 본 트랜스폼을 구할 대상 본 이름입니다.
  • DualWieldBoneCopyArray 듀얼 장착 본 복사 배열 - AnimNodeAimOffset 프로파일 이름이 'DualPistols' 일 경우 사용할 소스와 대상 본 이름 배열입니다.
    • SrcBoneName 소스 본 이름 - 본 트랜스폼을 구할 소스 본 이름입니다.
    • DstBoneName 대상 본 이름 - 본 트랜스폼을 구할 대상 본 이름입니다.

UDKAnimNodeJumpLeanOffset / UTAnimNodeJumpLeanOffset


이 노드는 AnimNodeAimOffset 과 비슷한 식으로 작용하나, 다른 AnimNodeAimOffset 의 조준점을 그 방향으로 사용한다는 점이 다릅니다. 이 노드는 캐릭터가 점프하거나 떨어질 때 기울이는 방향이 올바르게 보이도록 하기 위해 보간 처리를 하는 데 사용됩니다.

AnimNodes_UDKAnimNodeJumpLeanOffset.jpg

프로퍼티
  • JumpLeanStrength Jump Lean 세기 - 'jump lean' 노드를 활성화시킬 양입니다.
  • MaxLeanChangeSpeed 최대 기울기 변화 속력 - 기울기를 얼마나 빨리 변화시킬지 입니다.
  • bMultiplyByZVelocity Z 속도 곱하기 - 내려올 때 기울기를 반전시킬지 입니다.
  • bDodging 회피 - 플레이어가 회피중일 경우 네이티브 코드에 의해 설정됩니다. 참이면 자체 프로파일을 ControllerName_DBLJUMP 로 변경합니다.
  • bDoubleJumping 더블 점프 - 플레이어가 더블 점프를 할 경우 네이티브 코드에 의해 설정됩니다. 참이면 자체 프로파일을 ControllerName_DODGE 로 변경합니다.

언리얼스크립트 함수
  • SetLeanWeight(float WeightTarget, float BlendTime) - 시간에 따라 기울기 블렌드 인 / 아웃 이 가능하도록 합니다.
    • WeightTarget 웨이트 타겟 - 바라는 웨이트 타겟입니다.
    • BlendTime 블렌드 시간 - 바라는 웨이트 타겟으로 블렌드해 들어가는 데 걸리는 초 단위 시간입니다.

언리얼스크립트에서 사용하는 방법
YourActorClass.uc
class ExampleUDKAnimNodeJumpLeanOffset extends Pawn
  placeable;

var UDKAnimNodeJumpLeanOffset UDKAnimNodeJumpLeanOffset;
var bool Flipper;

simulated event Destroyed()
{
  Super.Destroyed();

  UDKAnimNodeJumpLeanOffset = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  UDKAnimNodeJumpLeanOffset = UDKAnimNodeJumpLeanOffset(SkelComp.FindAnimNode('UDKAnimNodeJumpLeanOffset'));
  if (UDKAnimNodeJumpLeanOffset != None)
  {
    SetLeanWeight();
    SetTimer(1.f, true, NameOf(SetLeanWeight));    
  }
}

simulated event SetLeanWeight()
{
  if (UDKAnimNodeJumpLeanOffset != None)
  {
    UDKAnimNodeJumpLeanOffset.SetLeanWeight((Flipper) ? 0.f : 1.f, 0.2f);
    Flipper = !Flipper;
  }
}

defaultproperties
{
  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

필터

AnimNode_MultiBlendPerBone


이 블렌드 노드로는 자체적인 본별 블렌딩과 입력 소스를 갖는 마스크를 만들 수 있습니다. 몇 개의 마스크든 다양한 블렌드 웨이트로 합칠 수 있으며, 정한 규칙에 따라 자동으로 꺼지거나 켜지게 할 수도 있습니다. 그러나 꼭 그럴 필요는 없으며, 이 블렌드 노드는 언리얼스크립트를 사용하여 제어할 수도 있습니다. 이 블렌드 노드는 그 함수성을 하나의 블렌드 노드에 압축해 넣기만 한다면 노드 수를 줄여줍니다.

AnimNode_MultiBlendPerBone.jpg

프로퍼티
  • Mask List 마스크 목록 - 이 블렌드 노드에 대한 모든 마스크 목록입니다.
    • Branch List 브랜치 목록 - 본 이름과 주어진 마스크에 대해 지정된 웨이트 배열입니다.
      • Bone Name 본 이름 - 블렌딩을 적용할 본 이름입니다.
      • Per Bone Weight Increase 본별 웨이트 증가 - 이 본에 적용할 마스크 웨이트 비율입니다.
    • Desired Weight 희망 웨이트 - 이 마스크에 설정하기 바라는 웨이트입니다.
    • Blend Time To Go 남은 블렌드 시간 - 이 마스크를 블렌드 인 할때까지 몇 초나 남았나 입니다. 애님트리 에디터 안에서는 그리 쓸모가 없습니다.
    • Weight Rule List 웨이트 룰 목록 - 이 마스크를 자동으로 켜고 끄는 룰입니다.
      • Node Name 노드 이름 - 검사할 노드 이름입니다.
      • Weight Check 웨이트 검사 - 웨이트를 검사할 방법입니다.
      • Child Index 자식 인덱스 - 웨이트를 검사할 노드의 자식 인덱스입니다.
    • Weight Based On Node Rules 노드 룰에 따른 웨이트 - 웨이트 룰에 따라 이 마스크의 웨이트를 계산할지 입니다.
    • Disable For Non Local Human Players 로컬 휴먼 플레이어가 아니면 끄기 - 오너가 로컬 휴먼 플레이어가 아닌 경우, 이 브랜치를 무시합니다.
  • Rotation Blend Type 로테이션 블렌드 타입 - 로테이션 블렌딩 방법입니다.

언리얼스크립트 함수
  • SetMaskWeight(int MaskIndex, float DesiredWeight, float BlendTime) - 주어진 마스크의 웨이트를 제어합니다.
    • MaskIndex - 프로퍼티를 적용할 마스크의 인텍스입니다.
    • DesiredWeight - 마스크에 줄 웨이트입니다.
    • BlendTime - 마스크가 블렌드 인 할 초 단위 기간입니다.

언리얼스크립트에서 사용하는 법
YourActorClass.uc
var AnimNode_MultiBlendPerBone AnimNode_MultiBlendPerBone;
var float NextBlendTime;
var int PreviousMaskIndex;

simulated event Destroyed()
{
  Super.Destroyed();

  AnimNode_MultiBlendPerBone = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  AnimNode_MultiBlendPerBone = AnimNode_MultiBlendPerBone(SkelComp.FindAnimNode('AnimNode_MultiBlendPerBone'));
}

simulated event Tick(float DeltaTime)
{
  local int NewMaskIndex;

  Super.Tick(DeltaTime);

  if (AnimNode_MultiBlendPerBone == None)
  {
    return;
  }

  if (WorldInfo.TimeSeconds >= NextBlendTime)
  {
    AnimNode_MultiBlendPerBone.SetMaskWeight(PreviousMaskIndex, 0.f, 0.25f);
    NewMaskIndex = Rand(AnimNode_MultiBlendPerBone.MaskList.Length);
    AnimNode_MultiBlendPerBone.SetMaskWeight(NewMaskIndex, 1.f, 0.25f);
    PreviousMaskIndex = NewMaskIndex;

    NextBlendTime = worldInfo.TimeSeconds + 2.f;
  }
}

defaultproperties
{
}

AnimNodeBlendMultiBone


이 애니메이션 노드는 폐기되어 사용할 수 없습니다.

AnimNodeBlendPerBone


AnimNodeBlend 와 같으나, 두 개의 자식 애니메이션 블렌딩 방식에 있어서 본별 콘트롤만 가능합니다. 이 노드는 본질적으로 본별 마스크나 필터처럼 작동합니다. 예를 들어 Child 1 이 다리를 받고, Child 2 가 상체를 받습니다. BranchStartBoneName 배열은 Child 1 에서 마스크해 내려는 본 부모를 포함하고, Child 2 에서 받습니다. 위의 예제에서라면, 그 배열에 Spine1 본 이름을 넣으면 상체 전체를 처리할 것입니다.

AnimNodeBlendPerBone.jpg

프로퍼티
  • Force Local Space Blend 로컬 스페이스 강제 블렌드 - 참이면 블렌딩은 월드 스페이스가 아닌 로컬 스페이스에서 이루어집니다. 소스 입력에서 약간의 애니메이션을 보존하는데 도움이 될 수 있습니다.
  • Branch Start Bone Name 브랜치 시작 본 이름 - 블렌딩을 시작할 본(과 그 자식에게 영향을 끼치는) 이름 배열입니다. 스켈레톤의 여러 해체(disjointed) 부분에 영향을 끼치게 하려면 여기에 본 이름을 여럿 정의해도 됩니다.

언리얼스크립트 함수
  • SetBlendTarget(float BlendTarget, float BlendTime) - 블렌딩 타겟을 설정하여 본 이펙트를 블렌드 인/아웃 합니다.
    • BlendTarget - 블렌드 할 타겟입니다. 0 이나 1 중 하나가 되어야 합니다.
    • BlendTime - 블렌딩을 할 시간입니다.

언리얼스크립트에서 사용하는 법
YourActorClass.uc
var AnimNodeBlendPerBone AnimNodeBlendPerBone;
var float NextBlendTime;
var bool BlendToChildTwo;

simulated event Destroyed()
{
  Super.Destroyed();

  AnimNodeBlendPerBone = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  AnimNodeBlendPerBone = AnimNodeBlendPerBone(SkelComp.FindAnimNode('AnimNodeBlendPerBone'));
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (AnimNodeBlendPerBone == None)
  {
    return;
  }

  if (WorldInfo.TimeSeconds >= NextBlendTime)
  {
    BlendToChildTwo = !BlendToChildTwo;

    AnimNodeBlendPerBone.SetBlendTarget((BlendToChildTwo) ? 1 : 0, 0.25f);
    NextBlendTime = WorldInfo.TimeSeconds + 2.f;
  }
}

defaultproperties
{
}

UDKAnimBlendBySlotActive / UTAnimBlendBySlotActive


이 노드는 연결된 AnimNodeSlot 이 커스텀 애니메이션을 재생중이거나 현재 블렌드 시간이 0 초과일 경우에만 완젼히 Slot 노드로 블렌딩합니다. 이 블렌드 노드는 연결된 AnimSlot 이 애니메이션을 재생중인지 자동으로 검출하여, 그렇다면 거기에 자동으로 블렌딩해 들어가도록 AnimTree 설정을 하려는 경우 좋습니다. 프로그래머가 간단하게 AnimNodeSlot 이 애니메이션을 재생하도록, AnimTree 가 거기에 자동으로 블렌드해 들어갈 수 있도록 해 줍니다. 이 기능이 유용한 경우를 예로 들자면, 플레이어가 발동시킬 수 있는 감정 표현 재생의 경우입니다.

AnimNodes_UDKAnimBlendBySlotActive.jpg

UDKAnimBlendByWeapon / UTAnimBlendByWeapon


이 노드는 AnimFire 가 호출되었을 때 'Firing' 브랜치로 블렌드 인 합니다. 연결된 애니메이션 노드 시퀸스가 발사를 중지했을 때, bLooping 이 거짓으로 설정된 경우 AnimStopFire 가 호출되며, 그렇지 않은 경우 연결된 애니메이션 노드 시퀸스는 되풀이되는 애님 시퀸스로 바뀌어 반복 재생됩니다.

AnimNodes_UDKAnimBlendByWeapon.jpg

프로퍼티
  • Looping 되풀이 - 이 무기가 애님을 되풀이해서 재생하는지 입니다.
  • Looping Anim 되풀이 애님 - 설정되면 발사 애님이 완료된 이후, 발사 애님이 아닌 이 애님을 되풀이합니다.
  • Blend Time 블렌드 시간 - 애니메이션 블렌딩 시간입니다.

언리얼스크립트 함수
  • AnimFire(name FireSequence, bool bAutoFire, optional float AnimRate, optional float SpecialBlendTime, optional name LoopSequence = LoopingAnim) - 발사 시퀸스를 트리거하기 위해 호출합니다. 발사 애니메이션으로 블렌드해 들어갑니다. bAutoFire 가 지정되고 LoopSequence 가 'None' 이거나 지정되지 않은 경우, FireSequence 는 되풀이되며, 그 외의 경우 FireSequence 는 한 번만 재생하고 LoopSequence 가 그 이후 되풀이됩니다.
    • FireSequence - 일회성 발사에 사용할 애니메이션 시퀸스 이름입니다.
    • bAutoFire - bLoopting 은 이 값으로 설정됩니다.
    • AnimRate - 애니메이션 재생 속도입니다.
    • SpecialBlendTime - 설정하면 BlendTime 디폴트 값을 덮어씁니다.
    • LoopSequence - 되풀이에 사용할 애니메이션 시퀸스 이름입니다.
  • AnimStopFire(optional float SpecialBlendTime) - 발사 애니메이션에서 블렌드 아웃 합니다. 이 이벤트는 되풀이되지 않는 발사 애니메이션에서는 자동 호출되며, 그 외의 경우에는 직접 호출해 줘야 합니다.
    • SpecialBlendTime - 설정되면 BlendTime 디폴트 값을 덮어씁니다.

언리얼스크립트에서 사용하는 방법
YourActorClass.uc
class ExampleUDKAnimBlendByWeapon extends Pawn;

// 무기 발사 애니메이션 이름입니다.
var() const name FireSequenceName;
// 플레이어가 자동 발사 무기를 쥐고 있는지 입니다.
var() const bool IsWeaponAutoFire;
// 애니메이션 재생 속도입니다.
var() const float FirePlayRate;
// 발사 애니메이션에 대한 블렌드 시간 덮어쓰기 입니다.
var() const float FireBlendTime;
// 무기 발사 되풀이 애니메이션 이름입니다.
var() const name LoopingFireSequenceName;

var UDKAnimBlendByWeapon UDKAnimBlendByWeapon;

simulated event Destroyed()
{
  Super.Destroyed();

  UDKAnimBlendByWeapon = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  UDKAnimBlendByWeapon = UDKAnimBlendByWeapon(SkelComp.FindAnimNode('UDKAnimBlendByWeapon'));
  if (UDKAnimBlendByWeapon != None)
  {
    FireWeapon();
  }
}

simulated function FireWeapon()
{
  if (UDKAnimBlendByWeapon != None)
  {
    // 발사 애니메이션을 시작합니다.
    UDKAnimBlendByWeapon.AnimFire(FireSequenceName, IsWeaponAutoFire, FirePlayRate, FireBlendTime, LoopingFireSequenceName);
    // 1 초 후 발사 중지합니다.
    SetTimer(1.f, false, NameOf(StopFireWeapon));
  }
}

simulated function StopFireWeapon()
{
  if (UDKAnimBlendByWeapon != None)
  {
    // 발사 중지 애니메이션
    UDKAnimBlendByWeapon.AnimStopFire(FireBlendTime);
    // 0.5 초 후 발사를 재시작합니다.
    SetTimer(0.5f, false, NameOf(FireWeapon));
  }
}

defaultproperties
{
  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

UDKAnimBlendByWeapType / UTAnimBlendByWeaponType


이 노드는 라이플 이외의 것이 사용될 때 'Weapon' 브랜치로 블렌드 인 합니다. 이 노드는 UDKAnimNodeCopyBoneTranslation / UTAnimNodeCopyBoneTranslation 와 함께 사용되며, 그 노드가 바로 연결된 모든 UDKAnimBlendByWeapType / UTAnimBlendByWeaponType 노드를 업데이트합니다. 이름은 고정되어 변경할 수 없습니다.

AnimNodes_UDKAnimBlendByWeapType.jpg

애디티브

AnimNodeAdditiveBlending


이 블렌드 노드를 통해 애님트리가 애디티브 애니메이션 이나 애디티브 애니메이션 블렌드를 결합한 다음 Source 입력에 추가할 수 있습니다. 타겟 웨이트는 애디티브 애니메이션을 스케일합니다. 애디티브 애니메이션은 AnimNodeSlot 을 사용하여 직접 재생할 수도 있습니다.

AnimNodeAdditive.jpg

언리얼스크립트 함수
  • SetBlendTarget(float BlendTarget, float BlendTime) - 블렌드 타겟을 설정하여 본 이펙트를 블렌드 인/아웃 할 수 있습니다.
    • BlendTarget - 블렌딩할 대상입니다. 0 이나 1 이 되어야 합니다.
    • BlendTime - 블렌딩할 시간입니다.

언리얼스크립트에서 사용하는 법
YourActorClass.uc
var AnimNodeAdditiveBlending AnimNodeAdditiveBlending;
var float NextBlendTime;
var bool BlendToChildTwo;

simulated event Destroyed()
{
  Super.Destroyed();

  AnimNodeAdditiveBlending = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  AnimNodeAdditiveBlending = AnimNodeAdditiveBlending(SkelComp.FindAnimNode('AnimNodeAdditiveBlending'));
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (AnimNodeAdditiveBlending == None)
  {
    return;
  }

  if (WorldInfo.TimeSeconds >= NextBlendTime)
  {
    BlendToChildTwo = !BlendToChildTwo;

    AnimNodeAdditiveBlending.SetBlendTarget((BlendToChildTwo) ? 1 : 0, 0.25f);
    NextBlendTime = WorldInfo.TimeSeconds + 2.f;
  }
}

defaultproperties
{
}

블렌드 바이

AnimNodeBlendByBase


이 블렌드 노드는 오닝 액터가 무엇에 베이스를 두고 있는지에 따라 애님트리가 두 입력을 자동으로 블렌드할 수 있도록 만들어 줍니다. 캐릭터가 각기 다른 종류의 표면에 서 있을때 다른 방식으로 움직이게 하고픈 상황에 좋습니다.

AnimNodeBlendByBase.jpg

프로퍼티
  • Type
    • BBT_ByActorTag - 베이스가 된 액터의 태그를 필터로 사용합니다.
    • BBT_ByActorClass - 베이스가 된 액터의 클래스를 필터로 사용합니다.
  • Actor Tag - Based 입력에 블렌딩하기 위해 일치시켜야 할 태그입니다.
  • Actor Class - Based 입력에 블렌딩하기 위해 일치시켜야 할 클래스입니다.
  • Blend Time - 두 가지 다른 입력을 블렌딩할 시간입니다.

AnimNodeBlendByPhysics


이 블렌드 노드는 애님트리가 오닝 액터의 Physics 변수에 맞는 입력들을 자동으로 블렌딩할 수 있도록 해 줍니다. 캐릭터가 걸을 때, 떨어질 때, 수영할 때 등등마다 각기 다른 애니메이션을 주고자 할 때 좋습니다. 이 블렌드 노드는 자동입니다.

AnimNodeBlendByPhysics.jpg

AnimNodeBlendByPosture


이 블렌드 노드는 애님트리가 Standing, 서 있을 때와 Crouched, 웅크릴 때 두 입력 사이를 자동으로 블렌딩할 수 있도록 해 줍니다. 이 블렌드 노드는 딱 폰에만 도움이 됩니다.

AnimNodeBlendByPosture.jpg

언리얼스크립트에서 사용하는 법
이 코드 스니펫은 Pawn 클래스에서 AnimNodeBlendByPosture 를 사용하는 법을 보여줍니다. AnimNodeBlendByPosture 는 Pawn 안의 bIsCrouched 변수를 찾아보아 그 블렌딩 상태를 결정합니다.

YourPawnClass.uc
simulated function Tick(float DeltaTime)
{ 
  local PlayerController PlayerController;

  PlayerController = GetALocalPlayerController();
  if (PlayerController != None && PlayerController.Pawn != None)
  {
    ShouldCrouch(VSize(PlayerController.Pawn.Location - Location) <= 256.f);
  }
}

defaultproperties
{
  bCanCrouch=true
}

AnimNodeBlendByProperty


애님트리가 오닝 액터에 있는 네임드 변수를 가장 잘 나타내는 인풋끼리 자동으로 블렌딩할 수 있도록 해 주는 블렌드 노드입니다.
  • boolean 불리언 - 블렌드 노드는 딱 두 입력만 사용합니다. 불리언 프로퍼티가 거짓이면, 블렌드 노드는 첫 입력으로 블렌딩됩니다. 불리언 프로퍼티가 참이면, 블렌드 노드는 둘째 입력으로 블렌딩됩니다.
  • float 플로트 - 블렌드 노드는 딱 두 입력만 사용합니다. 그러면 플로트 프로퍼티는 두 입력끼리 블렌딩합니다. 블렌드 노드에 정의된 범위 밖의 플로트 값을 사용하지 마십시오.
  • byte 바이트 - 블렌드 노드는 원하는 만큼의 입력을 사용합니다. 불리언 타입과 많이 비슷하게 작동하며, 블렌드 노드는 상응하는 인덱스로 블렌딩됩니다. 바이트의 범위는 0 에서 255 까지입니다.

AnimNodeBlendByProperty.jpg

프로퍼티
  • Property Name 프로퍼티 이름 - 블렌드 노드가 오닝 액터(나 Use Owners Base 가 참인 경우 오닝 액터의 베이스) 안에서 찾아볼 변수 이름입니다.
  • Use Owners Base 오너의 베이스 사용 - 오닝 액터가 아니라 오닝 액터의 베이스에서 프로퍼티를 찾아보려면 체크합니다.
  • Use Specific Blend Times 특정 블렌드 시간 사용 - Blend Time 대신 Blend To Child 1Blend To Child 2 Time 을 사용합니다. 입력이 딱 둘만 있을 때 좋습니다.
  • Blend Time 블렌드 시간 - 각기 다른 인덱스끼리 전환할 때 사용할 블렌드 시간입니다. 프로퍼티가 플로트가 아닐 때 좋습니다.
  • Float Prop Min 플로트 프로퍼티 최소 - 플로트 프로퍼티를 사용할 때 사용할 최소 플로트 값입니다. 프로퍼티가 플로트일 때 좋습니다.
  • Float Pop Max 플로트 프로퍼티 최대 - 플로트 프로퍼티를 사용할 때 사용할 최대 플로트 값입니다. 프로퍼티가 플로트일 때 좋습니다.
  • Blend To Child 1 Time Child 1 로의 블렌드 시간 - Child 1 로 전환할 때 사용할 블렌드 시간입니다. 입력이 딱 둘만 있을 때 좋습니다.
  • Blend To Child 2 Time Child 2 로의 블렌드 시간 - Child 2 로 전환할 때 사용할 블렌드 시간입니다. 입력이 딱 둘만 있을 때 좋습니다.

언리얼스크립트에서 사용하는 법
불리언 변수에 대해 AnimNodeBlendByProperty 를 사용하는 법을 보여주는 코드 스니펫입니다. 불리언 변수 MyBlendProperty 는 AnimNodeBlendByProperty 가 2 초마다 Child 0 / Child 1 사이를 전환하도록 만듭니다. AnimNodeBlendByProperty 가 그 노드 이름으로 정의된 변수를 찾아보기에, 애니메이션 노드를 리퍼런스할 필요가 없습니다.

YourActorClass.uc
var bool MyBlendProperty;
var float NextBlendTime;

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (WorldInfo.TimeSeconds >= NextBlendTime)
  {
    MyBlendProperty = !MyBlendProperty;
    NextBlendTime = WorldInfo.TimeSeconds + 2.f;
  }
}

defaultproperties
{
}

이 코드 스니펫은 플로트 변수에 대해 AnimNodeBlendByProperty 를 사용하는 법을 보여줍니다. 플로트 변수 MyBlendProperty 는 AnimNodeBlendProperty 가 2 초간의 보간 시간을 사용하여 Child 0 / Child 1 사이를 보간하도록 만듭니다. 애니메이션 노드를 리퍼런스할 필요는 없는데, AnimNodeBlendByProperty 가 그 노드 이름으로 정의되는 변수를 찾아보기 때문입니다.

YourActorClass.uc
var float MyBlendProperty;

simulated event PostBeginPlay()
{
  Super.PostBeginPlay();
  IsBlendingDown();
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (IsTimerActive(NameOf(IsBlendingUp)))
  {
    MyBlendProperty = GetTimerCount(NameOf(IsBlendingUp)) / GetTimerRate(NameOf(IsBlendingUp));
  }
  else if (IsTimerActive(NameOf(IsBlendingDown)))
  {
    MyBlendProperty = 1.f - (GetTimerCount(NameOf(IsBlendingDown)) / GetTimerRate(NameOf(IsBlendingDown)));
  }
}

simulated function IsBlendingUp()
{
  SetTimer(2.f, false, NameOf(IsBlendingDown));
}

simulated function IsBlendingDown()
{
  SetTimer(2.f, false, NameOf(IsBlendingUp));
}

defaultproperties
{
}

이 코드 스니펫은 바이트 변수에 대해 AnimNodeBlendByProperty 를 사용하는 법을 보여줍니다. 바이트 변수 MyBlendProperty 는 AnimNodeBlendByProperty 가 2 초마다 Child 0 에서 Child 4 까지 순환하도록 만듭니다. 애니메이션 노드를 리퍼런스할 필요는 없는데, AnimNodeBlendByProperty 가 그 노드 이름으로 정의된 변수를 찾아보기 때문입니다.

YourActorClass.uc
var byte MyBlendProperty;
var float NextBlendTime;

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (WorldInfo.TimeSeconds >= NextBlendTime)
  {
    MyBlendProperty++;

    if (MyBlendProperty > 4)
    {
      MyBlendProperty = 0;
    }

    NextBlendTime = WorldInfo.TimeSeconds + 2.f;
  }
}

defaultproperties
{
}

AnimNodeBlendBySpeed


애님트리가 오닝 벡터 안의 Velocity 나 Acceleration 벡터의 크기에 따라 컨스트레인트 사이의 입력끼리 자동으로 블렌딩할 수 있도록 해 주는 블렌드 노드입니다. 컨스트레인트는 각 입력 사이의 바운드(범위)를 정의하는데, 이를테면 Constraints[0] 과 Constraints[1] 은 인덱스 0 에 대한 아래와 위 바운드를 정의하고, Constraints[1] 과 Constraints[2] 는 인덱스 1 에 대한 아래 바운드를 정의하고, 그런 식입니다. 이 바운드는 Blend Down Perc 값에 의해 변경되는데, 바운드를 엄격하게 유지하려는 경우 Blend Down Perc 를 0 으로 설정하십시오.

AnimNodeBlendBySpeed.jpg

프로퍼티
  • Blend Up Time 블렌드 업 시간 - 인덱스를 올라갈 때 블렌드를 얼마나 빠르게 할지 입니다.
  • Blend Down Time 블렌드 다운 시간 - 인덱스를 내려갈 때 블렌드를 얼마나 빠르게 할지 입니다.
  • Blend Down Perc 블렌드 다운 퍼센 - 컨스트레인트 바운드 어디쯤에서부터 블렌드 다운을 시작할지 입니다.
  • Constraints 컨스트레인트 - 각 인덱스에 대한 바운드를 정의하는 플로트 배열입니다. 0.f 에서 180.f 까지는 액터가 걷는 중, 180.f 에서 600.f 까지는 액터가 뛰는 중, 600.f 에서 1200.f 까지는 액터가 전력질주하는 중, 이런 식이 가능합니다.
  • Use Acceleration 가속도 사용 - 오닝 액터에 있는 속도 변수 보다는 가속도 변수를 사용합니다.
  • Blend Up Delay 블렌드 업 딜레이 - 인덱스를 블렌딩 업 하기 전에 줄 지연 시간입니다.
  • Blend Down Delay 블렌드 다운 딜레이 - 인덱스를 블렌딩 다운 하기 전에 줄 지연 시간입니다.

AnimNodeBlendList


애님트리가 입력끼리 블렌드할 수 있도록 해 주는 블렌드 노드입니다. 이 블렌드 노드는 언리얼스크립트와 함께 사용해야 합니다.

AnimNodeBlendList.jpg

프로퍼티
  • Play Active Child 활성 자손 재생 - 활성 자손 인덱스가 변경되면 어태치된 Anim Node Sequence 를 재생합니다.
  • Editor Active Child Index 에디터 활성 자손 인덱스 - 에디터 안에서 사용할 자손 인덱스입니다. 애님트리 에디터에서만 사용됩니다.

언리얼스크립트 함수
  • SetActiveChild(int ChildIndex, float BlendTime) - 활성 자손을 설정하여 각기 다른 자손끼리 블렌딩할 수 있도록 합니다.
    • ChildIndex - 블렌딩할 자손 인덱스입니다.
    • BlendTime - 블렌딩을 할 시간입니다.

언리얼스크립트에서 사용하는 법
YourActorClass.uc
var AnimNodeBlendList AnimNodeBlendList;

simulated event Destroyed()
{
  Super.Destroyed();

  AnimNodeBlendList = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  AnimNodeBlendList = AnimNodeBlendList(SkelComp.FindAnimNode('AnimNodeBlendList'));
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (AnimNodeBlendList == None)
  {
    return;
  }

  if (AnimNodeBlendList.BlendTimeToGo <= 0.f)
  {
    AnimNodeBlendList.SetActiveChild(Rand(AnimNodeBlendList.Children.Length), 0.25f);
  }
}

defaultproperties
{
}

UDKAnimBlendBase / UTAnimBlendBase


커스텀 스크립트 기반 블렌드 노드를 만드는데 사용할 수 있는 베이스 클래스입니다.

AnimNodes_UDKAnimBlendBase.jpg

프로퍼티
  • BlendTime 블렌드 시간 - 주어진 자손이 얼마나 빨리 블렌드 인 하는지 입니다.
  • ChildBlendTimes 자손 블렌드 시간 - 블렌드 덮어쓰기 입니다.
  • bTickAnimInScript 스크립트에서 애님 틱 - 참이면 이 노드가 관련이 있거나 항상 틱되는 경우 TickAnim() 가 호출됩니다.

언리얼스크립트 함수
  • GetBlendTime(int ChildIndex, optional bool bGetDefault)
    • ChildIndex - 이 자손 인덱스의 블렌드 시간을 반환합니다.
    • bGetDefault - 참이면 그냥 BlendTime 을, 아니면 ChildBlendTimes[ChildIndex] 을 반환합니다.
  • GetAnimDuration(int ChildIndex) - 자손이 AnimNodeSequence 인 경우, 현재 재생 속도에서의 기간을 알아냅니다.
    • ChildIndex - 이 자손 인덱스의 애니메이션 기간을 반환합니다.
  • TickAnim(float DeltaSeconds) - 언리얼스크립트에서 커스텀 애님 블렌드 함수성을 구현하는 데 사용됩니다.
    • DeltaSeconds - 지난 번 TickAnim() 이 호출된 이후의 시간입니다.

UDKAnimBlendByFall / UTAnimBlendByFall


이 노드는 플레이어 낙하 상태에 따라 적절한 브렌치로 자동 블렌딩해 들어갑니다.

AnimNodes_UDKAnimBlendByFall.jpg

프로퍼티
  • bIgnoreDoubleJumps 더블 점프 무시 - 참이면 입력의 더블 점프 버전은 무시됩니다.
  • PreLandTime 착지전 시간 - 착지전 애니메이션을 발동시키기 위해 착지까지 예상되는 시간입니다.
  • PreLandStartUprightTime 착지전 직립 시작 시간 - 착지전 얼마서부터 다시 곧바로 서기 시작해야 하는지 입니다.
  • ToDblJumpUprightTime 더블 점프 직립 시간 - 더블 점프를 한 이후 곧바로 서기까지 걸리는 시간입니다.

UDKAnimBlendByFlying / UTAnimBlendByFlying


이 노드는 폰이 나는 경우 자동으로 블렌딩합니다. 날개를 자동으로 펼치거나 접는 동작을 흉내내는 애니메이션을 자동으로 재생할 수도 있습니다. 이 블렌드 노드는 UDKAnimBlendByDriving 과 비슷합니다.

AnimNodes_UDKAnimBlendByFlying.jpg

프로퍼티
  • StartingAnimName 시작 애님 이름 - 이 폰에 특별히 재생할 시작 애님이 있는지 입니다.
  • EndingAnimName 끝 애님 이름 - 이 폰에 특별히 재생할 끝 애님이 있는지 입니다.

언리얼스크립트 함수
  • UpdateFlyingState() - 현재 나는 상태를 강제 업데이트합니다.

UDKAnimBlendByHoverboarding / UTAnimBlendByHoverboarding


이 노드는 UDKVehicleSimHoverboard 의 상태에 따라 다양한 브랜치를 자동으로 블렌드합니다. 사용된 UDKVehicleSimHoverboard 인스턴스는 스켈레탈 메시 컴포넌트의 오너가 구동하는 것입니다.

AnimNodes_UDKAnimBlendByHoverboarding.jpg

프로퍼티
  • FallTimeBeforeAnim - 미사용.

UDKAnimBlendByHoverJump / UTAnimBlendByHoverJump


이 노드는 오너 비히클의 'hover' 상태에 따라 다양한 브랜치로 자동 블렌딩해 들어갑니다.

AnimNodes_UDKAnimBlendByHoverboardJump.jpg

UDKAnimBlendByIdle / UTAnimBlendByIdle


이 노드는 오너의 속도에 따라 빈둥과 이동 상태를 자동으로 블렌딩해 들어갑니다. 오너의 속도가 0 (이거나 상대적으로 작은 수)이면 노드는 'Idle' 브랜치로 블렌드해 들어갑니다. 아니면 노드는 'Moving' 브랜치로 블렌딩해 들어갑니다.

AnimNodes_UDKAnimBlendByIdle.jpg

UDKAnimBlendByPhysics / UTAnimBlendByPhysics


이 노드는 폰의 현재 물리 상태를 살펴봐서 플레이어에 어느 브랜치를 사용할지 결정하는 데 쓰입니다. PhysicsMap 을 들여다보는 데 현재 물리 enum 인덱스를 사용한 다음 블렌딩해 들어가기 적절한 브랜치를 선택합니다. PhysicsMap 배열 값이 0 미만인 경우, 첫 브랜치는 항상 사용됩니다.

AnimNodes_UDKAnimBlendByPhysics.jpg

프로퍼티
  • PhysicsMap 물리 맵 - 물리 enum 인덱스를 다른 브랜치 인덱스로 다시 매핑합니다.
  • LandBlendDelay 착지 블렌딩 지연 - 작지 애니메이션으로의 블렌딩을 얼마나 지연시킬지 입니다. 그러나 오너가 공중에 머문 기간이 0.5 초 미만인 경우 사용되지 않습니다.

UDKAnimBlendByPhysicsVolume / UTAnimBlendByPhysicsVolume


이 노드는 오너의 현재 피직스 볼륨 파라미터에 따라 다양한 브랜치로 블렌딩합니다.

AnimNodes_UDKAnimBlendByPhysicsVolume.jpg

프로퍼티
  • PhysicsParamList 물리 파람 목록 - 검사할 파라미터 목록입니다.
    • ChildIndex 자손 인덱스 - 오너의 피직스 볼륨이 이 파라미터에 일치할 때 활성화시켜야 하는 자손 인덱스입니다.
    • bWaterVolume 워터 볼륨 - 볼륨이 물인지 아닌지 입니다.
    • bCheckGravity 중력 검사 - 볼륨의 중력에 신경쓸 것인지 입니다.
    • MinGravity 최소 중력 - bCheckGravity 의 최소 중력 임계값입니다.
    • MaxGravity 최대 중력 - bCheckGravity 의 최대 중력 임계값입니다.

언리얼스크립트 함수
  • PhysicsVolumeChanged(PhysicsVolume NewVolume) - 오너의 피직스 볼륨이 변경되었을 때 호출됩니다.
    • NewVolume - 현재 오너가 들어있는 PhysicsVolume 입니다.

UDKAnimBlendByPosture / UTAnimBlendByPosture


이 노드는 웅크리기나 달리기 애니메이션 중 어느 것을 재생해야 하는지 결정하는 데 사용됩니다. 오너에 bIsCrouched 가 참으로 설정된 경우 'Crouch' 브랜치가 블렌드 인 되며, 그 외의 경우 'Run' 브랜치를 블렌드 인 시킵니다.

AnimNodes_UDKAnimBlendByPosture.jpg

UDKAnimBlendByTurnInPlace / UTAnimBlendByTurnInPlace


이 노드는 UDKPawn 오너가 회전중인지를 검사합니다. UDKPawn 오너의 절대 RootYawSpeed 가 RootYawSpeedThresh 보다 높은 경우, 'TurnInPlace' (제자리 회전) 브랜치가 블렌드 인 됩니다. 아니면 애님 노드 시퀸스는 'Idle' 브랜치에 어태치되며, 'Rotate_Settle_Rif' 라는 이름의 애니메이션을 재생합니다.

AnimNodes_UDKAnimBlendByTurnInPlace.jpg

프로퍼티
  • Root Yaw Speed Thresh 루트 요 속력 임계값 - 'TurnInPlace' (제자리 회전) 브랜치가 활성화되려면 루트 요 속력이 이 임계값 범위 안에 있어야 합니다.
  • Turn In Place Blend Speed 제자리 회전 블렌드 속력 - 미사용.

UDKAnimBlendByVehicle / UTAnimBlendByVehicle


이 노드는 폰이 비히클 안에 있는지 검사합니다. 폰이 비히클 안에 있으면, 비히클의 클래스 이름을 브랜치 이름과 일치시켜 봅니다. 적절한 브랜치를 찾은 경우, 그 브랜치로 블렌딩해 들어갑니다. 그 브랜치 인덱스가 0 인 경우, 어태치된 애님 시퀸스 노드의 비히클에 의해 정의된 애니메이션을 재생 시도해 보고, 그렇지 않으면 어태치된 애님 시퀸스 노드를 재생합니다.

AnimNodes_UDKAnimBlendByVehicle.jpg

언리얼스크립트 함수
  • UpdateVehicleState() - 지금 비히클의 상태를 강제 업데이트합니다.

디렉셔널

AnimNodeBlendDirectional


애님트리가 전후(게걸음)좌우로 움직이는 오닝 액터를 나타내는 네 입력간에 자동으로 블렌딩할 수 있도록 해 주는 블렌드 노드입니다. 블렌드 노드는 속도와 가속도 방향을 오닝 액터 방향과 비교합니다. 그 둘 사이의 차이에 따라 입력을 전환합니다.

AnimNodeBlendDirectional.jpg

프로퍼티
  • Dir Degrees Per Second 초당 방향 각도 - 방향 블렌딩을 얼마나 빠르게 변화할 수 있도록 할지를 조절할 수 있습니다.
  • Single Anim At Or Above LOD 이 LOD 이상이면 단일 애님 - 메시에 대한 LOD 가 이 값 이상이면, 블렌딩이 아닌 단일 방향 애니메이션만 사용합니다.
  • Use Acceleration 가속도 사용 - 속도 대신 가속도 방향을 사용합니다.

미러

AnimNodeMirror


애님트리가 애니메이션 미러링 을 언제 사용할 지 설정할 수 있도록 해 주는 블렌드 노드입니다.

AnimNodeMirror.jpg

프로퍼티
  • Enable Mirroring 미러링 허용 - 입력을 미러링하려면 참으로 설정하십시오.

언리얼스크립트에서 사용하는 법
이 코드 스니펫은 2 초마다 미러링을 크고 켜는 법을 나타냅니다.

YourActorClass.uc
var AnimNodeMirror AnimNodeMirror;
var float NextBlendTime;

simulated event Destroyed()
{
  Super.Destroyed();

  AnimNodeMirror = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  AnimNodeMirror = AnimNodeMirror(SkelComp.FindAnimNode('AnimNodeMirror'));
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (AnimNodeMirror == None)
  {
    return;
  }

  if (WorldInfo.TimeSeconds >= NextBlendTime)
  {
    AnimNodeMirror.bEnableMirroring = !AnimNodeMirror.bEnableMirroring;
    NextBlendTime = WorldInfo.TimeSeconds + 2.f;
  }
}

defaultproperties
{
}

랜덤

AnimNodeRandom


애님트리가 사용자에 의해 설정된 입력끼리 랜덤하게 블렌딩할 수 있도록 해 주는 블렌드 노드입니다.

AnimNodeRandom.jpg

프로퍼티
AnimNodeRandom 에는 Random Info 라는 배열이 있습니다. Random Info 는 구조체 배열입니다. 각 구조체는 랜덤한 정도를 결정하기 위해 블렌드 노드가 사용하는 프로퍼티를 정의합니다.

  • Chance 확률 - 이 자손이 선택될 확률입니다. 모든 인덱스가 0 이라면 모든 인덱스 확률은 같습니다.
  • Loop Count Min 루프 카운트 최소 - 이 애니메이션 반복 재생 최소 횟수입니다. 0 이면 한 번만 재생합니다.
  • Loop Cound Max 루프 카운트 최대 - 이 애니메이션 반복 재생 최대 횟수입니다.
  • Blend In Time 블렌드 인 시간 - 이 인덱스로 블렌드 인 해 들어가는 시간입니다.
  • Play Rate Range 재생 속도 범위 - 애니메이션 재생 속도 범위입니다. 0 이면 디폴트로 1 입니다.
  • Still Frame 정지 프레임 - 정지 프레임이면 애니메이션을 재생하지 않고, 임의로 하나 뽑은 다음 포커스를 잃을 때까지 유지합니다.

애니메이션 시퀸스


AnimNodeSequence


애님세트 안에 상주하고 있는 애니메이션 시퀸스 안의 애니메이션 데이터를 출력하는 애니메이션 노드입니다.

AnimNodeSequence.jpg

프로퍼티

  • Anim Seq Name 애님 시퀸 이름 - 바인딩할 애니메이션 시퀸스 이름입니다. 스켈레탈 메시 컴포넌트에 있는 AnimSets 배열에 지정된 모든 애님세트에 대해서 이 이름을 찾아봅니다.
  • Rate 레이트 - 애니메이션을 재생할 백분율 속도입니다. 1.f 는 애니메이션을 100% (정상) 속도로 재생합니다. 0.5f 는 애니메이션을 50% (느린) 속도로 재생합니다. 2.f 는 애니메이션을 200% (빠른) 속도로 재생합니다.
  • Playing 재생중 - 애니메이션이 현재 재생중인지 입니다.
  • Looping 루핑 - 애니메이션이 되풀이되는지 입니다.
  • Cause Actor Anim End 액터에 AnimEnd 유발 - 애니메이션이 끝까지 도달해 중지되면 오닝 액터 안에서 OnAnimEnd 이벤트를 트리거시킵니다. 애니메이션에 루핑 설정이 되어있으면 트리거되지 않습니다.
  • Cause Actor Anim Play 액터에 AnimPlay 유발 - 애니메이션 시작시 오닝 액터 안에서 OnAnimPlay 이벤트를 트리거시킵니다.
  • Zero Root Rotation 제로 루트 로테이션 - 이 애니메이션의 루트 본에 대한 로테이션은 항상 0 으로 반환합니다.
  • Zero Root Translation 제로 루트 트랜슬레이션 - 이 애니메이션의 루트 본에 대한 트랜슬레이션은 항상 0 으로 반환합니다.
  • Disable Warning When Anim Not Found 애님을 찾을 수 없을 때 경고 끄기 - 유효하지 않은 애님 시퀸 이름 으로 애님 노드 시퀸스가 재생될 때 나타나는 경고를 끕니다.
  • No Notifies 노티파이 없음 - 참이면 이 애님 노드 시퀸스에 대해서는 애님 노티파이가 트리거되지 않습니다.
  • Force Refpose When Not Playing 재생중이지 않을 때 refpose 강제 - 이 애님 노드 시퀸스가 재생중이지 않을 때 스켈레탈 메시를 ref pose 속에 강제로 넣습니다. 최적화의 일환으로 추가된 것입니다. 애님 노드 시퀸스가 항상 재생 또는 루핑되면서 애님 트리에 의해 사용되고 있지는 않은 경우, 애니메이션 데이터 룩업을 생략하여 퍼포먼스를 올립니다.
  • Current Time 현재 시간 - 현재 애니메이션 재생 위치입니다.
  • Notify Weight Threshold 노티파이 웨이트 임계값 - 노티파이가 실행되도록 하기 위해, 이 노드가 최종 블렌드에서 도달해야 하는 총 웨이트입니다. 이로써 가장 우세한 애님 노드 시퀸스에서만 애님 노티파이가 트리거되도록 할 수 있습니다. 애님 노드 시퀸스가 그룹의 일부일 때는 무시됩니다.
  • Root Bone Option 루트 본 옵션
    • RBA_Default 디폴트 - 애니메이션에서의 루트 본 운동을 놔두고, 오닝 액터의 운동에 영향을 끼치지 않습니다.
    • RBA_Discard 버림 - 루트 본 운동을 버리고, 첫 프레임 위치로 고정시킵니다.
    • RBA_Translate 옮김 - 루트 본 운동을 버리고, 그 속도를 오닝 액터로 옮깁니다.
  • Root Rotation Option 루트 로테이션 옵션
    • RRO_Default 디폴트 - 애니메이션에서의 루트 본 로테이션을 놔두고, 오닝 액터의 로테이션에 영향을 끼치지 않습니다. 액터에 영향을 끼치지 않습니다.
    • RRO_Discard 버림 - 루트 본 로테이션을 버리고, 첫 프레임 로테이션으로 고정시킵니다. 액터에 영향을 끼치지 않습니다.
    • RRO_Extract 추출 - 루트 본 로테이션을 버리고, 그 로테이션을 오닝 액터로 전송합니다.

언리얼스크립트 함수
  • SetAnim(name Sequence) - 이 노드가 재생중인 애니메이션을 새 이름으로 변경합니다. 오닝 스켈레탈 메시 컴포넌트의 AnimSets 배열에서 룩업됩니다.
    • Sequence - 애니메이션 시퀸스의 이름입니다.
  • PlayAnim(bool bLoop, float InRate, float StartTime) - 주어진 파라미터로 현재 애니메이션 재생을 시작합니다.
    • bLoop - 애니메이션을 되풀이하여 멈추라고 했을 때만 멈추게 할지 입니다.
    • InRate - 애니메이션 재생 속도입니다.
    • StartTime - 애니메이션을 언제 시작할지 입니다. (예로 애니메이션 2초 지점에서 시작)
  • StopAnim() - 현재 애니메이션 재생을 멈춥니다. CurrentTime 은 그대로 남습니다.
  • ReplayAnim() - 현재 세팅으로 PlayAnim 을 호출합니다.
  • SetPosition(float NewTime, bool bFireNotifies) - 애니메이션을 특정 시간으로 강제 이동합니다.
    • NewTime - 애니메이션 위치를 재조정할 초 단위 시간입니다.
    • bFireNotifies - 애님 노티파이를 발동합니다.
  • GetNormalizedPosition() - 그룹에 주어진 상대 위치에 따라 동기화된 노드의 정규화된 위치를 찾아냅니다. 노드의 상대적 SynchPosOffset (동기화 위치 오프셋)을 계산에 넣습니다.
  • FindGroupRelativePosition(float GroupRelativePosition) - 그룹에 주어진 상대 위치에 따라 동기화된 노드의 위치를 찾아냅니다. 노드의 상대 SynchPosOffset 을 계산에 넣습니다.
  • FindGroupPosition(float GroupRelativePosition)
    • GroupRelativePosition - 위치를 찾을 그룹 상대적 위치입니다. 0.f 에서 1.f 까지의 값을 사용해야 합니다.
  • GetGroupRelativePosition() - 동기화된 노드의 상대적 위치를 구합니다. 노드의 상대적 오프셋을 계산에 넣습니다.
  • GetGlobalPlayRate() - 이 애니메이션의 전체적인 재생 속도를 반환합니다. 모든 레이트 스케일을 계산에 넣습니다.
  • GetAnimPlaybackLength() - 현재 재생 속도를 기준으로 현재 애니메이션의 기간을 (초 단위로) 반환합니다. 애니메이션이 없으면 0.0 을 반환합니다.
  • GetTimeLeft() - 애니메이션 재생 종료까지 남은 초 단위 시간을 반환합니다. 재생 속도가 변하지 않을 거라 가정한 것입니다.
  • SetRootBoneAxisOption(ERootBoneAxis AxisX, ERootBoneAxis AxisY, ERootBoneAxis AxisZ) - 커스텀 애니메이션 루트 본 옵션을 설정합니다.
    • AxisX - X 축입니다.
    • AxisY - Y 축입니다.
    • AxisZ - Z 축입니다.
  • SetRootBoneRotationOption(ERootRotationOption AxisX, ERootRotationOption AxisY,ERootRotationOption AxisZ) - 루트 모션 에 사용되는 루트 본 축을 설정합니다.
    • AxisX - X 축입니다.
    • AxisY - Y 축입니다.
    • AxisZ - Z 축입니다.

AnimNodeSequenceBlendByAim


아홉 포즈를 블렌딩할 수 있다는 점에서 AnimNodeAimOffset 과 매우 유사한 애니메이션 노드입니다. AnimNodeOffset 보다 훨씬 간단하고 셋업도 쉽지만, AnimNodeOffset 에 설명된 문제를 해결하지는 못합니다. 그러나 매우 단순한 조준/바라보기 블렌딩을 위해서라면 오히려 나을 수도 있는 애니메이션 노드입니다.

AnimNodeSequenceBlendByAim.jpg

프로퍼티

  • Aim 조준
    • X - 현재 가로 조준 위치입니다.
    • Y - 현재 세로 조준 위치입니다.
  • Horizontal Range 가로 범위
    • X - 최소 가로 조준입니다.
    • Y - 최대 가로 조준입니다.
  • Vertical Range 세로 범위
    • X - 최소 세로 조준입니다.
    • Y - 최대 세로 조준입니다.
  • Angle Offset 각도 오프셋
    • X - Aim 처리 전에 더해줄 가로 오프셋입니다.
    • Y - Aim 처리 전에 더해줄 세로 오프셋입니다.
  • Anim Name LU - 왼쪽 위를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
  • Anim Name LC - 왼쪽을 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
  • Anim Name LD - 왼쪽 아래를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
  • Anim Name CU - 위를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
  • Anim Name CC - 가운데를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
  • Anim Name CD - 아래를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
  • Anim Name RU - 오른쪽 위를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
  • Anim Name RC - 오른쪽을 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.
  • Anim Name RD - 오른쪽 아래를 조준 / 바라보는 아바타를 나타내는 애니메이션입니다.

언리얼스크립트 함수
  • CheckAnimsUpToDate() - 애니메이션을 최신으로 유지합니다. 게임 도중 어느 AnimName_XX 라도 변경했다면, 나중에 이 함수를 호출하십시오.

언리얼스크립트에서 사용하는 법
AnimNodeAimOffset 과 비슷하지만, 이 애니메이션 노드에는 프로파일 옵션이 없습니다.

UDKAnimNodeFramePlayer / UTAnimNodeFramePlayer


이 애니메이션 노드는 애니메이션 위치를 0.f 에서 1.f 까지 백분율로 설정할 수 있도록 해 주는 헬퍼 애니메이션 노드입니다.

AnimNodes_UDKAnimNodeFramePlayer.jpg

언리얼스크립트 함수
  • SetAnimation(name Sequence, float RateScale) - 애니메이션 노드의 애니메이션 시퀸스와 속도 스케일을 설정합니다. Sequence - 애니메이션 시퀸스 이름입니다. RateScale - 애니메이션 재생 속도입니다.
  • SetAnimPosition(float Perc) - 애니메이션 위치를 0.f 에서 1.f 까지의 백분율 값으로 설정합니다. Perc - 애니메이션 위치를 설정할 백분율 값입니다.

언리얼스크립트에서 사용하는 방법
YourActorClass.uc
class ExampleUDKAnimNodeFramePlayer extends Pawn
  placeable; 

var UDKAnimNodeFramePlayer UDKAnimNodeFramePlayer;

simulated event Destroyed()
{
  Super.Destroyed();

  UDKAnimNodeFramePlayer = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  UDKAnimNodeFramePlayer = UDKAnimNodeFramePlayer(SkelComp.FindAnimNode('UDKAnimNodeFramePlayer'));
  if (UDKAnimNodeFramePlayer != None)
  {
    SetTimer(0.5f, true, NameOf(RandomizePosition));
  }
}

simulated function RandomizePosition()
{
  if (UDKAnimNodeFramePlayer != None)
  {
    UDKAnimNodeFramePlayer.SetAnimPosition(FRand());
  }
}

defaultproperties
{
  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

UDKAnimNodeSequence / UTAnimNodeSequence


이 애니메이션 노드는 재생할 애니에미션 내부 스택을 유지합니다. 각 애니메이션이 끝나면 스택에서 제거되고 스택의 다음 애니메이션이 재생됩니다. 이 애니메이션 노드는 UDKAnimBlendByVehicle 로 중지됩니다.

AnimNodes_UDKAnimNodeSequence.jpg

프로퍼티
  • Auto Start 자동 시작 - 참이면 이 노드는 자동 재생 시작됩니다.

언리얼스크립트 함수
  • PlayAnimation(name Sequence, float SeqRate, bool bSeqLoop) - 애니메이션을 재생합니다.
    • Sequence - 재생할 애니메이션 시퀸스 이름입니다.
    • SeqRate - 애니메이션 재생 속도입니다.
    • bSeqLoop - 참이면 이 애니메이션을 되풀이합니다.
  • PlayAnimationSet(array Sequences, float SeqRate, bool bLoopLast) - Sequences 배열에 있는 첫 애니메이션을 재생한 다음, 나머지 애니메이션을 애니메이션 스택에 추가합니다.
    • Sequences - 재생할 애니메이션 시퀸스 이름입니다.
    • SeqRate - 애니메이션 재생 속도입니다.
    • bLoopLast - 참이면 마지막 애니메이션을 되풀이합니다.

언리얼스크립트에서 사용하는 방법
YourActorClass.uc
class ExampleUDKAnimNodeSequence extends Pawn
  placeable; 

// 재생할 애님 시퀸스 배열입니다.
var() const array<Name> Sequences;
// 시퀸스 재생 속도입니다.
var() const float SeqRate;
// 참이면 마지막 애니메이션이 되풀이됩니다.
var() const bool bLoopLast;

var UDKAnimNodeSequence UDKAnimNodeSequence;

simulated event Destroyed()
{
  Super.Destroyed();

  UDKAnimNodeSequence = None;
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  UDKAnimNodeSequence = UDKAnimNodeSequence(SkelComp.FindAnimNode('UDKAnimNodeSequence'));
  if (UDKAnimNodeSequence != None)
  {
    UDKAnimNodeSequence.PlayAnimationSet(Sequences, SeqRate, bLoopLast);
  }
}

defaultproperties
{
  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

UDKAnimNodeSequenceByBoneRotation / UTAnimNodeSequenceByBoneRotation


이 애니메이션 노드 시퀸스는 소유 액터의 로테이션에 상대적으로 주어진 본의 로테이션에 따라 그 목록에서 애니메이션을 선택합니다.

AnimNodes_UDKAnimNodeSequenceByBoneRotation.jpg

프로퍼티
  • Bone Name 본 이름 - 방향을 검사할 본입니다.
  • Bone Axis 본 축 - 검사할 본 축입니다.
  • Anim List 애님 목록 - 이 애니메이션 목록에서 선택합니다.
    • Desired Rotation 바라는 로테이션 - 이 애니메이션 재생을 위해 바람직한 본 로테이션입니다.
    • Anim Name 애님 이름 - 재생할 애니메이션 이름입니다.

UDKAnimNodeSeqWeapon / UTAnimNodeSeqWeapon


이 애님 노드 시퀸스는 오너의 무기 종류에 따라 재생되는 애니메이션을 자동으로 변경합니다. 이 애니메이션 노드는 UDKAnimNodeCopyBoneTranslation / UTAnimNodeCopyBoneTranslation 에다 AnimNodeAimOffset 과 함께 사용됩니다. AnimNodeAimOffset 프로파일은 오너의 무기 종류를 결정하는 데 사용됩니다. 사용되는 내부 이름은 변경할 수 없으며, 언리얼 토너먼트 3 의 웨폰 카테고리와 맞아 떨어집니다.

AnimNodes_UDKAnimNodeSeqWeap.jpg

프로퍼티
  • Default Anim 디폴트 애님 - 플레이어가 라이플을 들고 있을 때 재생할 디폴트 애니메이션입니다.
  • Dual Pistol Anim 듀얼 피스톨 애님 - 플레이어가 피스톨을 두 자루 쥐고 있을 때 재생할 디폴트 애니메이션입니다.
  • Single Pistol Anim 싱글 피스톨 애님 - 플레이어가 피스톨을 한 자루 쥐고 있을 때 재생할 디폴트 애니메이션입니다.
  • Shoulder Rocket Anim 어깨 로켓 애님 - 플레이어가 어깨 로켓을 쥐고 있을 때 재생할 디폴트 애니메이션입니다.
  • Stinger Anim 스팅어 애님 - 플레이어가 스팅어(미니건같은 무기)를 쥐고 있을 때 재생할 디폴트 애니메이션입니다.

예제


위의 애니메이션 노드를 약간 동원한 이 단순 예제에서는, 그들을 서로 합치는 것으로 플레이어의 폰이 무엇을 하고 있는지에 따라 스켈레탈 메시를 어떻게 애니메이트시킬 지를 결정하는 로직 경로(pathway)를 만들 수 있음을 보여주고 있습니다.

이 로직을 더욱 깊이 알기 위해서는 트리 나머지가 처리되는 방식을 결정하는 주요 경로를 살펴보십시오. 주요한 것 첫 번째는 AnimNodeBlendByPhysics (애님노드 피직스로 블렌드) 입니다.

이 이미지에서는 PHYS_Walking 가 현재 선택되었습니다. FullBodySlot 라는 이름의 AnimNodeSlot (애님 노드 슬롯)이 여기 삽입되어 풀 바디 애니메이션 재생이 가능해집니다. 재생되는 애니메이션이 없으면 AnimNodeBlendPerBone (애님노드 본별 블렌드)로 갑니다. 이 블렌드 노드는 UpperBodySlot 라는 이름의 타겟 AnimNodeSlot (애님노드 슬롯)이 상체 애니메이션을 재생할 수 있도록 해 줍니다. AnimNodeBlendPerBone (애님노드 본별 블렌드) 역시도 소스 자손을 사용하여 활성이지 않은 경우 상/하체 애니메이션을 파생합니다. 그런 다음 AnimNodeBlendByPosture (애님노드 포스처로 블렌드)는 애님트리 오너가 웅크리고 있는지 아닌지를 검사합니다. 웅크리고 있지 않으면 AnimNodeBlendBySpeed (애님노드 속력으로 블렌드)는 애님트리 오너가 움직이고 있는지를 검사합니다. 애님트리 오너가 움직이고 있지 않으면, idle(빈둥) 애니메이션을 재생중인 AnimNodeSequence (애님노드 시퀸스)를 사용합니다. 그렇지 않으면 AnimNodeScaleRateBySpeed (애님노드 속력에 따라 재생속도 스케일)은 전체적인 재생 속도를 조절하고, AnimNodeBlendDirection (애님노드 블렌드 방향)은 다른 달리기 애니메이션을 블렌딩합니다. 애님트리 오너가 웅크리고 있으면 비슷한 로직이 웅크린 애니메이션에 적용됩니다. 달리기 애니메이션과 웅크리기 애니메이션의 동기화를 유지하기 위해, 애님트리 노드에 Run 싱크 그룹이 생성됩니다.

AnimNodeBlendByPhysics (애님노드 피직스로 블렌드)가 애님트리 오너에 PHYS_None 이 적용되었음을 감지하면, AnimNodeBlendByProperty (애님노드 프로퍼티로 블렌드)는 애님트리 오너가 운전중인지를 검사합니다. 애님트리 오너가 운전중이지 않으면 idle(빈둥) 애니메이션이 출력됩니다. 그렇지 않으면 AnimNodeBlendList (애님노드 블렌드 리스트)를 사용하여 운전중인 비히클에 따라 달라지는 운전 위치를 출력합니다.

AnimNodeBlendByPhysics (애님노드 피직스로 블렌드)가 애님트리 오너에 PHYS_Falling 이 적용되었음을 감지하면, falling idle(낙하 버둥) 애니메이션이 출력됩니다.

AnimNodeBlendByPhysics (애님노드 피직스로 블렌드)가 애님트리 오너에 PHYS_Swinning 이 적용되었음을 감지하면, PHYS_Walking 에 적용된 것과 비슷한 로직이 수영 애니메이션에 적용됩니다.

그 후 블렌딩 결과가 AnimNodeMirror 속에 출력됩니다. 미러링이 필요한지에 따라서 이 블렌드 노드는 미러링된 버전을 또는 아닌 버전을 출력할 수 있습니다. 마지막으로 AnimNodeAimOffset (애님노드 조준 오프셋)이 블렌딩된 스켈레톤에 다양한 조준/바라보기 애니메이션 델타를 더합니다.

애님트리는 최종 스켈레톤을 읽어 스켈레탈 메시에 적용하는 것입니다.

AnimNodeGameExample_Thumbnail.jpg

내려받기