평소에 하던 프로젝트 내용은 아닙니다.

 

아는 선배가 같이 게임 개발 공부 해보지 않겠냐고 하셔서 또다른 언리얼 프로젝트를 개발하고 있습니다.

 

기능 구현을 주 목표로 하고 있는데 1년 넘게 삽질 하면서 듣도 보지도 못한 것을 근 3주만에 배웠습니다.

 

개인적으로 서버, 통신 쪽은 잼병이라 혼자 개발 할 때도 멀티플레이는 항상 나중으로 미뤘었는데 이 부분을 먼저 처리해주셔서 replicate를 제대로 고려해야 하는 상황을 직면했습니다.

 

해야한 일은 멀티 플레이에서 모든 모션이 동기화 되고, 기존의 FPS 템플릿에는 없는 전신 스켈레톤을 붙여야 했습니다.

 

스켈레톤을 붙이는 것 까지는 어떻게 됐는데 애니메이션 리플리케이션에서 일주일 넘게 막혔습니다.

 

덕분에 한 3일동안 먹는 족족 얹히기도 했고요.

 

문제는 당연히 "동기화가 되지 않는다." 입니다.

 

원인을 좀 꼽아보자면

 

1. RPC에 대한 이해 부족.

 

RPC를 안다고 생각했는데 이게 무엇인지만 알고 사용법은 몰랐던것 같습니다.

 

RPC 함수 호출을 어떻게 해야 하고 어떤 함수를 써야 하는지 아는데 이틀이 걸렸습니다.

 

2. 애니메이션에 대한 서툴름

 

애니메이션을 한번 만져봐서 자신 있었는데 안 만진 부분에서 4일 정도 시간을 먹었습니다.

 

특히 Montage Replicate를 하려고 하루에 12시간 넘게 인터넷 예시 코드를 따라 했었는데

 

결국 코드 문제는 아니었다고 합니다.

 

문제 해결하고 바로 글 쓰느라 뭔가 이상하네요.

 

저랑 비슷한 문제를 직면할 사람들을 위해 팁 형식으로 간단하게 정리하겠습니다.

 

1. RPC는 클라이언트가 UFUNCTION(Server, Reliable, WithValidation) 함수 A를 호출하면, A 함수가 서버에서 UFUNCTION(NetMulticast, Reliable) B 함수를 호출한다. 그럼 각 서버와 클라이언트에서 B 함수가 원하는 동작을 시행한다.

 

2. 선언 할 때는 A, B라 선언하지만 정의 할 때는 A_Implementation, B_Implementation라 정의해야 한다. 언리얼 코드 제너레이터가 뒤에 Implementation가 붙은 함수를 호출한다.

 

3. 추가로 bool A_Validate 함수가 필요하다. 아직까지 정확한 목적은 모르나 보통 return true만 넣어두면 정상 작동한다.

 

4. 모든 동작마다 replicate를 따로 해줘야 한다.

 

5. 발사와 같이 특정 방향 캐릭터 기준의 변수가 필요한 경우에는 UFUNCTION(Server, Reliable, WithValidation) 함수에 파라미터로 넘겨줘야 한다. 

 

6. 몽타주 실행을 위한 AnimInstance는 5번을 생각해서 파라미터로 넘겨주면 문제가 생길 수 있다. AnimInstance는 Transient하다. UFUNCTION(NetMulticast, Reliable) 내부에서 생성하자.

 

7. 몽타주의 전체 재생 시간보다 blend 시간을 압도적으로 짧게 잡아야 한다. 그렇지 않으면 blend 하는 사이에 애니메이션이 끝나 결과적으로 애니메이션이 재생되지 않는 것처럼 보인다.

 

거의 하루에 1개씩 깨달음을 얻은 수준이네...

 

암튼 이 글이 누군가에게는 도움이 되어 저처럼 오랜시간 삽질하지 않기를 빕니다.

'개발일지' 카테고리의 다른 글

0701 리슨서버 골자 구축  (0) 2019.07.01
게임 제작 근황  (0) 2019.06.17
5월 1일 공격 판정 적용  (0) 2019.05.02
Paragon Animation List  (0) 2019.04.01
3월 29일 복-귀 및 콤보 어택 수정  (0) 2019.03.29

까먹은거 아닙니다. 유의미한 결과가 없어서 글을 쓰지 않았습니다.

 

그리고 오늘 유의미한 구현을 하여 글을 작성합니다.

 

캐릭터의 행동을 여러가지 적용하다가 게임 그 자체에는 크게 필요하지 않은 것들이 많아서 다 삭제했습니다.

 

지금은 점프 앉기 공격 뛰기와 이들의 혼합체만 구현되어 있습니다.

 

이게 한 4월 8일 언저리였습니다.

 

근데 만들고 나니까 일반 공격의 1타는 타격 판정이 나는데. 일반 공격 2타 3타와 점프 공격, 대쉬 공격, 대쉬 중 점프 공격은 타격 판정이 나지 않았습니다.

 

이 부분을 코드만 계속해서 들여다보던게 한 3주.

 

29일 쯔음에 부끄럽게도 디버그 방법을 알아서 디버그를 해보며 생각대로 호출 되는 함수 그렇지 못한 함수 나누어 보았으나 델리게이트가 작동해야 하는데 작동하지 않은 것을 고치려면 어떻게 작동해야하는지 알아야 한다는 사실에 늘어져 있었습니다.

 

혹시 뭔가 놓친게 있나 싶어 다시 보다가 AnimNotify 부분을 찾아 보고 혹시나 해서 Montage를 봤는데...

 

notify 부분이 비어 있었습니다.

 

그렇습니다. 

 

코드의 델리게이트와 Montage가 연결이 되어있지 않았던 것입니다.

 

정확히는 모든 공격은 Attack 함수 안에서 구현하여 델리게이트 함수는 공유하였으나, 참고도서를 보고 만든 일반 콤보 공격은 notify가 설정되어 있어 montage에서 AttackCheck가 되었는데 다른 공격들은 이 부분이 빠진 것이었습니다.

 

안그래도 요즘 회사 공채 열려서 멘탈 약해졌는데 이게 멘탈을 다 깨트려버렸네요.

 

이번주는 짬을 내서 꼭 게임을 할것입니다.

 

이 부분에서 남은 것은 공격 별로 피해량에 차등을 주는 것입니다.

'개발일지' 카테고리의 다른 글

게임 제작 근황  (0) 2019.06.17
Animation Replicate 삽질 일기  (0) 2019.05.19
Paragon Animation List  (0) 2019.04.01
3월 29일 복-귀 및 콤보 어택 수정  (0) 2019.03.29
2월 16일 오브젝트 현황  (0) 2019.02.16

캐릭터 기능을 위해 애니메이션을 위주로 보고 있었습니다.

파라곤 애셋... 무료에 퀄 좋은 애니메이션, 이펙트 들이 이미 구현 되었다고 하니 써보기로 결정했었습니다. 

일단 쓰려면 뭐가 있는지 알아야 하니 분석....

그 결과 사용 불가라는 판정을 내릴 수 밖에 없었습니다.

 

첫번째로, 사람이 아니라 뭘 하든 이질적이었습니다.

사람형 캐릭터가 플레이 하는 것을 생각했는데 갑자기 외계인이 뿌슝빠슝하니까 기존의 기획을 부정하기 시작했습니다.

왠지 이게 아닌다라는 생각이 들기 시작하는데 개발 과정이 아니라 에셋을 보고 느껴지니까 느낌 묘하더군요.

 

두번째로, 스킬이 컨셉과 잘 맞지 않았습니다. 6개 정도?는 기획한 바와 정확히 들어 맞는 경우가 있었으나, 그 외에는 그다지 컨셉에 맞지 않았습니다. 그렇기에 사용을 하기 위해서는 기획을 변경해야 하는 상황이었죠.

 

이런 이유로 원상복귀 했습니다.

 

지금은 기존의 애니메이션들을 하나로 묶을 생각을 하고 있습니다.

상당히 많은 애니메이션 에셋들을 가지고 있는데 이들이 모두 다른 스켈레탈을 기반으로 움직여서 포기했었습니다.

하지만 retarget이란걸 찾아서 이걸 잘 써보면 애니메이션을 하나의 스켈레탈을 기반으로 움직이게 할 수 있지 않을까... 하는 작은 희망을 얻었습니다.

그리고 파라곤 에셋에서 스켈레탈의 일부분만 움직여 애니메이션을 만드는 것과 같은 것을 보았는데 이를 이용하면 왠만한 애니메이션은 자급자족이 가능하지 않을까 싶습니다.

 

잠깐 돌아간 길을 다시 돌아오고 또다시 먼 길을 떠나려나 착잡합니다...

+ Recent posts