블렌드 스페이스와 움직이는 액터
1. 캐릭터 애니메이션
1. 개념 설명
캐릭터의 생동감을 주기 위해서는 역시 애니메이션이 가장 중요하다.
- 애니메이션 블루프린트
- 애니메이션 블루프린트의 구조
- 애니메이션 블루프린트 안에는 Anim Graph와 Event Graph 가 존재한다.
- 간단히 설명하면, 이벤트 그래프는 상태를 파악할 수 있는 변수들을 저장하며, 애님 그래프는 그 값을 통해 애니메이션을 재생하는 곳이다.
- Anim Graph: 캐릭터에 대한 애니메이션 별 로직을 생성된다.
- 블렌딩, 본 트랜스폼, 로코모션 등의 노드가 포함된다.
- Event Graph: 애니메이션 BP의 Event Graph는 특별한 애니메이션 관련 이벤트 컬렉션을 사용하여, 노드의 시퀀스를 개시하는 역할을 한다.
- 블렌드 스페이스에서 사용할 Axis 값 중 하나인 Speed 값을 가져오기, 현재 캐릭터의 상태를 가져오는 등의 작업을 한다.
- Event Graph에 존재하는 이벤트 컬렉션
- Begin Play: 게임 시작 시 실행되지만, 액터의 Begin Play 보다는 먼저 실행
- Initialize Animation: 애니메이션 블루프린트 인스턴스가 생성될 때 한 번 실행
- Update Animation: 프레임마다 실행되어, 애니메이션 블루프린트가 필요한 값에 대한 계산 및 업데이트 수행 (Default로 만들어져 있는 이벤트 - 아래 왼쪽 사진에서 볼 수 있음)
- 등등
- 블렌드 스페이스: 다수의 애니메이션 또는 포즈를 1차원 또는 2차원 그래프로 구성하여 블렌딩 하는 에셋
- 블렌드 스페이스는 여러 상태를 섞어서(Idle 상태 + Run 상태) 만든다.
- 만든 블렌드 스페이스는 애니메이션 BP에서 사용한다.
- 블랜드 스페이스 세팅
- Axis Setting: 먼저 우리가 사용할 축의 이름과 범위를 지정한다.
- 해당 값에 맞는 애니메이션을 추가한다.
- (Shift 키 누른 상태로 두면, 선에 딱 붙어서 놓을 수 있다.)
- Ctrl 누른 상태로 초록색 X표시를 움직여서, 현재 값에 대해 출력되는 애니메이션을 볼 수 있다.
- 애니메이션 블루프린트 세팅
- 이벤트 그래프 세팅
- 기본 및 이동 상태
- 이동하기 위해서는 캐릭터의 스피드 세팅이 필요하다.
- 점프 (기존에 만들어져있는 Bot_BP를 참고해서 만들었다.)
- 점프를 위해서는 현재 캐릭터의 상태가 필요하다.
- 땅에 있는지 하늘에서 떨어지는 상태인지
- 키보드 입력을 받은 상태인지
- 점프를 위해서는 현재 캐릭터의 상태가 필요하다.
- 기본 및 이동 상태
- 애님 그래프 세팅
- 기본 및 이동 상태
- 블렌드 스페이스에 이벤트 그래프에서 계산한 스피드 값을 넣어준다.
- 이때 Cached Pose를 사용하였다. Cached pose는 결과 포즈를 저장해 두어 다른 곳에서 사용할 수 있기 때문이다.
- 점프
- State Machine을 하나 만들어서 그 안에 Idle and Run 상태와 점프 및 떨어지는 상태를 함께 구현하였다.
- State와 Alias를 사용했다.
- State: 캐릭터나 스켈레탈 메시가 블렌딩하여 드나드는 애님 그래프의 한 부분, 간단히 생각하면 캐릭터의 특정한 상태를 말한다.
- 각 State는 트랜지션으로 연결할 수 있다.
- 트랜지션은 어떤 상태에 다른 스테이트로 바꿀지에 대한 정보가 있다. (자동 규칙 옵션도 있음-아래 사진)
- Alias: 복잡한 상태를 간단하게 해줄 수 있는 노드이다.
- Alias 를 만들면, 현재 어떤 상태를 나타낼지를 체크하는 부분이 존재한다.
- 체크한 상태에서 특정 조건(트랜지션)을 만족하면, 다른 상태로 이동할 수 있게 해주는 것이다.
- 말로는 설명이 조금 어려울 수 있어서, 언리얼 docs에 예시 사진을 추가하였다.
- 왼쪽이 Alias를 사용하지 않은 상황이고, 오른쪽이 Alias를 사용한 상황이다.
- MyAlias는 Locomotion과 Land 상태를 나타내고 있기 때문에, 왼쪽 처럼 복잡한 그래프를 오른쪽과 같이 분리시켜, 간단하게 표현할 수 있다.
- State: 캐릭터나 스켈레탈 메시가 블렌딩하여 드나드는 애님 그래프의 한 부분, 간단히 생각하면 캐릭터의 특정한 상태를 말한다.
- 기본 및 이동 상태
- 이벤트 그래프 세팅
2. 세팅 내용
- 애니메이션 BP의 이벤트 그래프
- 노란색 부분: 가져온 Pawn이 제대로 된 것인지 파악하는 부분
- 파란색 부분: 캐릭터의 속력을 가져오기 -> Speed 변수 Set
- 주황색 부분: 캐릭터가 떨어지고 있는 상태인지 체크 (Is Falling 노드를 이용) -> Is In Air? 변수 Set
- 초록색 부분: 우리가 키를 입력해서 캐릭터가 움직이고 있는 상태인지 체크 -> Movement Input 변수 Set
- 애니메이션 BP의 애님 그래프
- AirandIdleRun 스테이트 머신
- 트랜지션 세팅
- 노란 동그라미는 자동 규칙 옵션
- 빨간 동그라미는 Is In Air가 false 일 때
- 초록 동그라미는 Is In Air 가 false이고 Movemenet Input도 false일 때
- 파란 동그라미는 Is In Air가 false이고 Movement Input는 true 일 때
- 스테이트세팅
- Jump의 경우 이미 만들어진 블렌드 스페이스를 사용했다.
- Jump를 제외한 모든 State는 해당 이름과 같은 애니메이션을 넣어서 이어주었다.
- 트랜지션 세팅
결과 영상
2. 움직이는 액터
1. 이동하는 액터
- 위아래로 움직이는 문
- 타임라인만 잘 만들면 쉽게 구현이 되었다.
- 타임라인은 다른 값은 안써봤고, 벡터로만 만들어 보았다. 이때 한가지 값만 조절하려면, 왼쪽에 자물쇠 아이콘을 눌러서 잠그면 된다.
- 좌우로 움직이는 발판
- InterpToMovement 컴포넌트를 이용
- 디테일 창에서 컨트롤 포인트까지 얼만큼의 시간 동안 갈 것인지와, 도착지점인 컨트롤 포인트를 설정해 줄 수 있다.
- 구현은 생성자에서 Add Control Point Position 노드를 통해 해주었고, Destination이라는 Vector 변수를 하나 만들어서 구현했다.
- 꿀팁
- 아래 사진에 3D 위젯 표시를 체크한다면, 우리가 뷰포트에서 직접 위치를 보면서 수정이 가능하다!
2. 회전하는 액터
- 원판 위를 회전하는 자동차 장애물
- 수업시간에 배운 내용을 써보려고 했는데, 발판은 움직이지 않고, 위의 자동차만 움직이도록 구현하고 싶어서 살짝 수정을 해 보았다.
- Rotaxis 라는 빈 static mesh를 만들고, car mesh를 자식 컴포넌트로 넣은 후 car의 위치를 오른쪽 사진처럼 이동시켜 주었다.
- 이후 아래 블루프린트 처럼 회전하는 주체를 Rotaxis로 해주어 생각한 대로 회전하도록 구현하였다.
3. 미끄러운 발판
- Character Movement 컴포넌트에 존재하는 마찰력 관련 값을 세팅하여, 미끄러운 바닥을 만들었다.
- 미끄러운 바닥으로 구현하고자 하는 바닥에 collision을 두어 해당 collision 안에 있으면 미끄러워지고, 밖으로 나오면 다시 원래 상태로 세팅을 해주어야 한다.
4. 추가적인 구현
- 물 머티리얼 및 물위에 떠있는 듯한 물체들
- 부서지는 발판
- 미끄러지는 발판과 함께 추가할 예정
3. 결과물
4. 새롭게 배운 기능
- 애님그래프 스테이트
- Alias
- 이동 관련 노드
- Add Local Rotation
- target을 중심으로, 1초에 넣어준 값 만큼 회전한다.
- Set Relative Location
- target 위치를 기반으로 하여, 해당 input으로 들어온 위치만큼 이동시켜준다.
- Add Local Rotation
- 마찰 관련 세팅
- Character Movement에 존재하는 값들
- 지면마찰(Ground Friction)
- 마찰 인수 제동(Braking Friction Factor)
- 감속 걷기 제동(Braking Deceleration Walking)
- Character Movement에 존재하는 값들
5. 참고자료
애니메이션 BP:
스테이트머신:
'Unreal Engine' 카테고리의 다른 글
UE_LOG 보충 (+ 과제) (1) | 2025.01.07 |
---|---|
Unreal Engine 간단한 로그 찍기 (2) | 2025.01.06 |
Unreal Engine 5 TIL day 4 (1) | 2024.12.19 |
Unreal Engine 5 TIL day 3 (1) | 2024.12.19 |
Unreal Engine 5 TIL day2 (1) | 2024.12.17 |