클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

RPG 게임 기능 2 - Motion Warping 1 : 레이로 거리 계산하여 쏘기 본문

게임 개발 공부/언리얼 엔진

RPG 게임 기능 2 - Motion Warping 1 : 레이로 거리 계산하여 쏘기

huenuri 2024. 8. 25. 14:38

이번에는 모션 워핑 기능을 활용해 주위 물건을 타고 올라가며, 그 동작을 레이로 보여주는 것을 만들어보려고 한다.
모션 워핑이 무엇인지 잘 모르니 찾아보기로 했다.

모션 워핑 언리얼 공식 문서

 

모션 워핑(Motion Warping)은 캐릭터의 루트 모션이 타깃과 일치하도록 동적으로 정렬하는 기능이다.


 

 

기본 설정하기

 

Plugin 설정

 

메뉴 창에서 plugin에 들어가 Motion Warping을 체크해준다.

Yes라고 선택하고 plugin을 다시 시작해야 한다. Motion Warping을 검색하고 활성화되고 있는지 확인한다.

 

 

 

 

 

애니메이션 에셋 가져오기

애니메이션 폴더에서 새로 Vaulting이라는 폴더를 만들고 여기에 새로 받은 애니메이션을 import한다.

 

 

 

 

Root Motion 활성화하기

 

Root Motion에서 EnableRootMotion을 체크해준다. 루트모션은 벽 공간에서 약간의 변형이 있는 애니메이션이다.


 

 

애니메이션 몽타주 만들기

몽타주는 애니메이션을 불러올 수 있는 기능이다. 모션 워핑과 같은 효과를 추가하기 위해 몽타주로 만들어보자.

 

 

모션 워핑 타임라인에 3가지 상태 만들기

 

모션 워핑 시작 위치를 찾아 시작하고 타임라인에 키프레임을 가져다둔다.

 

그런 다음 알림있는 설정으로 하기 위해 Add Notify State에서 모션 워핑을 클릭한다.

 

 

 

 

 

 

 

모션 워핑은 shift 키를 눌러 해당 지점까지 드레그한다. 모션 워핑으로 세 가지 다른 상태를 갖게 하도록 만들고 싶으므로 점프하는 시작점과 마지막으로 착지하는 점을 파악한다.

 

 

 

 

 

트랙을 겹치지 않도록 하기 위해 Add Notify Track으로 새로운 트랙을 생성한다.

 

 

 

 

 

 

 

이렇게 3가지 상태에 대한 모션 워핑을 추가했다.


 

 

 

추가 설정하기

 

그런 다음 모션 워핑을 선택하고 세부 창에서 이름을 변경해준다.

 

 

VaultMidlle

 

중간과 끝 상태에서는 Warp Rotation을 비활성화한다.


 

 

BP 플레이어 설정하기

 

모션 워핑 컴포넌트 추가

BP 캐릭터에 가서 컴포넌트에 모션 워핑 구성요소를 추가한다.

 

 

 

구 추적하는 함수 만들기

 

vault라는 이름으로 For Loop with Break를 끌어온다. 마지막 인덱스는 2로 설정하는데, 우리는 3개의 라인 트레이스를 수행할 예정이니 0부터 2까지 수행한다.

 

 

 

 

채널 추가하여 추적 시작하기

채널별 두 트레이스를 추척하는 Sphere Trace By Channel을 선택하면 채널별로 스피릿 레이스를 만들게 된다.
채널 위치에 특정 반경과 일부 물체를 감지하는 재료로 나타나는 보이지 않는 구가 될 것이다. 우리의 경우에는 볼트로 고정하고 싶은 객체를 감지하기 시작한다.

 

액터 위치를 확인하고 플레이어가 원하는 위치에서 추척을 시작하기로 하자. Get Actor Lotaion에서 +를 하고 이를 구조체로 분할한다.

인덱스를 가져와 루프를 반복하는데 여기에 30만큼의 시간을 곱한다. 여기에 기본적으로 오프셋이 30인 3개의 서로 다는 선 추적을 생성하게 된다. 약간 분리되어 있으므로 Z값을 연결해준다.

 

 

 

 

 

 

 

그런 다음 채널에 start로 연결한다. 컴파일을 하고 채널에 다음의 설정을 변경한다.

 

 

 

 

 

 

Radius는 5로, Draw Debug Type은 For Duration으로 바꾸어준다.


 

 

 

Event Graph에서 레이 만들기

 

선 트레이스 만들기

 

왼쪽 shift 버튼을 누르면 Vault 상태가 되는 노드를 만든다.

 

 

 

 

 

 

 

이렇게 3개의 구형 선 트레이스가 나타남을 볼 수 있다. 컴파일을 해주는데 계속 되지 않는다는 문구가 떠서, 함수 그래프에서 X 값을 10부터 5씩 조금씩 늘려주니 이제는 잘 되었다.

여기서 30은 30으로 분리된 지점으로 이동하는 것이다.

 

 

 

 

 

시작점을 0, 0, 0 앞에 두기

Actor 회전을 얻어서 벡터 값을 얻는다. 캐릭터가 지금 보고 있는 곳과 우리가 가고 싶은 곳을 알기 위해 곱하기 연산을 사용한다. float으로 변환하여 객체를 얼마나 감지하고 싶은지 곱한다.

 

앞서 사용했던 액터와 더하기로 벡터를 추가하고 끝점과 노드를 연결한다.

 

 

 

 

 

 

 

이제 앞으로 가는 대신에 캐릭터 바로 앞에 다른 구 추적이 나타나는 것을 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

구 추척을 중단하는 루프 만들기

우리가 향하고 있는 지점을 확인하고 그게 맞다면 계속해서 Heat 결과를 깨뜨린다. 방금 충돌한 개체에 대한 위치 등의 다양한 매개변수가 있으므로, 무언가에 부딪히 경우 이 루프를 중단하도록 해보자.

 

이미 많은 구 추적을 만들었으므로 더 많은 구 추적을 만들 필요는 없다.

 

 

 

 

 

큐브 만들어서 레이 확인하기

큐브 만들어서 직접 확인해보면 한 줄만 만들짐을 볼 수 있다.

 

벽에 가로 막히면 1개만 되고 아닐 경우에는 3개가 발사된다.

 

 

 

 

 

 

 

여기서 주의할 점은 branch에서 contidion의 체크를 해제해야 한다는 것이다. 체크한 상태로 하면 어떻게 하든 레이는 1개만 만들어진다.

 

 

 

 

 

 

새로운 레이 만들기

새 시퀀스를 만들고 루프를 하나 더 추가한다. 배열이 아닌 중단을 사용하는 각각의 루프를 만든다. 인덱스는 5로 설정하여 6개의 다른 트레이스를 갖도록 한다.

또 다른 구체 트레이스를 만들어서 복사하여 붙여넣는다.

 

우리가 친 위치를 구하고 이를 더해서 높이에 90 또는 100을 추가한다. 이전에 했던 것처럼 값을 곱하되 이번에는 50으로 설정한다. 값을 더하기 위해 +를 하고, 액터 회전을 가져와서 전체 벡터를 얻는다.
플레이어 앞쪽으로 값을 얻어 이를 곱한다.

 

 

 

 

 

 

 

원래 레이가 위쪽으로도 나와야 하는데 이상하게 나오지 않는다. 몇 번이나 다시 돌려보며 해보았음에다 실행되지 않았다.


 

 

 

 

오늘의 언리얼 학습을 마치고

무엇이 문제인지 동영상과는 달리 레이가 세겹이 아닌 한겹으로만 발사가 되고 있었다. 이것 때문인지 그 다음 학습을 진행하기 어려웠다. 15분이 조금 넘는 시간이었는데 학습에 걸린 시간은 2시간 반이나 걸렸다.
지난번에도 애니메이션 50분 정도의 분량을 2주 동안 학습을 해도 잘 안되었다. 아마 한 10시간 이상 학습한 것 같았는데도 말이다.

너무 절망적이다. 난 얼리얼로 게임은 도저히 못만드는 사람인지 마음이 답답하다. 이제 3주도 남지 않은 개인 프로젝트 제출일이 다가왔다. 하지만 하나도 진행이 될 것 같지가 않다.
오늘 주말 학습 일정을 계획했으나 이것의 5%도 완료하지 못할 것 같은 예감이 든다. 그냥 다 때치고 싶은 마음이다..