내가 Satellite 프로젝트에서 구현했던 AimOffset을 구현한다고 한다.
이를 위해선 Animation 중에서 Aim Offset이라는 종류의
Animation을 사용한다.
(여태 사용하던건 Animation 자체)
AimOffset은 애초에 Aim을 위해서 개발된 Animation종류이고,
기본 Animation에 추가를 할 수 있는 형태이다.
그래서 달리거나 이동하는 동안 간단히 추가할 수 있다고 한다.
AimOffset은 암묵적으로 이름에 AO라는 단어를 포함한다.
따라서 기존의 포즈를 Base로 가지도록 연결하면 된다.
그리고 Yaw, Pitch를 캐릭터에서 적절히 받아오고 연결하면 될 것이다.
Get Control Rotation을 사용하여 Aim pitch값을 받아와서 적용시킨다면,
이상하게 동작한다.
위는 잘 보는데 아래를 보아도 위를 쳐다보는 Satellite와
똑같은 문제가 발생한다.
이를 해결하기 위해선, Actor Rotation을 빼준다.
Rotator의 뺄셈은 Delta라는 노드로 진행한다.
이러면 정상적으로 되는데 왜?
Control Rotation은 사용자에 의해 제어되는 회전을 의미하고,
Actor Rotation은 게임 속 엑터의 실제 회전을 의미하는데,
Control Rotation과 Actor Rotation에 차이가 있을 수 밖에 없고,
Control Rotation에서 빼준다.
그래야 Set의 AimPitch가 적용될 때,
Actor의 애니메이션이 자연스럽게 적용되기 때문인 것 같다.
Control의 SpringArm을 기준으로 회전한다면 이상하기 때문.
AI도 Pitch(위아래) 회전하도록 만들고 싶다.
플레이어를 보도록 하기 위해선 위의 코드를 바꿔야한다.
우선 BB부터 바꾼다.
기존의 Vector엿던 PlayerLocation을 Object형으로 바꾸고,
Actor를 상속받게 설정한다.
그리고 Service Node와 연결된 값들을 수정하고
코드를 수정한다.
Vector에서 Obejct로 바뀌었으니, 코드도 당연히 바뀌어야한다.
그렇게 되면 최종적으로 상위노드에서 Player Object변수가 갱신되고,
Decorator조건에 맞다면, ServiceNode들이 실행되는데,
이 중 SetDefaultFocus라는 기본 노드에 의해서,
PlayerObject를 보게 만든다.
따라서 AI도 Pitch가 적용이 된다.
단순한 PlayerLocationVector에서 Object를 보도록 만들었기 떄문에 가능한 일
Animation의 StateMachine을 드디어 사용한다.
Jump Animation은 StateMachine으로 구현.
StateMachine을 생성하고, 내부에 위처럼 작성한다.
Grounded는 땅에 닿아있는 상태로 사용한다.
기존에 만들어둔 땅에 닿아있는 상태에서의 움직임을
잘라서 붙여넣는다.
이제 StateMachine내의 Grounded상태는 위의
Blend Space Animation을 재생하게 되는 것이다.
bool값에 따라 상태가 전환되게 하였다.
bool값은 이전의 다른 animation관련 변수들과 같이
AnimInstance CPP에서 따로 설정하기보다,
BP AnimGraph에서 설정한다.
따라서 위처럼 CharacterMovement의 IsFalling노드를 활용하여
간단히 점프중인지 파악할 수 있다.
점프시작 - 점프중 - 착지
Jumping은 시작을 의미한다.
Airborne은 점프중을 의미한다.
여기서 Jumping State의 모션은 발을 들어올려 점프하는 것인데,
Airborne State의 모션으로 전환이 되는 조건을 설정하기 위해서
해당값을 체크하고, 시간은 0.05초로 하였다.
해당 설정의 의미는 이전 모션이 모두 실행될 때 즈음에
한쪽은 서서히 없어지고, 한쪽은 서서히 생긴다는 말이고,
blendSetting에서 그 시간을 0.2에서 0.01로 바꾸어 바로 변하게 한다.
그러면 굳이 Transition 내부에 조건을 설정하지 않고도
오류가 발생하지 않는다.
그런데 0.01은 너무 부자연스럽게 변하기 때문에,
0.2로 바꾸고,
0.2인데도 좀 느리다 싶으면, Mode를 수정한다.
ExpOut으로 설정하면 blend곡선이 변경되는 듯 하다.
이름을 직관적으로 바꾸었다.
이번에는 Death모션도 Blend없이 바로 만들어본다.
State Machine이름을 Live로 수정한다.
Live 내부엔 2가지 상태가 있는데, 살아있음, 죽음
살아있음이 기본이고 죽음으로 가기 위해선,
IsDead값에 따라 설정된다.
Alive의 그래프는 바로 위의 이미지처럼,
방금 설정한 StateMachine을 포함하는 StateMachine외 되게 한다.
즉 복잡한 애니메이션을 깔끔하게 구현하기 위해선
StateMachine으로 묶어주는 것이 가장 좋은 방법으로 보인다.
맵에 위의 엑터를 배치하면 된다.
아무데나 배치해도 전역적으로 들을 수 있다.
배치하고 원하는 Sound로 바꾸면 된다.
이것으로 모든 배움이 끝났고,
Satellite 프로젝트의 진행에 많이 도움이 될 것 같았다.전면적으로 수정하려고 한다.
애초에 만들어 둔 것도 많이 없어서
처음부터 다시 만들 예정이다!