5.4 게임애니메이션샘플 5-1 [Traversed]


지루한 부분은 모두 끝났고 이제 가장 재미있을거 같은 부분을 시작 한다. 

 Traversed


BP부터 작업 해 준다.




함수3개 변수2개를 만들어 준다.

그리고 2개의 구조체가 필요하다.

하나의 enum도 있네, 만들게 많아서 재미가 없어졌다.



  • GetTraversalForwardTraceDistance 

함수를 만들어 준다.







캐릭터의 진행방향을 역행렬로 구하고 리맵 해주는데 0-500은 캐릭터 이속 범위 이고

75-350은 왜인지는 아직 모르겠다.


  • E_TraversalActionType
enum을 만들어준다.

none/hurdle/vault/mantle  이것은 마치 스타벅스의 숏/톨/그란데/벤티 와도 같은것이다.


  • S_TraversalCheckResult

구조체를 만들어 준다.


뭔가 많이 가지고 있다.

쫄필요 없다, 뭔가 많다는건 구조를 복잡하지 않게 짜기 위함이다.


  • UpdateWarpTargets
장애물 구조에 따른 구조체 Ledge변수값을 채워주는 함수 이다.

우선 트래버스카테고리 변수 두개를 만들어주고 



노말의 음수값까지는 이해를 하겠는데 make rot from X는 처음본다.
설명은 x만 노멀라이징 하지 않고 사용하고 나머지 Y,Z는 
unspecified but will be orthonormal 특정하진 않지만 직교가 된다....?????

@.,@ 

너 싸움 잘 하냐?

전역 진행방향이 X인 로테이션을 만들어 준다.






장애물이 톨이나 그란데 면,  Ledge삭제 왜냐하면 저 둘은 Backfloor가 있으니까.



허들 타입만 backfloor가 있다. 
다른 타입은 전부 Ledge위로 올라 가는 타입들.

전체적으로 다 Ledge 가 있는지/없는지 뒷바닥이 있는지 /없는지에 따라 
변수를 만들어 주는 함수이다.

로케이션과 로테이션을 가져오는 방식을 완벽히 이해하진 못하겠지만, 뭘 하는 함수인지는 알겠다. 
커브값을 가져 오는 부분은 좀더 찾아봐야 겠다. 이부분을 모르겠네..

모션워핑 노티파이에서 설정 해 준다.



이제 마지막 함수

  • TryTraversalAction




아주 커다란 함수이다.


코멘트를 보면 5단계로 나뉘어 있다.


Step1

두개 CMD 가 있는데 
DDCvar.Traversal.DrawDebugLevel
+ 0false /1~3클수록 더 자세한 드로우디버깅
DDCvar.Traversal.DrawDebugDuration
+ sec

DDCvar(Dynamic Data Collection Variable) 이런 커맨드를 찾을수가 없네 
내 프로젝트에서는 안나온다.


이것도 나중에 찾아보자.




스텝1에서는 액터 위치값과 방향을 가져오고 캡슐정도보 수집을 한다.
아마 이 변수들이 계산되어서 장애물 타입에 따라 이동 위치를 정하는거 같다.

Step2
2-1Perform a trace in the actor's forward direction to find a Traversable Level Block. If found, set the Hit Component, if not, exit the function.
캐릭터 진행방향에 장애물을 찾고 찾은 장애물에 Hit 설정. 장애물 없으면 함수 종료


오....
이거  그냥 보통의 메쉬가 아니라 장애물도 액터컴포넌트로 만들어야 하는거네 

거기다 엄격하기 까지...10cm만 높아도 못넘는구나



난 당연히 높이와 거리를 추적해서 모션을 그 높이에 맞춰줄꺼라 생각 했는데 아닌가 보다.
일단 진행을 더 하려면 나도 레벨 블록이 필요 하니 하나 만들어 주도록 한다.

액터를 나중에 배치 해서 파쿠르가 가능하게 만드는 방법이 좋겠다는 생각이 든다.
일단은 똑같이 만들어 보고 다 만들고 고쳐보도록하자.


Actor를 하나 만들고 똑같이 만들어 준다.

  • FindLedgeClosestToActor

4면의 모서리에 위치시킨 ledge의 거리로 순서를 만들어 주는 함수이다.



캐릭터와 각 요소의 거리를 구하고 가장 가까운 ledge를 반환한다.
간단히 설명하면 루프를 돌며 인덱스0부터 거리를 구한다.
다음 인덱스를 0하고 비교해 0보다 가까우면 가장가까운 ledge가 되어서 다음과 비교를 한다.이렇게 루프를 다 돌고 가장 가까운 거리를 반환해 준다.



다음 함수를 만들어 준다.

  • GetLedgeTransforms


Ledge의 최소 넓이는 60으로 설정 되어 있다.
최소 넓이 보다 크면 충돌 위치와 해당 Ledge를 가져와 구조체에 Front Ledge 벡터값을 전달해 준다.





함수 수정. 마지막이 Back Ledge 임, Oppasite Ledge는 맞은편 Ledge를 가져와 Back으로 설정해 주는 함수이다. 

다시 캐릭터BP로 돌아와서

Step2


1.




캐릭터 전방을 추적한다.
충돌된 물체가 있으면 levelblockTrasersable 의 유효성을 체크하고 맞다면 구조체에 담아준다.


2.



levelblockTrasersable 에서 만든 함수를 호출해 액터 정보와 추적 정보를 넘겨준다.


3.




드로우 디버그.Front Ledge와 BackLedge 위치 표시
BackLedge 는 어디서 가져오지?
아levelblockTrasersable 함수에서 바꿔준다. 함수 수정 해야 한다.


Step3.


1.

Front Ledge 유효성 체크
이전 단계에서 잘못 만든게 있다. 큰 영향은 없겠지만 로커 변수로 구조체를 하나 더 만들어 줘야 한다.
그냥 봐서는 딱히 그럴 이유는 없어 보이지만. 
뭔가 로컬변수여야 하는 이유가 있겠거니 하면서 추가 하고 수정해 준다.


2. 

캐릭터가 올라갈 여유가 있는지 공간을 체크한다.



논리연산자NOR 사용으로 헷갈릴수도 있는데 Hit 가 되면(true) 올라가기에는 공간이 너무 짧다는 의미다. 그래서 참일때(둘다 0)  다음 으로 진행 둘중 하나라도 충돌체크가 되면 실패로 빠져나온다.


3.




장애물의높이를 가져온다.
Front Ledge 벡터 값이 있는데 이건 어디다 쓰는건지 아직 모르겠다.



4.



장애물 위에 공간이 얼마나 있나 체크한다.
간단하다 그냥 시작점에서 끝점을 체크한다.


5.


충돌하지 않았을때



시작과 끝을 가져와 넓이를 구한다.

충돌 했을때

충돌 위치에서 빼줘서 깊이를 구한다.
이건 어떤 케이스냐면 장애물 위에 장애물이 있을경우이다.



6.





여유공간을 찾을때와 다르게 여기선 불필요한 수식이 보인다.(내가 모르는 거일수도 있지만) 엔드벡터를 만드는데 저기서 뭐빼고 더하고 하는게 왜 필요한지 모르겠다.
내 생각에는 그냥 5번과 마찬가지로 상태만 알기 위하인듯 한데...

일단 3번까지 완성.

너무 길어 끊어가야 겠다.



댓글