# 블루프린트
1. 3인칭 게임 생성
2. 콘텐츠 브라우저 - ThirdPerson - Blueprints 에서 BP_ThirdPersonCharacter 더블 클릭

3. 카메라 위치 및 회전 설정
3-1. Camera Boom 컴포넌트 클릭

3-2. Camera Boom의 높이와 길이 조절


3-3. 카메라 세팅에서 회전 모두 비활성화

이제 캐릭터의 회전에 따라 카메라가 영향을 받지 않게 된다.

4. 캐릭터 회전
4-1. 캐릭터 무브먼트 컴포넌트 클릭

4-2. 무브먼트 방향으로 회전 조정 체크

5. 마우스 카메라 회전 제거
5-1. BP_ThirdPersonCharacter 선택

5-2. 디테일 패널에서 "action" 검색
5-3. LookAction과 Mouse Look Action 제거

이렇게 해줘야 마우스 회전에 따라 카메라도 같이 회전하지 않게 된다.
이제 플레이어는 카메라를 회전시킬 수 없고 개발자가 제공하는 각도로만 세상을 바라본다.
6. 캐릭터 회전 제어
템플런류 게임은 정면에 막다른 길이 나오고, 양쪽으로 갈 수 있는 길이 있을 때만 캐릭터가 좌우로 90도 회전하고,
직선 거리에서는 90도 회전을 하지 않는다.
그러나 언리얼 기본 캐릭터는 키 입력을 하면 해당 방향으로 천천히 90도로 회전한다.
이를 차단한다.
6-1. BP_ThirdPersonCharacter 선택

6-2. 디테일 패널에서 "yaw" 검색
6-3. 폰 - "컨트롤러 회전 요 사용" 체크

이렇게 하면 더 이상 90도 회전을 하지 않는다.
체크박스 전

체크박스 적용 후

이제 캐릭터 회전에 대한 로직을 짜서 내가 원하는 상황에서만 90도 회전을 시켜주면 된다.
7. 내 블루프린트 - 변수 - 변수 추가
7-1. bool 값으로 "Can Turn" 변수를 생성한다.
7-2. Rotator 값으로 "Desired Rotation" 변수를 생성한다.

변수를 생성하고 컴파일 버튼을 누르면 변수의 디테일 패널을 확인할 수 있다.
여기서 Can Turn의 경우 원활한 테스트를 위해서 디테일 패널에서 기본값에서 체크 박스를 선택해서 항상 true 상태로 만들어 둔다.

8. 이벤트 그래프 - 입력 및 회전
8-1. BP_ThirdPsersonCharacter 이벤트 그래프로 간다.

8-2. 이벤트 그래프의 빈 공간에서 우클릭 - "keyboard" 입력 후 A키와 D키를 찾아 각각 추가한다.


D키부터 Pressed일 때, D키가 눌렸을 때 실행할 로직을 작성한다.
논리 구조를 완성해야 한다.
1). D키가 눌렸을 때,
2). 캐릭터가 90도 회전할 수 있는 조건일 때
3). 현재 회전 값에서 + 90도를 더한 값으로 회전 값을 바꿔주고
4). 카메라를 회전시킨다.
9. D키
1). D키가 눌렸을 때,

2). 캐릭터가 90도 회전할 수 있는 조건일 때

3). 현재 회전 값에서

+ 90도를 더한 값으로 회전 값을 바꿔주고

combine Rotators 함수를 이용해 지금 기록한 회전 값에서 +90도를 더하여 다시 목표 회전 각도를 재설정해준다.
4). 카메라를 회전시킨다.


Camera Boom은 컴포넌트에서 드래그 앤 드랍으로 이벤트 그래프에 놓으면 가져올 수 있다.


원활한 테스트를 위해서 CameraBoom의 "요 상속" 체크를 해제하고 본다.
체크되어 있으면 회전하는 방향으로 카메라도 같이 회전하려고 해서 정상적으로 회전하고 있는지 식별하기가 힘들다.
해당 로직을 작성하고 카메라 요 회전을 끄고 테스트하면 아래와 같다.

로직을 작성하기 전과 똑같은 결과를 보여준다.
이벤트 그래프의 노드를 선택하고 F9번을 통해 중단점을 걸어준 뒤 플레이 버튼을 누른 뒤 확인해보면


Yaw값이 90도로 잘 들어와 있다.
그럼에도 회전이 되지 않은 이유는 이 회전 값을 캐릭터에게 적용시켜주지 않아서 그렇다.
이 회전 값을 적용하는 로직을 작성해야 한다.
10. 회전 로직
현재까지의 회전 로직은 다음과 같다.
"D키를 누르면 현재 회전 값에 +90도를 더한 값이 DesireRotation 변수에 저장되어 있다."
이제 만들 로직은
"캐릭터가 DesireRotation의 회전값이 될 때까지 계속 회전 값을 바꿔준다."
1). Custom Event 추가

"Turn"으로 이름을 지어준다. 이름은 어떻게 지어도 상관없다.

2). branch를 만든다.

branch는 어떠한 조건이 true일 때와 false때의 실행흐름을 구분지을 수 있는 기능이다.
3). 분기 조건 : "현재 회전 값이 Desired Rotation에 도달하지 못했다면"

여기서 현재 회전 값을 가지고 있는 녀석은 Get Control Rotation 함수이다.
정확히 말하면 회전 값을 캐릭터가 가지고 있는게 아니라 Controller(컨트롤러)가 가지고 있다.
코드로 봐도 결국 컨트롤러의 회전 값을 가져오고 있다.

아무튼 현재 회전 값이 Desired Rotation과 일치 하지 않는다면 True 분기로 넘어가며, 여기서 회전 로직을 완성시켜준다.
마지막에 "0.0001"값을 넣어준 이유는 회전의 미세한 오차를 인정해주기 위해서다.
4). 컨트롤러를 회전시켜준다.



완성된 로직은 다음과 같다.

이제 누군가가 Turn 이벤트를 호출해줘야 한다.
이를 우리는 매 프레임 동작하는 함수인 Tick을 이용해서 처리한다.
5). Tick에서 Turn 조건을 검사한 뒤 회전시키도록 한다.


이제 회전이 의도한대로 동작한다.
이제 A키도 완성시켜준다.

기존 D키와동일하고 유일하게 다른 점은 D키는 회전 값에 +90도였다면, A키는 회전 값에 -90도를 결합시킨다.
이렇게하면 A, D키를 통한 90도 회전이 완성되었다.
11. 캐릭터를 서서히 회전시키기
여기서 디테일을 높여주기 위해서 90도 회전을 천천히 시켜주도록 한다.
게임에서 가장 많이 쓰이는 기법으로 변화를 서서히 표현하는 기법을 "선형보간"이라고 한다.
현재 상황 A에서 목적지인 B까지(90도 또는 -90도) 한번에 바꾸는 것이 아니라 시간의 흐름에 따라 서서히 변화를 주는 작업이다.
이걸 언리얼에서는 interp 라고 부른다.
여기서 회전 값에 대한 보간이므로 앞에 R을 붙여 RInterp라고 한다.

Turn의 기존 로직에서 기존 부분을 제거하고

R Interp To 함수로 대체한다.

여기서 델타타임은 Get World Delta Seconds 함수로 연결해준다.
여기서 0번 인자인 Current 회전 값과, 목표 회전값을 입력해줘야 하는데 우리는 이 값을 둘 다 알고 있다.
현재 회전 값은 컨트롤러의 회전 값을 가져오고

목표 회전 값은 Desired Rotation에서 가져온다.

보간 속도는 10 정도로 준다.

이제 테스트해보면 이전보다 자연스럽게 회전한다.

11. 이동
마지막으로, 캐릭터는 계속 전방으로 달려가야 한다.
캐릭터 무브먼트 컴포넌트의 Add Movement Input 함수를 통해 캐릭터를 이동시킬 수 있는데,
이 때, Tick 함수를 통해 매 프레임마다 앞으로 이동시키면 된다.
앞을 알려주기 위해 Get Forward Vector 함수를 사용한다.

그런데 이렇게 하면 앞으로 계속 달려가긴 하지만 템플런과 다른 점이 발생한다.
좌우 방향을 틀었을 때 해당 방향으로 정상적으로 이동하지 못하고 계속 앞으로만 이동한다.

해당 방향으로 이동하는 로직을 추가해줘야 한다.
즉, 키 입력에 따라 바뀌는 회전 방향의 전방을 다시 구해줘야 하는데 현재 이동 방향의 전방을 알고 있는 녀석은 컨트롤러다.

이제 의도한 방향으로 잘 이동한다.

마지막으로 해당 방향으로 카메라가 함께 회전해주면 된다.
아까 만들어둔 키 입력에서 Camera Boom의 요 상속 체크를 다시 활성화해주면 된다.

최종 테스트

이제 템플런 캐릭터 준비가 끝났다.
'Unreal Engine > 기능 구현' 카테고리의 다른 글
| [Unreal Engine 5] Blueprint : 애니메이션 블루프린트(1) : 이동 (0) | 2025.10.15 |
|---|---|
| [Unreal Engine 5] 스켈레탈 메시가 여러 개일 때 애니메이션 적용(+메타휴먼) (0) | 2025.10.15 |
| [Unreal Engine 5] Draw Call(드로우 콜) 확인 (0) | 2025.09.30 |
| [Unreal Engine 5] AbilitySystem Debug 관련 (0) | 2025.09.28 |
| [Unreal Engine 5] 코드로 콘솔 명령어 추가 (0) | 2025.09.26 |
