본문 바로가기
프로그래밍/Unreal Engine 3

UDK > AnimBlend 와 Slot 와 RootMotion

by neive 2012. 2. 3.
728x90
참고 1 블렌드
http://udn.epicgames.com/Three/AnimationNodesKR.html#AnimNodeSlot

참고 2 루트모션
http://udn.epicgames.com/Three/RootMotionKR.html


중요한 것은 AnimTreeTemplate 에서 디폴트로 활성화 되어있을 bEarlyAnimEndNotify 가 true 로 체크되어있나
봐줘야 된다.. 블렌드는 애초에 Anim Start 라던가 End 라는게 없어서 저 옵션이 활성화 되어있으면 대충 다른 Anim
으로의 블랜딩이 시작될 때 End 가 떨어진다 (단발성 Anim 이라면 루트모션의 적용이  쉽지만..)
주석 붙은 부분만 유심히 보면 되고 그대로 가져가다고 컴파일 되진 않는다 ㅋ (주석은 UDN 사이트의 날것을 사용했다)

예제
function float PlayAnimationBySlot(SkeletalMeshComponent SkelComp, Name SlotName, 
       Name AnimName, float fRate, float fInTime, float fOutTime, bool bLoop=false, bool bOverride=true)
{
	local AnimNodeSlot AnimNodeSlot;
	local AnimNodeSequence SeqNode;
	local float fTime;

    AnimNodeSlot = AnimNodeSlot(SkelComp.FindAnimNode(SlotName));
    
    if(AnimNodeSlot != None)
    {
        AnimNodeSlot.SetActorAnimEndNotification(true);
        fTime = AnimNodeSlot.PlayCustomAnim(AnimName, fRate, fInTime, fOutTime, bLoop, bOverride);

        /////        예제 그대로 주석을 가져왔다 ㅋㅋ 어체 한번 괴팍하구먼
        SeqNode = AnimNodeSlot.GetCustomAnimNodeSeq();

        // 애니메이션 노드에 루트 모션 켜기
        SeqNode.SetRootBoneAxisOption(RBA_Translate, RBA_Translate, RBA_Default);

        // 애니메이션 노드더러 애니메이션 재생이 완료되면 알리라 이르라
        SeqNode.bCauseActorAnimEnd = TRUE;

        // 메시더러 액터 트렌슬레이션에 루트 모션을 사용하라 이르라
        // RMM_Translate 애니에 따라 이동
        // RMM_Velocity 가중치 적용 (velocity 값에 따라 제자리에서 동작하기도 함)
        SkelComp.RootMotionMode = RMM_Translate;

        // 메시더러 루트 모션이 언제 적용될지 알리라 이르라
        // 그때 짐이 피직스 운동에서 애니메이션 운동으로 매끄럽게 전환해 줄 터이니
        SkelComp.bRootMotionModeChangeNotify = TRUE;
        /////

        return fTime;
    }

    return 0.0f;
}


simulated event OnAnimEnd(AnimNodeSequence SeqNode, float PlayedTime, float ExcessTime)
{
   // 루트 모션을 버리면 메시는 제자리에 고정될 테니
   // 다른 애니메이션을 적절히 블렌딩해 줘야 할 듯
//   SeqNode.SetRootBoneAxisOption(RBA_Default, RBA_Default, RBA_Default);

    // 메시더러 루트 모션을 그만 놓아주라 이르라
    Mesh.RootMotionMode = RMM_Ignore;
}

simulated event RootMotionModeChanged(SkeletalMeshComponent SkelComp)
{
    /**
    * 루트 모션의 효력은 다음 프레임부터 나타날 터이니
    * 폰 운동을 죽이고 루트 모션을 들라 하라
    */
    if(SkelComp.RootMotionMode == RMM_Translate)
    {
        Velocity = vect(0.f, 0.f, 0.f);
        Acceleration = vect(0.f, 0.f, 0.f);
    }

    // 노티파이 끄고
    SkelComp.bRootMotionModeChangeNotify = false;
}





위의 스샷 처럼 slot node 에 의존할 경우 기본 재생 애니가 있다면 결국 단발성 애니가 끝나고 wait 애니로 블랜드되면서 wait 의 RootBone 속성을 가져가니 End 부분에서 별도로 처리하는 부분은 주석을 처리해도 되는 것이다..

728x90

'프로그래밍 > Unreal Engine 3' 카테고리의 다른 글

UDK > 내 게임 만들기 (4)  (0) 2012.02.08
UDK > 내 게임 만들기 (3)  (0) 2012.02.08
UDK > RigidBody  (0) 2012.01.30
UDK > 언리얼 마스터링 > 함수  (0) 2012.01.27
UDK > 머테리얼 마스크  (0) 2012.01.19

댓글