SpringArm 컴포넌트 추가
기존에 카메라만 추가해서 시점의 움직임을 봤을 때에 시점에서 캐릭터가 사라져버리는 문제를 해결해본다.
BP_Player 블루프린트에서 SpringArm 컴포넌트를 추가해준다. 이제 Camera를 SpringArm에 붙여준다.
이제 마우스의 움직임이 Camera가 아닌 SpringArm을 움직이게 바꾸는 것이다.
Camera의 트랜스폼은 디폴트값으로 다시 바꿔주고, CameraOptions / Use Pawn Control Rotation은 체크 해제 해준다.
반대로 SpringArm의 CameraSettings / Use Pawn Control Rotation을 체크해준다.
Camera의 시점을 높혀주기 위해서 SpringArm의 트랜스폼을 통해서 Camera의 위치를 잡아준다.
SpringArm컴포넌트의 값만 바꿔주면 거기에 묶여있는 Camera는 자동으로 위치가 조정이 되는 것을 볼 수 있다.
이렇게 설정하는 이유는 벽에 완전히 붙었을 때 Camera화면이 사물을 뚫지 않고 자연스럽게 나오도록 해주기 위해서다.
때문에 수치는 절대적인 것은 아니므로 자연스럽게 나오도록 알아서 잘 조정해주자.
※만약에 SpringArm이 충돌에 반응하는 것을 빼고 싶다면 SpringArm의 Camera Collision / Do collision Test 체크를 해제
SpringArm을 쓰는 이유!
벽이나 사물에 충돌에 대해서 늘어났다 줄어들었다를 나타낼 수 있다.
뷰포트에 SpringArm을 보면 빨간선이 보일텐데, 그 빨간선이 늘고 주는 효과의 경로를 나타나는 것이다.
캐릭터 이동 수정
BP_Character의 이벤트그래프를 보면 저번에 만든 MoveFB/LR을 보자.
지금까지 캐릭터의 이동이 이상했던건 캐릭터가 World 좌표를 기준으로 움직이고 있었기 때문이다.
따라서 카메라가 바로보고 있는 방향에 따라 움직임을 수정해줄 것이다.
카메라가 보는 곳을 정면으로 하여 캐릭터를 움직이는 방식으로 해볼 것이다.
World Direction에 이 카메라가 바라보는 방향을 넣어주어야 하므로 Get Actor Forward Vector / Get Actor Right Vector
노드를 추가해준다.
- Get Actor Forward Vector : 액터의 전방값을 가져온다.
- Get Actor Right Vector : 액터의 우측값을 가져온다.
이 두개의 노드를 각각 Add Movement Input노드의 World Direction에 연결해주면 카메라의 방향에 맞춰 이동된다.
캐릭터 애니메이션 추가하기
캐릭터 동작에 분기를 둬서 상황에 따라 맞는 애니메이션이 나오도록 한다.
현재 레벨로 나가서 콘텐츠브라우저 우클릭 - 애니메이션 - 애니메이션 블루프린트 추가해준다.
부모클래스 : AnimInstance(기본값)
타깃 스켈레톤 : Mannequin_Skeleton(우리가 SkeletalMesh를 쓰고 있기 때문)
선택 후 확인을 눌러 애니메이션 블루프린트를 생성한다.(ABP_Character)
BP_Character / Mesh 컴포넌트에서 Anim Class : ABP_Character 애니메이션 블루프린트를 넣어준다.
최종 애니메이션이 화면에 나오게 될 애니메이션을 뜻한다.
상황에 따라 분기를 통해서 애니메이션이 나오도록 하기 위해서 스테이트 머신을 추가해준다.
(Branch 노드가 있지만 Anim에서는 실행핀이 없어서 사용할 수 없다.)
machine 노드 검색을 통해서 스테이트 머신 노도를 추가해줬다(Locomotion).
Pose핀을 서로 연결해두고 machine 내부로 더블클릭하여 들어간다.
스테이트 머신 내부에 기본으로 Entry노드가 있는 것을 볼 수 있다. 이 Entry가 진입지점이라고 볼 수 있다.
따라서 처음 시작상태인 Idle을 추가해줄 것이다.
우측 하단에 에셋 브라우저 탭에서 Idle 애니메이션을 끌어와주면 해당하는 노드가 생성된다.
마찬가지로 Idle에서 넘어갈 상태인 Run 애니메이션도 끌어다 노드를 만들어준다.
애니메이션 노드끼리 연결 시, 자동으로 트렌지션 룰이 생성이 되는 것을 볼 수 있다.
트렌지션 룰을 더블클릭하여 들어가면 Idle → Run으로 가기위한 조건을 걸어줄 수 있다.
트랜지션 내부에서 결과가 true일 시 넘어가게되고, false이면 넘어가지 못하게 되는 것이다.
여기선 Idle → Run의 조건으로 속력을 통해 판별할 것이다.
- Get Owning Actor : 현재 Actor의 타깃
- Get Velocity : 타깃의 속도
- VectorLengthXYSquared : Vector의 x,y 값의 제곱. z축을 뺀 이유는 위아래로 움직일 때 모션이 나오면 안되기 때문.
- NotEqual(!=) : 해당하는 값이 0.0과 같지 않을 때 true 같으면 false
이렇게 Idle→Run 트렌지션 룰을 만들었다면, Run→Idle의 트렌지션 룰도 똑같이 생성한다.
하지만 Run의 속도에서 0.0으로 속도가 내려가야 Idle이 나오는 조건이므로 Equal(==)로 바뀌어야 한다.
여기서 주의해야하는 점이 있는데 이는 밑에서 설명하겠다.
시스템에서 띄워주는 경고를 없애면서 Idle→Run / Run→Idle 트렌지션 룰이 사실상 같은 로직이므로 이를 일원화
시켜주는 것이 좋다.
따라서 저 값을 변수로 저장해두고 사용할 것이다.
변수로 승격을 통해서 Speed변수를 만들어준다. 그리고 이벤트그래프에서 Speed변수에 값을 넣어주게 된다.
여기서는 조금 더 정확한 속도를 구해주어야 하기 때문에 VectorLengthXY노드를 사용하게 된다.
여기서 주의할 점!
멀티스레드는 한 프로그램에서 특정 시점에서 여러가지 흐름으로 나눠 진행하는 것을 뜻한다.
애니메이션은 비용이 비싼편이라 흐름을 분할해서 멀티스레드로 진행한다.
그래서 여기서 데이터 동기화 문제로 위험하다는 의미로 스레드 안정성이 확보되지 않았다는 경고가 뜨게된다.
또 다른 문제인 부동소수점(float)의 연산에서의 문제이다. Float는 ==과 !=의 연산을 주의해야한다.
그런데 애니메이션에서 사용할 수 있는 이유는 정지상태에서의 속도는 무조건 0.0으로 될 것을 알기 때문이다.
따라서 부동소수점 연산의 오차가 발생할 수도 있으니 주의해야 한다는 것이다.
'언리얼엔진' 카테고리의 다른 글
10. PlayerController / Game Mode Base (2) | 2023.05.11 |
---|---|
9. 캐릭터 좌우 이동 수정하기 (0) | 2023.05.10 |
6. Asset / Character 살펴보기 (0) | 2023.05.06 |
5. Construction Script / 이벤트 / 함수 / 매크로 / 와일드카드 (0) | 2023.05.03 |
4. 블루프린트 함수 디테일 (0) | 2023.05.03 |