재차 글을 쓴 이유는... 앞서 쓴 글에서 문제가 있던 부분과 더불어 부질없는 고민도 있었기 때문입니다.

우선 수정된 애니메이션부터 공유해보겠습니다.

메인 FSM
MainStateMachine::Idle State

일단 Layered Blend per Bone이 현재 상황에서는 의미가 없는 기능이었습니다.

Montage가 통째로 회전하더라도 머리의 방향은 AimOffset이 맞춰줄거기 때문에 굳이 Layered를 할 필요가 없었습니다.

그리고 Cache 포즈도 현재 Default 포즈를 따로 필요하지 않는 것 같아 일단은 제거해 두었습니다.

 

이전에 발생한 이슈는 2가지였는데요.

1. 왼쪽으로 고개 회전 시 무한이 회전하는 문제

이건 AimOffset 값 자체가 방향 정보도 포함하고 있어 Tick에서는 무조건 Delta만큼 차감하면 됐었는데, 이걸 다시 Type에 따라 반대로 연산하다 보니 왼쪽은 계속 가산되어서 그 방향으로 회전하게 되었습니다.

 

2. 고개가 90도로 맞게 회전하지 않는 문제

이건 Montage와 관련이 있었는데요.

초반 작업에서 Montage를 1배속으로 플레이 했을 때 90도가 아니라 225도를 회전하는 문제가 있었습니다.

AddControllerYawInput() 안에서 계수가 적용된 것으로 판단하여 MontagePlayRate를 조절하여 2.5배속 재생 되도록 UI에서 조절해 놓았는데, 이 때문에 몸이 90도 회전 하는 동안 -90도가 회전해야 할 머리가 -36도만 회전하였습니다.

그래서 UI에서 직접 입력하던 MontagePlayRate를 TurinInPlaceNotify.h에서 상수로 값을 잡아두고, Montage_Play()에서 MontagePlayRate를 입력하고, 동시에 Tick에서 연산되는 AimOffset에서도 MontagePlayRate를 곱하여 동일한 값만큼 몸과 고개가 움직이도록 조정했습니다.

 

이로서 제자리 회전에 대한 기능은 모두 완료가 되었습니다.

다음에는 방향키에 맞게 걷는 기능과, 회전 중 걷기 시 그 방향으로 걸어가는 기능을 구현할 예정입니다.

'개발일지 > 코어 플레이 개발' 카테고리의 다른 글

22년 10월 29일 비개발일지  (0) 2022.10.30
22년 10월 02일 (비)개발일지  (0) 2022.10.02
22년 09월 27일 개발일지  (0) 2022.09.27
22년 9월 26일 개발일지  (0) 2022.09.26
22년 09월 20일 개발일지  (0) 2022.09.20

캐릭터가 목을 90도 이상 돌렸을 때 시점과 고개 방향이 고정된 채로 나머지 몸체만 그 방향으로 회전하는 기능을 구현하였습니다.

 

 

작업하면서 몇가지 난항이 있었는데 이를 공유하고자 합니다.

 

1. 몸은 회전하는데 고개가 원래 방향으로 리셋되는 현상

고개를 우측으로 90도 돌리면 몸체만 돌아가야 하는데 고개도 정면으로 돌아간 상태에서 캐릭터가 통째로 회전하는 현상입니다.

그냥 애니메이션만 나오면 크게 체감이 안될 수 있지만, 고개와 시점을 고정하면 시점이 휙휙 돌아가 매우 어지러웠습니다.

이를 수정하기 위해 Blend 쪽을 만져보다가, 우연히 Aim Offset이 비정상 동작할 때 무언가 다르게 움직이는 점을 확인하고 Offset이 문제가 아닌가 하는 의문이 들었습니다.

그래서 TurnInPlace Montage가 시작하는 시점에 Offset을 수정하는게 아니라, 매 틱마다 조금씩 Offset을 줄여서 +90에서 +0 언저리가 되도록 수정을 해보았더니 원하는대로 구현이 되었습니다.

결국은 Montage를 먼저 적용하고 그 뒤에 Offset을 적용하다 보니 고개에 대한 방향은 Offset이 강제로 값을 바꿔주는 형태라 이 값을 Tick에서 조절해주면 자연스럽게 구현이 되는 것 같습니다.

 

2. Layered Blend per Bone 기능 사용 미숙

해당 기능이 있는 것은 알았지만 어떻게 사용하는지를 바로 깨닫지 못했습니다.

재밌게도 이걸 검색 했더네 두번째 링크가 제 블로그더군요.

네가 여기서 왜 나와?

https://redchiken.tistory.com/19

 

UE4 2개 이상의 Layered blend per bone

서류 몇개 더 떨어지고 정말 간만에 개발을 하다가 막혔던 부분 중 공유하면 좋을 것 같아서 적어봅니다. Animation에는 Layered blend per bone이라는 노드가 있습니다. 기존의 포즈에 지정한 포즈를 특

redchiken.tistory.com

그런데 이 블로그에서도 정확히 사용 방법을 알 수가 없었습니다.

결국 다시 블로그 등을 검색하여 옵션을 넣었으나, 같은 불상사를 방지하기 위해 하기 설명에 옵션 사진도 같이 첨부하였습니다.

 

마지막으로 현재 제가 작업해놓은 Animation 부분을 공유합니다.

전체 Animation

외부에 Cached Pose를 두개를 둔 이유는 원래 참고하고 만들던 것과 더불어 새로운 Cached Pose가 필요하기 때문입니다. 성능적인 부분은 찾아봐야겠지만, 만약 크게 문제가 안된다면 가능한 이런 식으로 외부에 Cached Pose를 만들어두고 나중에 이를 가져다 쓰는 형식으로 구현하는 방향으로 구상 중입니다.

 

MainStateMachine 내부의 Idle 상태

실제 Idle 상태에서의 BP부분입니다.

뒤에 Offset으로 각도 조정을 해줄거기 때문에 Bone은 root를 그냥 넣어주었습니다.

 

Idle 상태에서의 FSM

Idle FSM 내부입니다.

임시로 상태를 만들어 서있거나, 앉아있는 등의 경우에서 Idle일 때의 Animation을 반환합니다.

구조는 나중에 필요에 따라 바뀔 여지는 있을 것 같습니다.

 

우선 문서를 작성하면서 확인해보니 왼쪽으로 회전에서 발생하는 문제, 혹은 고개가 완벽하게 각도가 안 맞는 부분이 있어 이 부분을 나중에 조정을 하고, 이후 걷는 애니메이션을 구현해볼 생각입니다.

'개발일지 > 코어 플레이 개발' 카테고리의 다른 글

22년 10월 02일 (비)개발일지  (0) 2022.10.02
22년 09월 27일 개발일지 2  (0) 2022.09.27
22년 9월 26일 개발일지  (0) 2022.09.26
22년 09월 20일 개발일지  (0) 2022.09.20
22년 09월 17일 개발일지  (0) 2022.09.18

캐릭터가 90도 이상 회전하고 몸이 회전할 때 카메라 방향도 같이 움직이도록 수정했습니다.

다만 고개만 움직일 때 카메라가 안 움직이는게 어색하여 SpringArm을 머리에 붙여서 고개를 흔들면 같이 화면이 전환되도록 하고, Montage를 목 아래에서만 재생되도록 하여 고개를 고정하고 몸만 움직이게 해보고자 합니다.

 

생각보다 고된 작업인 것 같습니다.

그래도 작업 과정을 숙련하면 확실한 강점이 될 수는 있겠다 싶습니다.

특히 만들고 싶은 게임 중 캐릭터 위주의 게임도 있어서 이 기술은 포기하지 않고 꼭 잡고 가고 싶습니다.

'개발일지 > 코어 플레이 개발' 카테고리의 다른 글

22년 09월 27일 개발일지 2  (0) 2022.09.27
22년 09월 27일 개발일지  (0) 2022.09.27
22년 09월 20일 개발일지  (0) 2022.09.20
22년 09월 17일 개발일지  (0) 2022.09.18
22년 09월 16일 개발일지  (0) 2022.09.16

오늘은 캐릭터 회전 Montage를 작업했습니다.

결과적으로 완성은 못했지만, AimOffset을 돌리다가 Offset이 90도 이상 돌렸을 때 몸이 돌아가는 Montage가 호출되는 로직은 구현을 완료했습니다.

대략적으로 코드를 보기 좋게 수정도 했고, 다만 Tick에서 캐릭터가 실제로 회전하지는 않아서 이 부분을 수정중에 있습니다.

캐릭터가 회전한 후에는 다시 구조를 좀 더 좋게 수정을 하고, 하나의 커밋으로 뭉쳐서 Push할 예정입니다.

'개발일지 > 코어 플레이 개발' 카테고리의 다른 글

22년 09월 27일 개발일지  (0) 2022.09.27
22년 9월 26일 개발일지  (0) 2022.09.26
22년 09월 17일 개발일지  (0) 2022.09.18
22년 09월 16일 개발일지  (0) 2022.09.16
22년 09월 13일 개발일지  (0) 2022.09.13

캐릭터 회전 기능을 다음과 같이 구현해보았습니다.

  1. Character에서 좌우로 회전할 때 90도를 초과하면 TurnInPlaceState를 지정함.
  2. AnimInstance에서 TurnInPlaceState값이 지정되면 해당 몽타주를 실행
  3. Montage에 걸린 AnimNotify의 Begin에서 Character에 회전중이라는 트리거를 켜줌
  4. 트리거가 켜지면 좌우 회전에서 값을 적용하지 않고 무시함
  5. AnimNotify::Tick에서 회전값을 계산하여 캐릭터를 회전시킴
  6. AnimNotify::End에서 트리거를 꺼줌.

대략 이런 식으로 구현했고, 완벽히 동작하지 않고 버그가 있어 커밋은 보류하고 있습니다.

작업에 필요한 함수 중간중간에 로그를 찍어두어서 이를 참고해서 디버깅을 해 기능을 완성해보고자 합니다.

 

관련 작업에 필요한 새로운 Interface도 선언했습니다.

처음에는 기존의 CPPCharacterLocomotion에 모든 것을 넣을까 하다가, 특정 기능에는 특정 타입을 따로 사용하는 편이 좋다고 판단하여 Interface를 여러개가 상속되더라도 따로 분리를 하고자 합니다.

 

사설 Git 서버도 구축했고 Perforce를 찾아보니 gitignore처럼 P4Ignore 파일로 경로 무시가 가능한걸 보니 같이 쓰는건 문제가 없을 것 같습니다.

남은건 Perforce 레포지토리가 어떤 바이너리 파일을 생성하는지 여부를 확인하고 그런게 있다면 Perforce 안에 git을, 없다면 git 안에 Perforce를 사용하는 쪽으로 구상을 해보면 될 것 같습니다.

 

여기에 더불어 작업 좀 더 해보고 정 안되면 Visual Assistant을 사용해볼까 고민중입니다.

없으니까 많이 불편하더군요...

'개발일지 > 코어 플레이 개발' 카테고리의 다른 글

22년 9월 26일 개발일지  (0) 2022.09.26
22년 09월 20일 개발일지  (0) 2022.09.20
22년 09월 16일 개발일지  (0) 2022.09.16
22년 09월 13일 개발일지  (0) 2022.09.13
22년 09월 09일 개발일지  (0) 2022.09.09

시야 돌릴 때 자동 회전 되는 기능 구현에 앞서 AdvancedLocomotionSystemV 프로젝트에서의 구현 방식을 살펴봤습니다.

제가 분석한 바로는 대략 다음과 같습니다.

  • AnimInstance의 Tick에서 매번 제자리 회전 Montage를 재생하고자 합니다.
    Character에서 특정 각도에 도달하여 회전 상태가 바뀌기 전까지 제자리 회전 Montage를 재생할 수 없습니다.
  • Character에서 상태가 바뀌어 Montage를 재생하게 되면 0.0초에서 AnimNotify가 발생됩니다.
  • AnimNotify::Begin에서 AnimInstance에 회전 Montage이 실행되고 있다는 조건을 전달합니다.
    이 조건은 Character에서 주는 상태와 다른 분기문에서 Montage 반복 재생을 막습니다.
  • AnimNotify::Tick에서는 DeltaTime과 MontagePlaytime을 이용해 캐릭터의 각도를 조절해줍니다.
  • AnimNotify::End에서 AnimInstance에 회전 Montage를 제거해주면서 다시 조건이 만족됩니다.

사실 이 이상으로 파악을 하지는 못했습니다.

Montage가 실행되는 부분이 Montage 앞에서 AnimNotify가 호출되는 부분이 서로 엉켜 있는 것 같은데 어떻게 구동되는지 중단점도 안 찍히더군요.

결국 제가 내린 결론은 이 예시를 보면서 확인한 대략적인 구현 방식을 기준으로 직접 헤딩을 해야 한다는 점이었습니다.

  1. 특정 상태가 되면 Montage를 직접 재생한다.
  2. Montage 전체를 하나의 AnimNotify로 감싼다.
  3. AnimNotify::Begin에서 Montage 호출을 막아주고 AnimNotify::End에서 이를 풀어준다
  4. AnimNotify::Tick에서 캐릭터를 회전시킨다.
  5. Tick 사용을 겁내지 말자.

위 사항을 중심으로 하나씩 만들어보고자 합니다.

 

그리고 이거랑 별개로 VA를 구독하거나 AWS에 사설 Git 서버를 넣어서 VCS를 넣는 방안을 크게 고민 중입니다.

커밋 단위에서만 관리하는게 생각보다 불편하더라구요...

 

'개발일지 > 코어 플레이 개발' 카테고리의 다른 글

22년 09월 20일 개발일지  (0) 2022.09.20
22년 09월 17일 개발일지  (0) 2022.09.18
22년 09월 13일 개발일지  (0) 2022.09.13
22년 09월 09일 개발일지  (0) 2022.09.09
22년 09월 02일 개발일지  (0) 2022.09.02

어제 저녁과 오늘 오전에 잠깐 작업을 진행했습니다.

작업사항은 회전각도가 좌우로 90도가 넘어가게 되면 몸이 그 방향으로 하체가 90도 회전하는 작업입니다.

기존 Locomotion Animation State 뒤에 Montage를 붙이고, Offset의 X값이 90이 넘어가면 값을 90만큼 줄인 뒤 회전 상태를 변경해주었습니다.

이수 Animation Tick에서 회전 상태가 지정되면 관련 Montage를 재생시킵니다.

마지막으로 Montage의 시작 부분에는 캐릭터의 이동 입력을 받지 않도록 하는 AnimNotify가, 끝 부분에는 캐릭터의 이동 입력을 받도록 하는 AnimNotify 호출이 됩니다.

우선 이런 형태로 만들어놓고 동작이 되지 않는 부분까지 확인해서 이후에는 디버깅을 통해 원인을 파악해야 합니다.

 

그리고 마일스톤을 대폭 수정 했는데, 기존의 마일스톤 1을 올해 12월 31일까지로 이동하고 나머지 두 마일스톤은 일정을 제거했습니다.

이는 마일스톤 3에 해당하는 일정이고, 변경된 이유는 Animation 기능을 구현하는 작업이 생각보다 시간이 오래 걸려서 숙련과 이해를 하면서 하기에는 일정이 너무 촉박하고, 생각보다 제 개발 의욕이 좋지 않아서 최악을 염두하여 길게 잡았습니다.

마땅히 해야 하는데 안 한다는 부분이 스스로에게 실망스러웠지만 휴일동안 해본 결과 안되는건 안되는 거더군요.

그래서 제대로 공부하고 제대로 정리해서 비교적 완벽히 익히고 코드를 잘 정리하는 것을 챙겨보고자 합니다.

'개발일지 > 코어 플레이 개발' 카테고리의 다른 글

22년 09월 17일 개발일지  (0) 2022.09.18
22년 09월 16일 개발일지  (0) 2022.09.16
22년 09월 09일 개발일지  (0) 2022.09.09
22년 09월 02일 개발일지  (0) 2022.09.02
22년 08월 28일 비개발일지  (0) 2022.08.28

요즘 일이 좀 많아져서 작업을 못했습니다.

정확히는 정상궤도로 돌아온 거지만요.

 

새벽에 눈 비비면서 결국 AimOffset을 이용해 고개 돌리는 작업을 성공적으로 작업했습니다.

비록 실제 시점 등은 추가로 작업이 되어야 하겠지만, 모션 부분을 성공적으로 한 것에 만족을 느낍니다.

 

작업을 하고 나서 다시 보니 M1 작업이 터무니없이 설정되어 있었습니다.

양도 너무 많고, 개발 속도도 예상보다 느리고, 무엇보다 중복되는 부분도 있었습니다.

그래서 좀 더 M1 작업을 경량화 했습니다.

우선은 회전, 일반 이동, 점프만 애니메이션이 정확히 작업 되도록 하고자 합니다.

 

아마 추석 연휴동안 작업 마무리는 장담 못할 것 같습니다.

다행히 화요일에 휴가를 쓸 여지가 있어서 월요일까지 작업을 해보고, 안된다면 마감을 한 타임 씩 뒤로 미루고 M3를 M2 개발 후에 다시 잡아보는 방향으로 고민중입니다.

'개발일지 > 코어 플레이 개발' 카테고리의 다른 글

22년 09월 16일 개발일지  (0) 2022.09.16
22년 09월 13일 개발일지  (0) 2022.09.13
22년 09월 02일 개발일지  (0) 2022.09.02
22년 08월 28일 비개발일지  (0) 2022.08.28
22년 08월 26일 개발일지  (0) 2022.08.27

오늘은 예시 프로그램을 보고 AimOffset의 Blend Space와 StandUp 기능의 Montage를 생성했습니다.

Blend Space는 처음 써봤는데 기본 Pose를를 공통으로 지정해야만 작동이 되더군요.

지금보다 더 창의적으로 Blend Space를 쓸 자신은 없지만 그래도 똑같은 걸 만들으라 하면 자료를 읽고 더 빨리 이해할 수 있게 된 것 같습니다.

Montage는 일어서는 기능을 넣은건데 따로 쓸 것 같지는 않습니다.

 

이후 기능 개발을  하다가 기존에 만들어 놓은 시야 회전 관련 함수가 기능과 맞지 않아 지우고, Offset 계산 부분을 구현하기 위해 Interface를 선언해서 연결해 작업 하다가 멈췄습니다.

뭔가 의욕이 서지 안하고 다른 걸 하는게 더 땡기는데 큰일이네요.

가급적 주말 안으로 카메라 회전 기능을 구현해 놓고자 합니다.

'개발일지 > 코어 플레이 개발' 카테고리의 다른 글

22년 09월 13일 개발일지  (0) 2022.09.13
22년 09월 09일 개발일지  (0) 2022.09.09
22년 08월 28일 비개발일지  (0) 2022.08.28
22년 08월 26일 개발일지  (0) 2022.08.27
22년 08월 24일 개발일지  (0) 2022.08.24

원래 계획이라면 어제부터 개발을 꾸준히 해서 오늘 Blend Space를 다 처리 할 생각이었습니다만.

집에 일을 도와야 할 것도 생겼고 금요일에 너무 열심히 했는지 주말에 도저히 손에 안잡히더라구요.

생각만 해도 머리가 아프고.... 그래서 주말동안 다른 프로젝트를 작업하고 있었습니다.

 

추석 연휴를 지내야 하겠지만 높은 확률로 마일스톤은 매우 널럴하게 수정해야 할 것 같습니다.

마일스톤 1, 2를 합쳐서 3분할을 해 연말까지 작업해야 할 것 같은 기분입니다.

'개발일지 > 코어 플레이 개발' 카테고리의 다른 글

22년 09월 09일 개발일지  (0) 2022.09.09
22년 09월 02일 개발일지  (0) 2022.09.02
22년 08월 26일 개발일지  (0) 2022.08.27
22년 08월 24일 개발일지  (0) 2022.08.24
22년 08월 22일 개발일지  (0) 2022.08.23

+ Recent posts