안녕하세요 이영훈 입니다
이번 시간에는 플레이어 애니메이션을 적용해 볼 텐데요
이번 단원에서는 플레이어의 애니메이션을 제어하는 방법에 대해 학습하겠습니다
마켓 플레이스에서 애니메이션을 다운로드하여
리타게팅하고 애니메이션 블루프린트를 적용하여
애니메이션 스테이트 머신을 구성하는 방법에 대해 학습하겠습니다
또한 블랜드 스페이스를 이용해
플레이어의 이동 애니메이션을 부드럽게 처리하는 방법을 학습하겠습니다
이번에는 애니메이션을 해 볼 건데요
주인공 애니메이션을 하기 위해서
언리얼 런처를 열어주세요
그리고 여기 보면 언리얼 엔진에 마켓플레이스가 있습니다
마켓플레이스에서
애니메이션 스타터팩 이라는 게 있는데요
검색을 해보세요
그러면 이렇게 나와 있구요
클릭한 후에 프로젝트에 추가를 해주도록 할게요
모든 프로젝트를 표시합니다 라고 하시고
지금 우리 프로젝트는 cpp-tps 입니다
그런데 5.3 버전은 지원하지 않아요
그래서 이것을 눌러서 5.2 버전으로 바꾼 후에 추가하도록 하겠습니다
용량은 그렇게 크지 않아서 금방 다운로드가 되었구요
프로젝트를 보면은
이렇게 애니메이션 스타터팩 이라는 폴더가 추가된 걸 확인할 수 있죠
그런데 이 녀석은 언리얼4에서 사용되었던 에셋을 기반으로 되어 있는 애니메이션 입니다
그래서 이것을 언리얼5용으로 좀 변경을 해줘야 되는데요
그 작업을 잠깐 해보도록 할게요
자 먼저 애니메이션을 담을 폴더를 하나 만들어 주겠습니다
컨텐츠 밑에다가
new folder에서
animations 라고 하나 만들어 주도록 하겠습니다
이걸 그대로 쓸 건 아니구요
이쪽으로 바꿔서 변형한 후에 이것을 삭제를 할 건데요
여기 보시면은 필터링을 할 수 있는데
여기에서 애니메이션의 애니메이션
시퀀스라는 게 있습니다
여기 있네요
클릭해 주시면 애니메이션 시퀀스들만 딱 나오게 됩니다
언리얼에서는 애니메이션 한 동작을 하나의 애니메이션을 시퀀스라고 불러요
그래서 애니메이션 시퀀스가 이 동작 하나를 말하는 겁니다
이렇게
자 그러면 여기서 컨트롤 a 를 눌러서 전체를 선택하신 후에
그 다음에 여기서 마우스 오른쪽을 눌러보시면
이렇게 리타겟 애니메이션 에셋 이라는 것이 있습니다
이것을 선택해서 디플리케이트 있죠
이거를 눌러주세요
자 그럼 이런 메뉴가 나오는데요
여기에 좌측 상단에 여기 ik 리타게터 부분을 눌러서
우리는 4를 5로 바꿔서 사용할 것이기 때문에
두 번째 메뉴를 선택하겠습니다
자 이렇게 나오죠
그대로 해도 되지만 저는 사용하고 있는 게 퀸이기 때문에
퀸 형태로 바꾼 다음에 진행할게요
자 이렇게 하시고
그 다음에 폴더를 정할 수가 있는데요
체인지 눌러서 애니메이션이라는 폴더에 이렇게 되도록 하고요
그 다음에 리타겟 버튼을 누릅니다
자 그러면 모두 리타겟이 되었고요
일단 저장을 해 주시고요
하나를 열어서 확인해 볼게요
자 이렇게 하면 언리얼 5인 퀸 캐릭터로
이렇게 애니메이션이 되는 것을 확인할 수 있죠
자 그러면 애니메이션 스타트업 팩은 이름이 겹치기 때문에
좀 헷갈릴 수 있으니까
이걸 삭제를 해 줄게요
자 딜리트 키를 눌러서 포스 딜리트 하겠습니다
자 그러면 이제 우리가 사용할 애니메이션을 확보를 했고요
자 이것을 이용해서 애니메이션 동작 처리를 해 보도록 할게요
자 블루프린트 폴더로 와서
주인공 블루프린트 클래스를 열어주십시오
자 그리고 보시면 애니메이션이라는 것은
결국은 이 메시 몸체를 표현하고 있는 메시가 애니메이션을 하게 될 겁니다
메시를 선택하신 후에 디테일을 보시면
애니메이션 이라는 것이 있어요
애니메이션 카테고리에 애니메이션 모드가 있고
클래스 이렇게 되어 있습니다
자 보시면은 블루프린트로 되어 있는데
사실은 S세트로 하시면 그냥 애니메이션을 바로 반영을 할 수가 있습니다
예를 들어서 이 녀석은 아이들 자세를 할 것이기 때문에
자 이것을 선택하면 이렇게 총을 들고 있는 자세가 나오게 되죠
자 이렇게 제어를 할 수도 있어요
한 땀 한 땀 모든 애니메이션을 그 상황에 맞는 걸로
이렇게 교체하는 형태로 해서 제작을 해도 되지만
이것은 좀 효율적이지 않겠죠
그래서 이거보다는 블루프린트 방식으로 제어하는 형태로 진행을 해보도록 할 거에요
자 그러면 애니메이션 블루프린트를 하나 만들어서 여기다가 배치를 하겠습니다
자 블루프린트 이니까 유니콘도에다가 제작을 할게요
마우스 오른쪽을 눌러보시면 애니메이션이 있죠
애니메이션에 애니메이션 블루프린트 라는 게 있습니다
이것을 클릭해서 만들어 줄게요
자 그러면 뼈대를 무엇으로 할 건지 나옵니다
자 여기 보시면은 세번째 SK마네킹 이라고 있는데
이것이 지금 우리가 사용하고 있는 캐릭터의 본이에요
스켈레톤 입니다
자 이것을 선택을 해주겠습니다
그리고 크리에이트 합니다
자 이름은 애니메이션 블루프린트니까 ab 언더가 이렇게 할게요
자 이건 TPS 클레일 거니까요
같은 이름으로 이렇게 작성을 하겠습니다
abp 라고 할까요 애니메이션 블루프린트니까
자 abp 언더가 이렇게 하겠습니다
자 그리고 이것을 더블 클릭하고 그러면은 이렇게 생겼는데요
자 이 구조를 보시면은
좌측에 마이 블루프린트가 있고
여기에 이벤트 그래프라는 곳이 있습니다
여기를 더블 클릭해서 가보면
자 우리가 계속 봤었던 비주얼 스크립팅을 할 수 있는 공간이구요
자 그리고 애닝 그래프는 애니메이션 시퀀스들이 배치되어지는 공간이라고 보시면 됩니다
자 여기에 들어가 애니메이션은 여기 우측에 보시면
에셋 브라우저가 있는데 여기 보시면 여기 들어갈 수 있는 목록이 이렇게 보입니다
자 여기서 저는 아이들 자세를 일단 넣어 볼게요
자 아이들, 라이플, 아이언사이트를 기본 동작으로 하도록 하겠습니다
자 이렇게 연결해 주시면 되구요
자 여기 보시면 컴파일이 있습니다
이걸 눌러 주시거나 상단에 있는 걸 눌러 주시면 컴파일이 되구요
어 제가 잘못 걸었네요
자 이걸로
네 이렇게 해서 컴파일 해보시면 이 자세를 하게 됩니다
자 저장해 주시고
그 다음에 주인공한테 이 애니메이션 블루프린트를 지정해 주도록 할게요
자 여기서 눌러서 ABP TPS 플레이어 이렇게 해서 반영을 하시면
이렇게 기본 동작을 하는 걸 볼 수가 있습니다
굉장히 간단하게 구성이 되어 있는데요
자 이것을 이용해서 우리가 애니메이션을 이어서 해 보도록 하겠습니다
자 다시 애니메이션 블루프린트로 이동할게요
자 이것은 어 굉장히 애니메이션 하나만 이렇게 반영한 건데
이렇게 하지 않고 상태 머신을 이용해서 제어해 보도록 할게요
자 여기서 마우스 오른쪽 버튼을 누르시면
자 이런 메뉴가 나오는데
여기에서 state machine이라고 하시면 이렇게 있습니다
이걸 클릭해서 이렇게 만들어 줄게요
자 이거는 state, 뭐 FSM이라고 할까요?
이거는 이동할 거니까 moveFSM 이라는 이름으로 지어 주도록 하고요
자 그리고 이거는 삭제를 하겠습니다
자 그리고 여기에서 이제 결과가 나오니까 이렇게 연결해 주도록 하고요
지금은 이제 아무것도 없으니까 그냥 이런 A 포즈를 하게 되는데
더블 클릭하고 들어가서 여기다가 아까 전에 기본 자세를 이렇게 꺼내시고
자 이렇게 연결해 주도록 할게요
연결하실 때는 여기 가운데 넣는 것이 아니라
여기 바깥에 하얀색 테두리 부분에 마우스를 대시면은 이렇게 연결할 수 있습니다
자 그러면 우리가 상태 머신에 대해서 배웠는데
애니메이션은 기본적으로 FSM 기반으로 제어를 할 수 있다고 했죠
자 이것이 바로 그 내용이고요
자 이거 하나를 이제 상태라고 보시면 되고요
이것은 전이한다 이런 뜻입니다
자 엔트리는 이제 시작이라는 뜻이고요
시작하면은 이쪽으로 전이가 되어서 이 애니메이션을 하게 되는 그런 구조입니다
자 그러면 이렇게 동작을 하게 되고요
자 이것을 제어하기 위해서
애니메이션을 좀 더 추가를 해 볼게요
여기 보면은 걷는 동작이 있는데 walk라고 해 볼게요
자 그러면은 이렇게 워크가 네 가지가 있습니다
아이언 사이트에서 앞으로 뒤로 왼쪽 오른쪽 이런 네 가지의 걷는 동작이 있는데
이것을 이용해서 처리를 해 볼게요
일단 앞과 뒤쪽만 한번 해 볼까요
자 Forward와 Backward 두 가지를 놓을게요
자 일단은 그냥 앞으로 가는 것만 먼저 해 볼까요
자 여기에서 마우스를 이렇게 올리시고 하얗게 되죠
그럼 이 상태에서 마우스 왼쪽 버튼을 눌러서 이렇게 당기시면
이렇게 전이할 수 있는 화살표가 나옵니다
그 이쪽으로 이렇게 보내고요
자 반대로 돌아도 돌아올 수도 있어야겠죠
자 이렇게 처리를 해 볼게요
자 그럼 이거를 처리하기 위해서 우리 어떤 이 조건을 만들어 줘야 되거든요
저기 이렇게 동그랗게 보이는 것이 바로 조건입니다
이 조건이 성립을 하면 이쪽으로 전의를 하는 거고요
이렇게 해 보도록 할게요
여기 보시면 변수를 만들 수 있습니다
자 변수를 하나 만들어 볼게요
이렇게 해서 스피드라는 변수를 만들겠습니다
자 그리고 불이 아니라 플루트 타입으로 할 거고요
자 그래서 이건 어떻게 할 거냐면 이런 개념으로 할 거예요
우리가 플레이어를 조작을 해서 W키나 이렇게 누르면 앞으로 가잖아요
자 옆에서 본다면 플레이어가 이렇게 있으면 W키를 누르면 앞으로 이렇게 가게 될 겁니다
자 그러면 이 녀석은 얼마나 빠르게 가냐면
플레이어를 잠깐 보고요
여기에 캐릭터 보그먼트 보시면 워크에 대한 내용이 있는데요
여기에 움직임의 크기는 여기 있습니다
워크 스피드라는 값이 있고
초당 6m를 이동하게 되어 있습니다
자 그러니까 저걸 기반으로 얘기한다면
벨로시티가 생기는데 W키를 누르면 속도가 만들어지잖아요
그리고 벨로시티가 있는데
그곳의 방향은 앞쪽이고
그 다음에 스피드는 워크 스피드가 되고 600이 되겠죠
이렇게 이런 구조인데요
저는 스피드라는 것은 방향을 제거하고 스피드 값만 그대로 가져오겠다는 거예요
그리고 스피드는 이 앞쪽에 대한 크기만 가져온다는 뜻이 되는 겁니다
자 이렇게 이름을 지어주도록 할게요
다시 돌아와서 스피드가 조건을 보면 가만히 있을 때는 스피드가 0이겠죠
그리고 걸을 수 있다는 것은 스피드가 0보다 커졌다 이런 개념인데
근데 사실 부동소점 연산이라고 해서 지금 플로트 타입을 사용할 건데요
자 플로트 타입은 부동소점 연산은 사실 오차가 좀 있습니다
예를 들어 이런 거죠
1이라고 이렇게 우리가 지정을 해주더라도 내부적으로 계산하다 보면
0.99999 이렇게 될 수도 있어요
이게 1과 같다 이렇게 되어버릴 수도 있거든요
자 이러한 오차를 가지고 있는 게 플로트 타입입니다
자 이거에 대해서 궁금하시면 부동소점 연산을 한번 검색을 해보십시오
오차에 대해서 한번 보시면 되고요
자 그렇기 때문에 이런 식으로 할 겁니다
스피드가 이 스피드 값이 0보다 크다 이렇게 하는 것보다는
한 0.1 정도를 그러니까 구간을 만들 건데 이렇게 이렇게 보면은
여기가 0이잖아요 그리고 여기가 1이라면
사실 여기는 뭐 600 뭐 플러스 600 이렇게 되겠죠
스피드가 600이니까
자 그러면 내가 가만히 서 있다는 거는 0이라기 보다는
여기 정도의 구간을 주는 거예요
그 이거를 저는 0.1로 주고 싶은데
0.1보다 작거나 마이너스 0.1보다 크면 그냥 서 있는 거다
이렇게 주고 싶어요
그러면 이런 오차는 이 안에서 약간의 계산이 되기 때문에
무시하고 진행할 수가 있겠죠
자 그래서 여기다가 조건을 줄 건데
이걸 더블 클릭하면 이렇게 들어갈 수가 있습니다
그럼 여기에서 스피드를 꺼낸 다음에
자 이 스피드가 크다면
그레이터 0.1보다 크다면
그러면은 앞으로 걷는 거다 라고 지정을 해 주도록 하겠습니다
컴파일 하고요
다시 돌아오시고 이쪽으로 누르시면은 돌아올 수 있겠죠
자 반대로 돌아오는 것은 더블 클릭하고
스피드가 0.1보다 작아졌다
그러면은 멈춘 거다 라고 저는 이해하고 싶어요
자 이렇게 해서 작다 less라고 하고 0.1이라고 하겠습니다
자 이렇게 지정을 해 주면 되겠죠
자 그 다음에 스피드를 이제 실제로 넣어야 되는데
여기에 이제 보면은 프리뷰가 있어요
이것을 이용하면 테스트를 좀 해 볼 수가 있습니다
자 여기에 스피드가 나와 있죠
여기다가 제가 600이라고 적으면 앞으로 걷죠
다시 0이라고 쓰면 가만히 서고요
근데 애니메이션을 보니까 아이딜 자세는 계속해서 반복적으로 하는 것 같은데
제가 600 이렇게 적었을 때 걷는 것은 걷다 만해요
자 이거는 반복하지 않아서 그런 것 같아요
자 그래서 저것을 처리를 좀 해 주도록 할게요
자 보시면은 이거를 더블 클릭해서 보면은
이 애니메이션은 여기에 디테일에 보면 하단에 보면 여기 루프 애니메이션이라는 게 있습니다
이것을 체크를 해 줄게요
자 아이들도 그냥 해 주도록 하겠습니다
이렇게 하고 그 다음에 앞으로 걷는 거 있죠
이것도 선택한 다음에 루프 애니메이션을 체크를 해 주겠습니다
자 그러면 이제 600이라는 값을 넣어 주면 계속 걸어 가죠
반복해서 이런 식으로 설정을 할 수가 있고요
자 반대쪽도 한번 해 볼까요
그러면 여기도 이렇게 화상표를 만들어 주시고
전의하는 것들을 그 다음에 이제 가만히 있다가 뒤로 걸을 수 있는 조건은
스피드가 마이너스 0.1 보다 작아졌을 때 그렇게 할 겁니다
그래서 작다 음수로 갈까요
마이너스 0.1 보다 작다면 이제 뒤로 걷는 거다 이렇게 이해를 할 거고요
다시 반대로 돌아오는 것은 얘가 마이너스 0.1 보다 커졌다 그렇게 이해하면 될 것 같습니다
스피드가 커졌어요 이렇게
그레이터 마이너스 0.1 보다 커졌다면 이제 제자리에 서는 거다
자 이런 식의 어떤 구성을 해 보겠습니다
자 그러면 이게 스피드를 제가 0 이라고 하면 멈추고요
1 이라고 하면 앞으로 걷죠 그리고 마이너스 1 이라고 하면 저렇게 뒤로 걷습니다
자 이렇게 제어를 할 수가 있고요 이것도 애니메이션을 수정을 해 줘야 겠네요
자 이렇게 해서
네 아이고 잘못 눌렀습니다
자 이걸 눌러서 여기 루프를 체크를 해 줄게요
자 프리뷰는 말 그대로 그냥 미리 보기 이고요
자 이 값을 수정한다고 해서 여기 있는 스피드 값이 이 값이 되는 건 아닙니다
자 그리고요 실제로 이 스피드 값을 이제 처리를 해야 될 텐데
일단은 블루프린트 상에서 먼저 제어를 해 보도록 할게요
자 여기 이벤트 그래프로 보시면 이렇게 되어 있습니다
여기도 보면은 Owner라는 이름을 쓰고 있죠
이게 뭐 이 Owner라는 것은 이 컴포넌트를 소유하고 있는 것이라고 할 수 있는데
어 게다가 이것은 컴포넌트는 아니고 애니메이션
어 애님 인스턴스라고 해요 여기 보시면
어 부모 클래스가 애님 인스턴스라고 되어 있죠
자 그래서 애님 인스턴스는 결국은 누가 되냐면 메시가 가지고 있고요
메시 컴포넌트가 가지고 있고요
여기 있죠 자 메시 컴포넌트 가지고 있고 이 컴포넌트를 이 주인공이 가지고 있는 개념입니다
자 그러면 여기 보면 어 폰 오너라고 되어 있어요
그래서 이것을 가지고 있는 메시 컴포넌트를 말하는 것이 아니라
어 이 애니메이션을 소유하고 있는 메시를 소유하고 있는 폰을 얘기하는 겁니다
자 그래서 가져온 다음에
어 일단은 이것이 있는지 한번 검증을 해야겠죠
이게 없을 수도 있잖아요
왜냐하면 언리얼 엔진에서는 이것을 처리하기 위해서
이 에디터 상에서도 이거를 만들어서 이제 구성을 하거든요
그러다 보니까 여기서 오류가 날 수도 있습니다
그래서 이것을 이렇게 해서 isValid라는 걸로 체크를 해줄게요
이걸로 하시면 되고요
자 이거는 널체크와 동일하다고 생각하시면 됩니다
정확하게 말하면 널체크보다 조금 더 강력하게 수면까지 체크를 해주는 개념이긴 한데
자 어쨌든 이걸로 하시면 됩니다
자 이렇게 해서 체크를 해주고요
Valid라면 유효하다면 이걸 사용하면 되겠죠
이게 폰 오너에서 Velocity를 가져올 수 있어요
Get Velocity 이렇게요
자 그럼 여기에 있는 값을 스피드에다가 이렇게 넣어 보도록 할 건데요
Set 해주겠습니다
일단은 여기에서 Length라고 하면
Vector Length 이렇게 가져오면 이 벡터의 크기를 가지고 올 수가 있고요
이걸 일단 스피드로 넣어 볼까요
자 이렇게 하고 컴파일 합니다
자 그러면 여기서 실행해서 움직여 보도록 할게요
그러면 걸어가죠
뒤로 가도 걸어가는 것처럼 보입니다
이런 식으로 되고요
사실 이거를 얘기할 때 이렇게 스피드를 그냥 가지고 오긴 했는데
이거는 정확하게 한 건 아닙니다
왜냐하면 스피드를 가져온다는 것은 Velocity의 스피드를 가져왔기 때문에
이거를 공중에서 본다면 이런 느낌인 거예요
자 우리가 팔 방향으로 움직일 수 있습니다
WASD를 키를 눌러서 보면은 플레이어가 이렇게 이쪽이 앞쪽이라면
이렇게 가면은 이제 W만 누른 거고
이렇게 가면은 D만 누른 거죠
자 그럼 이렇게 가면은 W와 D를 동시에 누른 그런 개념인 거죠
자 만약에 이렇게 동시에 이렇게 눌렀어요
그러면은 이것의 스피드는 몇일까요
600이라고 나올 수 있죠
근데 이제 조금 애매할 수가 있습니다
그래서 정확하게 앞쪽에 대한 스피드값
그 다음에 옆으로 가는 어떤 값 이런 거를 따로따로 분리해서 가지고 싶어요
자 무슨 말이냐면
자 보세요
여기서 실행했을 때 제가 오른쪽으로 움직여도 걷는 애니메이션을 한다는 거죠
왼쪽으로 움직여도
자 앞으로 갈 때 뒤로 갈 때 오른쪽 왼쪽
다 Velocity의 값이 있기 때문에 이렇게 되는 거죠
자 지금은 당연히 앞쪽 뒤쪽으로만 움직이니까
이렇게 해도 크게 문제는 없습니다
그런데 저희가 이제 하려고 하는 최종적인 형태는
좌우의 이동도 애니메이션을 넣을 거예요
그러면은 앞뒤만이 아니라 좌우에 대한 그 속도값도 우리가 알 필요가 있죠
자 그래서 이것을 좀 분리를 할 건데요
그래서 여기다가 일단 변수를 하나 더 만들고요
이거는 디렉션이라고 합니다
자 이렇게 해서 스피드 디렉션 이렇게 두 개를 만들 거고
이것의 의미는 이건 앞뒤로 움직이는 움직임의 크기를 담는 변수고
이거는 좌우로 움직일 때 크기를 담는 변수
이렇게 이해를 하시면 되겠습니다
자 그럼 Velocity에서 어떻게 하면 그 성분을 뜯어낼 수 있을까요
그거에 대해서 잠깐 배워보도록 할 건데요
자 그거는 이제 벡터의 곱을 이용해서 할 수가 있습니다
그 곱 중에서도 내적을 이용해서 처리를 할 수가 있어요
자 어떤 거냐면 벡터에서 곱을 쓸 건데
곱은 크게 보면은 외적과 내적이 있습니다
이번엔 내적을 해볼 건데요
내적이라는 것은 닷이죠 이렇게 닷이라고 표현합니다
닷 프로덕트에요
닷 프로덕트입니다
자 그러면 닷을 할 건데
닷은 이렇게 해요 이렇게 어떤 벡터가 이렇게 있고요
두 개가 이렇게 있다고 해보죠
자 그러면 벡터의 닷은 이렇게 씁니다
이렇게 해서 벡터 이렇게 쓰고요
이거는 다시 표현한다면 여기 벡터니까 a,b,c가 있겠죠
x,y,z가 있겠죠
자 그러면 a에 x가 있고 곱하기 b에 x를 합니다
그리고 더하기 a에 y와 b에 y를 곱해요
그리고 또 더하고 a에 z와 b에 z를 곱합니다
자 그러면 이거는 실제로 플로트 값이죠
그럼 결과적으로 이거의 값은 플로트 값이 하나 나와요
자 이게 이제 닷 프로젝트고요
이걸 했을 때 뭐 이런 개념이죠
만약에 이게 a고 이게 b라고 해볼게요
그러면은 지금 이거는 제가 약간 삐뚤어졌지만
그냥 바로 b라고 한다면 0,0,1이죠
얘도 0,0,1입니다
x,y,z 순서로 이렇게요
그러면 여기다 대입을 해보면 얘는 0,0,0,0,1 이렇게 돼요
그쵸 그러면은 이것은 결과가 뭘까요
이렇게 곱하면 당연히 1이죠
그래서 같은 방향 벡터는 결과가 1입니다
자 그러면 이렇게 생긴 벡터도 볼까요
이렇게 생긴 벡터하고 이렇게 생긴 벡터를 닷을 해볼게요
자 이게 a고 이게 b라고 했을 때
자 그러면 0,0,1과
그 다음에 이거는 0,1,0이죠
y가 1이니까 그쵸
자 그러면은 0 곱하기 1 곱하기 0 이렇게 되겠죠
자 얘는 몇이에요
0 곱하기 0 곱하기 0 아니 0 더하기 0 더하기 0이죠
그래서 0입니다
그래서 이렇게 수직인 거 이렇게 직각이에요
수직인 벡터를 두 개를 닷을 하면 얘는 0입니다
제가 말하는 0이고 1인 이유는 길이가 1인 경우에
이렇게 벡터의 길이가 1인 경우에
자 마지막으로 하나 더 있죠
이렇게 반대쪽 이렇게 이렇게 이렇게 180도로 반대쪽인 거
완전히 반대쪽인 거는 얘는 0,0,-1이죠
얘는 0,0,1이고요
자 그럼 여기다 대입해 보면 0,0,1이고요
0,0,-1입니다
얘를 곱하는 거예요
다 더합니다
그러면은 얘는 0이고 0이고 얘는 마이너스 1이죠
그래서 마이너스 1입니다
자 여기서 같은 방향이면 1이 나오고요
닷을 했을 때 이렇게 수직이면 0이 나오고
어 반대 방향이면 마이너스 1이 나오는 그런 성질을 가지고 있어요
닷이라는 것은
자 그래서 이걸 가지고 보통 이제 각도도 구하고 막 그러거든요
자 이거를 이렇게 증명할 수도 있고
아니면은 내적은 또 이렇게도 표현할 수 있어요
a.b 하면은 얘는
자 a에 이렇게 쓰면은 이 a라는 벡터의 길이를 스칼라를 말하는 거거든요
자 곱하기 b의 스칼라
곱하기 뭐 보통에는 코사인
어 곱하기 표현은 안하지만 여기다가 코사인 세타 이렇게 표현하거든요
자 그러면은 길이가 1이면은 얘가 1 곱하기 1이잖아요
그니까 이거는 없어지는 거고 코사인 세터만 남아요
코사인 세터를 그림으로 그리면
자 이거를 증명을 한다면 이렇게 됩니다
코사인이라는 거는 이렇게 생겼죠
이렇게 해서 뭐 구글 찾아보시면 있을 거예요
여기가 0이고 마이너스 1이고 1이라면
이렇게 해서 이렇게 나오고
그 다음에 이렇게 올라오고
이렇게 또 이렇게 이렇게 돼 있잖아요
이렇게 된 파동 형태로 돼 있는데
반대쪽도 이렇게 있습니다
자 그러면 여기가 몇이냐면
자 여기가 이제 어
2분의 파이예요
그리고 여기는 이렇게 되면 여기 마이너스 1이 닿는 곳 있죠
여기가 파이입니다
자 보통 이제 우리가 파이는 이거잖아요
라디안 얘기할 때 많이 나오는데
원을 이제 표현할 때 원의 각도나 둘레 길이 이런 걸 구할 때
우리가 이걸 반지름이라고 할 수 있습니다
자 그리고 보통 이제 우리가 각도를 얘기할 땐 두 가지로 하거든요
디그리가 있고 그 다음에 라디안이 있어요
디그리는 우리가 아는 0에서 360도
이런 걸 얘기하는 게 디그리이고
라디안은 반지름이 R이라면
여기 이 원의 이만큼이 R일 거예요
여기가 R이겠죠 R의 길이가 똑같겠죠
여기다가 이렇게 이렇게 하는 거죠
이게 이제 1라드죠 1라드고
그래서 이렇게 돌렸을 때 몇 라드냐
뭐 이렇게 얘기를 할 수 있는데
파이 라디안 하면은 180도입니다
90도가 2분의 파이고요
180도가 파이예요 이렇게 보면 되거든요
그래서 이렇게 표현할 수 있는데
결국은 여기가 90도라는 거고
여기가 180도인 거예요
그래서 코사인 90 하면은 몇이죠?
0이죠 코사인 90은 0이고
코사인 0은 1이에요
코사인 180은 마이너스 1입니다
이런 개념으로
그래서 이거랑 똑같아요
1 0 마이너스 1
그렇죠? 1 0 마이너스 1
여기가 1이고 0이고 마이너스 1이잖아요
그쵸? 각도에 따라서
이게 이제 각도가 증가하는 쪽이니까
각도가 0도면 1이고 90도면 0이고
180도까지 왔으면은 마이너스 1이 되는
그런 구조이기 때문에
이렇게 같은 결과를 볼 수 있거든요
자 어쨌든 이 벡터에
닷 프로덕트 이 내적을 이용하면
이런 식으로 방향을 기준 방향이 있으면
그 기준 방향에 다른 벡터를 곱해서
닷을 해서 같은 방향인지 반대 방향인지
뭐 이런 것들을 구할 수가 있습니다
자 이거를 이용해서 한번 구해보도록 할 건데요
이거는 이제 앞쪽을 의미한다고 했죠
그러니까 앞쪽 벡터랑
Forward 벡터랑 얘를 닷을 하면 돼요
자 그러면 여기에서 현재 이 폰에
Get Forward Vector가 있겠죠
벡터 Forward Vector 여기 있죠
Forward Vector와 이 Velocity를 닷을 합니다
닷이라고 하고요
닷 프로덕트
자 그러면 이게 float 값이 하나 나오죠
이걸 여기다 넣어 주시면 되고요
자 디렉션은 이렇게 가져와서
자 이 Velocity랑 Right Vector 하고
이번에는 해볼 거에요
그래서 Get Vector Right Vector
이걸 가져와서
자 얘네 두 개를 닷을 해줄게요
자 이렇게 닷을 해서 넣어 주시면 되겠습니다
제가 이제 일단 블루프린트를 하고 있는데
이거는 이제 C 에서 다시 해보도록 할 거에요
이렇게 하고 실행을 해보면
이제 앞뒤로 움직일 때는 이렇게 걸어지고요
좌우로 움직이면 애니메이션이 안되죠
네 이런식의 결과를 볼 수가 있습니다
자 그럼 이번에는 점프를 좀 띄워볼 건데요
자 그럼 점프를 띄기 위해서
이제 애니메이션이 있어야겠죠
자 그래서 제가 점프를 좀 준비를 했는데
자 이거를 좀 이용해 보도록 하겠습니다
자 그래서 여기다가 애니메이션 폴더
같이 하긴 좀 그러네요
그래서 애니메이션 폴더 하위에다가
하나 더 만들게요 폴더를
이렇게 해서 점프라고 하겠습니다
자 여기다가 넣어 줄게요
자 이거는 지금 필터링이 돼 있는데
이거 끌게요
자 원래대로 돌려놓고
여기 점프라는 폴더에다가
지금 플레이어 점프를 이렇게 해서 넣어 주도록 할게요
자 그러면 이렇게 물어봐요
스킬레톤을 뭐 쓸 건지
지금 제가 준비한 점프도
아마 그 언리얼4용으로 돼 있을 겁니다
자 이거죠
이거 말고 밑에 거요
자 이거를 선택을 하시고요
임포트를 해 줄 건데
그냥 하면 아마 오류가 날 겁니다
그래서 여기 어드밴스를 열어 보시면은
여기 스냅 투 클로젯 프레임
이런게 있어요
이거를 체크를 해 주시면 됩니다
자 이렇게 해서 임포트를 해 줄게요
자 그러면 이렇게 애니메이션이 임포트가 되었고요
자 그러면 이렇게 생긴 애니메이션 입니다
자 이것도 전부 다 리타게팅을 해 주도록 하겠습니다
지금 이거 하는 게 리타게팅이에요
자 그래서 리타게팅 애니메이션 에셋 해서
디플리케이트 하시고
아까랑 동일한 형태로
이렇게 지정하신 다음에
자 이거는 이제 프리셋을 뭘 할 거냐라는 거라서
안 바꿔도 되는데
저는 하는 김에 같이 하겠습니다
폴더를 선택하시고
자 그럼 점프
아 이것도 좀 애매하네요
이름이 똑같을 텐데
자 일단은 애니메이션 폴더에 그냥 넣어 볼까요
자 이렇게 하시고 리타게팅을 하겠습니다
자 그럼 이렇게 애니메이션이 잘 들어갔을 거고요
자 이를 보면은
네 잘 되는 것 같습니다
자 그럼 하위에 넣었던 점프는 삭제를 할게요
자 이렇게 해서 이제 점프 뛸 수 있는 애니메이션도
확보를 했고요
자 그러면 이쪽으로 와서 애닝그로피에서
Move FSM으로 오겠습니다
자 그럼 변수도 하나 있어야 돼요
뭐냐면 이렇게 해서 내가 공중에 있는가
자 그거를 체크하는 변수를 하나 만들겠습니다
자 불 타입으로 할 거고요
이것은 Is In Air 라고 할게요
뭐 Is Falling 이렇게 해도 되는데
공중에 있니 라는 뜻입니다
자 그럼 어떤 느낌이냐면
내가 움직이다가 공중에 있게 되었어요
자 그러면은 그때부터는 점프를 시작하는 거죠
자 보시면 점프 동작이 하나가 아니라 세 개로 되어 있는데
이렇게 Start, Loop, End 이렇게 세 가지 형태로 되어 있습니다
그래서 이거는 뛰기 전에 도움닫기고
공중에서 자세를 취하는 것이고
땅에 닿을 때 착지 동작이 되겠습니다
이렇게 세 개로 구성을 할 거고요
그래서 여기다가 배치를 해 줄게요
자 애니메이션에서 점프라고 하면은 나오겠죠
여기 Start, Loop, End 이렇게 세 개가 있습니다
자 이것을 처리하면 되는데
일단은 최종적으로는 이걸 쓰진 않을 거예요
우리 나중에 이제 Blend Space라는 걸 바꾸긴 할 건데
그래서 일단은 아이들 자세에서만
이렇게 점프를 뛸 수 있게 배치를 해 보겠습니다
자 이렇게 연결하고요
그리고 여기서 이렇게 연결하고
네 이렇게 이렇게 되는 거죠
네 그래서 점프를 뛰면은 이제 스타트를 하고
끝나면은 루프가 되고
그리고 내가 땅에 닿았으면 착지 동작하고
그 다음에 다시 아이들 자세를 취하는
그러한 형태로 할 거고요
그러면은 여기에서 조건이
그럼 Is In Air가 True일 때
공중에 떠 있을 때 가만히 있다가
얘가 허공이 되었어요
발이 땅에 닿지 않은 상태면
점프를 뛰는 동작을 한다는 거죠
자 이렇게 지정을 해주고요
그 다음에 이 동작이 끝나면
자동으로 이제 루프 상태로 갈 건데
여기를 선택해 보시면
여기에 Detail의 Automation 룰 뭐 이런 것들이 있습니다
그래서 요거를 체크해 주시면
이것은 이 애니메이션이 끝나면
자동으로 이렇게 전의를 해 주겠다 그런 뜻입니다
그래서 요거를 체크해 줄게요
자 그리고 루프에서는
공중에 허공이죠 허공인데
내가 만약 Is In Air가 False가 되었다
그러면 땅에 착지를 한 거잖아요
땅에 닿은 거잖아요
그러면은 착지 동작을 하는 거죠
자 그래서 이 조건에는
Is In Air를 가져오고
이거를 False일 때 이쪽으로 넣겠습니다
그러면은 여기 Not Boolean 이런 것들이 있거든요
자 이렇게 해서
이거는 이제 True를 False로 바꿔주는 일을 하는 녀석이에요
Not 이에요
자 이렇게 한 다음에 이렇게 넣어 주겠습니다
자 그리고 이 착지 동작이 끝나면
자동으로 이렇게 가만히 혀 있는 데로 와야겠죠
그래서 이것도 Automatic 룰 Base
이거를 체크를 해 줄게요
자 이렇게 구성을 하고요
자 이거는 Is In Air를 보면은
자 프리뷰에서 잠깐 볼까요
요거를 체크를 하시면
아 지금 여기 있네요
자 지금 현재 여기 있잖아요
그래서 이쪽으로 못 가는 겁니다
자 이거는 스피드를 0으로 해놓고 테스트를 할게요
자 Is In Air를 체크하시면 공중에 뜨고요
다시 푸시면은 땅에 닿게 됩니다
자 이런 식으로 이제 점프를 뛸 수가 있고요
자 그러면은 이제 점프를 뛰기 위해서는
음 이제 처리를 좀 해줘야겠죠
여기 보면은
이 녀석이 지금 뭘 가지고 있냐면
Movement 컴포넌트를 가지고 있어요
Get Movement 컴포넌트겠죠
근데 이게 아니라
저거를 Character Movement 컴포넌트로 바꿔서 사용해야 되거든요
그래서 이거를 지금 그대로 썼지만
얘를 이제 캐스팅을 해서 사용해야 될 것 같습니다
자 그래서 요거를 Cast To TPS Player로 이렇게 교체해 주신 다음에
네 요거는 제일 마지막에 할까요
자 이렇게 캐스팅 한 다음에
자 여기서 Get Character Movement 컴포넌트
여기 있죠 이거를 가지고 오고요
자 여기 안에 들어있는 Is Falling 이라는 게 있습니다
자 이거를 가지고
자 이거를 채워줄게요
자 컴파일 해주고요
실행해 보면 점프를 뛰죠
움직일 때는 안 돼요
지금은 이제 구성을 그렇게 했기 때문에
자 이렇게 점프가 잘 되는 걸 볼 수 있습니다
자 그러면 이거를 C 에서 한번 제어를 해볼까요
자 이쪽으로 와서
자 애님 인스턴스 잖아요
그러면은 툴즈에서
자 여기서 한번 검색해 보겠습니다
애님 인스턴스 여기 있죠
자 이거 상속받은 클래스를 하나 만들게요
이렇게 해서 이거는 플레이어 이름이니까요
TPS 이렇게 하겠습니다
자 크레이트 하시고요
자 여기 보시면은
어디서 했냐면 지금 블루프린트 업데이트 애니메이션 이라는 곳에서
이 작업을 하고 있어요
그래서 플레이어 애님은 헤더가 이렇게 생겼습니다
자 그래서 퍼블릭 이라고 하고요
자 블루프린트가 아니라 이거는 자 버추얼 업데이티브 업데이트 애니메이션
이렇게 해주시면 되고요
자 매개변수가
네 델타 타임이 넘어오네요
이거를 찾을 때는 애님 인스턴스로 들어가서 여기서 검색해 보시면 돼요
이렇게 생겼네요
자 이거를 그대로 복제해서 이렇게 작성해 주도록 하겠습니다
자 이렇게 해서 Alt-Enter 하시면은 구현부를 만들 수가 있고요
자 여기에서 그대로 작성을 해 줄 거고요
자 그리고 블루프린트에서 우리가 변수를 아까 3개 만들었는데
스피드 디렉션 인 이즈 인 에어 이거 만들었죠
이거 그대로 만들어 줄게요
자 여기다가 New Property
Edit Anywhere 라고 하시고요
자 플러스 스피드 이렇게 변수를 만들겠습니다
자 그런데 이게 블루프린트 상에서 사용을 할 수 있게 하려면요
자 블루프린트 리드 온리 혹은 리드 라이트를 이용을 해야 됩니다
일단 우리는 다 일단 열어 놓고 하죠
블루프린트 리드 라이트를 넣어 주겠습니다
자 스피드 디렉션 이즈 인 에어 3가지죠
자 스피드 디렉션
자 불타입의 이즈 인 에어라는 변수를 이렇게 만들었고요
자 이것을 업데이트 상태에서 채워 주도록 할게요
자 이쪽으로 가서 자 스피드
그 다음에 디렉션 그리고 이즈 인 에어 이렇게 3가지죠
자 이걸 하기 위해서 일단 오너를 가져와야 되요
try get phone owner 라고 할 수 있죠
이거 그대로 쓰면 되구요
자 그러면 이거를 가지고 할 건데
이거는 결국은 a tps player 잖아요
tps player
자동성이 좀 잘 안되네요
자 이렇게 해서 플레이어라고 하겠습니다
자 캐스팅을 해주고요
자 헤더를 추가해 주도록 하겠습니다
자 그러면 이렇게 플레이어를 사용할 수 있겠죠
자 플레이어에서 get velocity 가지고 올 수가 있거든요
자 이거를 fvector에 보면
dot product가 있습니다
자 이걸 이용해서 방향을 구할 거구요
그러면 이거는 이제 velocity니까
자 따로 만들까요
fvector로 velocity
자 이렇게 하고요
fvector forward
자 이거는 forward vector가 되겠죠
자 그리고 right vector도 있습니다
자 right는 여기가 right vector 이렇게 하면 되죠
자 이렇게 한 다음에
이제 dot을 해 볼게요
자 forward하고 그 다음에 velocity를 dot을 하겠습니다
자 이 값은 스피드에다 넣을 거구요
자 똑같이 해서 이건 디렉션에다가
자 이거는 right vector죠
자 이즈인에도 채워 주도록 할 거구요
자 여기는 플레이어의 character movement가 있죠
자 이걸 가져온 다음에
여기에 있는 isFalling이란 값을 채워 주도록 할 겁니다
자 이걸 사용하려면 당연히 헤더를 이렇게 추가를 해 줘야 됩니다
게임 프레임웍에 있는 이거를
이렇게 추가를 해 주셔야지 사용할 수가 있습니다
자 그리고 이거는 플레이어가 null일 때는 하면 안 되겠죠
null이 아닐 때만 채우도록 하겠습니다
이렇게 null 체크를 해 줄게요
그러면 이렇게 구성을 하고요
자 그 다음에 이거의 부모를 바꿔야겠죠
이렇게 한 다음에 일단 컴파일 한번 해 주겠습니다
자 그리고 부모를 바꾸기 위해서 이렇게 해서
tps-play-anim이죠 이렇게 교체를 할게요
자 그러면은 기존에 있는 값들이 이렇게 바뀌는데
이거는 이제 삭제를 해야겠죠
자 여기 블루프린트를 했던 내용을 이렇게 지우겠습니다
자 이거는 다 지워버리고요
자 그 다음에 스피드로 처리했던 것들
그게 지금 이걸로 제거 되고 있을 거예요
아직도 자 여기에 조건을 만들었잖아요
자 이렇게 보면은 스피드
네 스피드 0으로 되겠죠
자 그래서 이거를 find-reference 해가지고 이렇게 되어있는데
이거는 일단 지우고요
스피드
이걸 지우면 오류가 날 겁니다
이렇게 그러면 여기를 이제 스피드
get-speed 해서 가지고 와서 이렇게 채워 주시면 되겠습니다
여기도 있고 자 이걸로 복사해서
자 여기도 있죠 이렇게 해서 넣어 주시고
네 전부 다 이렇게 채워 주십시오
자 그리고 디렉션도 사용이 되고 있는지 볼까요
자 이렇게 해서 마우스 오른쪽 눌러서 find-reference 하시면
이거는 지금 사용이 되고 있지 않네요
그냥 지우면 될 것 같습니다
자 이렇게 처리를 해주고요
자 다시 돌아와서 여기도 잘 반영이 되요
자 그러면 실행을 한번 해보죠
자 이렇게 해서 점프
네 잘 되죠
자 이런 식으로 우리가 C 에서 이렇게 교체해서 사용할 수가 있구요
자 그러면은 마지막으로 저거를
이렇게 구성을 했는데
이거는 이제 좀 복잡해지잖아요
그쵸 이게 지금 앞뒤만 해서 그런데
좌우도 하고 대각선도 추가하고 이러면은
좀 처리하기가 좀 어려워집니다
그래서 이거를 대신하는 걸 하나 만들 건데
자 이쪽으로 와서 블루프린트 쪽에다 만들게요
마우스 오른쪽 누르고 애니메이션에 보면
블랜드 스페이스라는 게 있습니다
자 이거를 클릭하시구요
역시 마찬가지로 스켈레톤을 지정해 주셔야 돼요
자 그 다음에 이건 BS 언더바 TPS 플레이어라고 하겠습니다
자 이렇게 작성하시고 더블 클릭해서
여기 보시면 구성이 허리젠탈 버티컬 액시스가 2개 있어요
이렇게 펼쳐보시면 되는데
자 여기 이름을
허리젠탈은 우리가 디렉션으로 했죠
디렉션이라고 하고요
그 다음에 버티컬은 스피드라고 하겠습니다
자 이렇게요
그러면 이게 이쪽이 버티컬이고 이게 허리젠탈이죠
자 그럼 여기다 애니메이션을 배치를 해주면 되는데
자 먼저 아이들부터 해볼게요
아이들을 가운데다 놓겠습니다
근데 배치할 때 약간 잘 안 맞죠
쉬프트를 누르시면 점에 딱딱딱 배치를 할 수가 있어요
쉬프트를 누른 상태에서 배치를 하겠습니다
자 그 다음에 워크라고 하시구요
그 다음에 이거는 백워드죠 여기다 놓고
자 이건 포워드
그 다음에 레프트
라이트 이렇게 배치를 하겠습니다
그 다음에 컨트롤 키를 누르면은
이렇게 포커스를 움직일 수가 있는데요
마우스를 클릭하지 않았어요
컨트롤 키만 누른 상태에서 마우스 움직여 보면
이제 이쪽에 애니메이션이 이렇게 블렌딩이 됩니다
이렇게 섞어주는 거예요
대각선을 이렇게 하고
이런 기능이 있으니까
이걸 한번 사용해 보도록 할 거구요
자 이렇게 하고 저장합니다
자 그리고 이쪽으로 돌아와서
지금 이렇게 하고 있는데
이건 이제 쓰지 않구요
이거 대신 여기서
이렇게 처리를 해줘야 될 것 같습니다
노드를 하나 만들게요
add state 라고 하구요
이거는 move bs 라고 하도록
블렌드 스페이스니까요
자 여기 들어가서 여기다가
아까 전에 우리가 만들었던 bs tps 플레이어죠
그대로 적어 볼게요
bs tps 플레이어
이렇게 하면 이렇게 나오죠
자 여기서 뭐 제일 위에 있는 거 할까요
이렇게 눌러보시면 이렇게 나옵니다
자 여기다가 우리 디렉션
get direction 이렇게 가져오시고
get speed 이렇게 가져오셔서
여기다 넣어주세요
이렇게 이렇게
자 C 로 만든 변수죠
자 이렇게 하시면 이렇게 되구요
그 다음에 이걸 아웃풋에다 넣어주시고
컴파일 하면 이렇게 나옵니다
자 이렇게 생겼죠
자 그리고 이렇게 한 다음에
다시 뒤로 온 다음에
자 기존에 있던 이 내용을 사용하지 않구요
이건 옆에서 치워버리고
자 이거를 사용해 보도록 하겠습니다
자 그러면 이거를 다시 만들어야겠죠
이거는 끊어버릴게요
Alt 누르고 클릭 클릭하면은 끊어집니다
이렇게 다시 이렇게 이렇게 배치를 하고요
엔트리도 이쪽에다가 연결하고 있습니다
이건 이제 안 쓰고요
이쪽으로 와서 이걸 쓰게 되겠죠
자 이거는 점프니까요
이거 다시 이지네어 가져와서
그대로 넣어 주시구요
그리고 이거는 자동이죠
오토매틱 이렇게 체크를 해 주시구요
그 다음에 생각해 보니까
이 Blend Space 범위를 좀 잘못한 것 같아요
자 이거를 디렉션 600 그리고 마이너스 600
이렇게 해야겠죠
자 그럼 스피드도
x를 600 그리고 이거를 마이너스 600
자 이렇게 범위를 다시 재조정해 주겠습니다
위치를 다시 이렇게 해 주시구요
Shift 누르고 움직이면 이렇게 딱 붙일 수 있습니다
자 이렇게 구성을 해 준 다음에
저장하고 다시 돌아와서
Blend Space 보통 이렇게 하면은
이게 제대로 반영이 안 될 때가 있더라고요
그래서 지우고 다시 반영해 주도록 하겠습니다
여기 이렇게 해서 Blend Space를 이렇게 넣어도 돼요
자 Blend Space가
이렇게 해서 집어넣어도 됩니다
자 이렇게 연결해 주시구요
자 컴파일 합니다
그러면 잘 반영이 되죠
자 실행해 볼까요
자 앞으로 뒤로 좌우 잘 반영이 되는 것 같구요
점프도 걸을 때도 점프 이제 뛸 수 있죠
이번 단원에서 학습한 내용을 정리하도록 하겠습니다
블루프린트를 적용한 애니메이션 동작 처리 이동 상태 애니메이션 애니메이션 애셋을 프로젝트에 추가하고 ABP_TPSPalyer 블루프린트를 제작함
[대기상태]와 각 방향 [이동상태]를 양방향으로 트랜지션 연결함 Folat 타입의 Speed 변수를 각 [float] 비교 노드와 연결함
[Get Velocity] 노드와 연결되는 [Vector Length] 노드를 생성 후 Speed 변수를 [Set] 노드로 추가함
[Cast To ABP_TPSPalyer] 노드가 성공했을 때의 실행 핀과 [Speed Set] 노드를 연결함
Direction 변수 추가 후 벡터의 내적을 이용해 앞·뒤 움직임과 좌·우 움직임이 다르도록 처리함
점프 상태 애니메이션 JumpStart 등록 후 [Idle] 상태 노드와 트랜지션 연결함
공중에 있는 지 여부를 기억할 변수 IsInAir 선언 후 참일 때 트랜지션이 발생하도록 설정함
[Idle] 상태 노드 - [Jumpstart] - [JumpLoop] - [JumpEnd] - [Idle] 상태 노드로 트랜지션을 연결하고 조건을 설정함
C 및 블렌드 스페이스를 이요한 애니메이션 동작 처리 C 을 이요한 동작 처리 AnimInstance를 검색해 상속받는 클래스로 TPSPlayerAnim을 생성함
TPSPlayerAnim.h 파일에 함수 선언부를 복사한 후 오버라이딩 함 블루프린트에서 사용할 수 있도록 UPROPERTY 지정자로 BlueprintReadWrite를 입력함
Speed, Direction, IsInAir 변수 선언 후 각 변수에 맞는 값을 할당함
블렌드스페이스를 이용한 동작처리 블렌드스페이스 생성 후 BS_TPSPlayer로 이름 설정
애셋 디테일 창에서 블렌드 스페이스 축 값을 설정함 [Idle_Rifle_Ironsights]를 에디터 그리드 창에 등록 후 각 방향에 맞는 애니메이션 시퀀스를 배치함
[MoveBS] 상태 노드 생성 후 Blendspace 'BS_TPSPlayer'를 선택해 [BS_TPSPlayer] 노드를 생성함
Direction, Speed, 변수 추가 후 [BS_TPSPlayer] 노드의 Direction, Speed에 각각 연결함
[MoveBS] - [JumpStart], [JumpEnd] - [MoveBS] 방향으로 트랜지션을 연결함 IsInAir 변수를 그래프창에 등록 후 [Result] 노드에 연결함