구현목표
LineTrace 를 이용해서 인공중력 구현하기
LineTrace , Sweep, Overlap1. LineTrace : 원하는 방향으로 선을 쏘아 닿은 물체를 처리한다.
2. Sweep : 원하는 방향으로 도형을 쏘아 닿은 물체를 처리한다.
3. Overlap : 지정한 영역에 도형을 설정해 해당 도형과 맞닿은 부분을 처리한다.
해당 판정기능들을 사용하기 위해서는 Collision profile 이라는것을 직접 설정해주어야하는데 에디터->ProjectSetting->Collision에서 가능하다.

이런식으로 TraceChannel 을 직접 만들어 줄 수 있는데 해당 요소들은 충돌판정을 결정짓는 C++ 로직을 구현할때 내가 등록한 Channel만 충돌을 확인하기 위해서 사용한다.


직접사용할 Pawn, Ground CollisionPreset도 만들어 주었다. 일단은 지면처리만 할것이기에 간단하게 Ground는 BlockAll 로 설정을했고 Pawn 같은경우는 본인이나 카메라와 충돌하면 안되기 때문에 해당상황을 반영해서 설정해주었다.
1.Ignore : 모든 충돌을 무시한다 이벤트도 발생하지않음
2.Overlap : 콜리전끼리 통과할 수 있고 겹쳐질경우 이벤트 발생가능
3.Block : 콜리전끼리 충돌할경우 통과 불가능하며 이벤트 발생가능
4.CollisionEnabled : 여러가지 종류가 있으나 콜리전 이벤트를 사용하냐 안하냐 정도로 일단 이해하고 넘어가기로함.
충돌처리를 위해서 C++ 언리얼 월드에서 제공하는 함수를 사용할것인데 검색을통해 해당 함수의 정의를 굉장히 유용하게 해놓은 글을 찾아서 해당문서를 참고했다.
출처 : https://openmynotepad.tistory.com/118

해당 정보를 토대로 구성해보면
처리방법 : LineTrace
대상 : Single
처리설정 : TraceChannel
LineTraceSingleByChannel 함수를 사용한다. 해당 함수의 인자로는
FHitResult, StartLocation, EndLocation, TraceChannel, Params
충돌결과, 선의시작위치, 선의끝위치, 사용할 채널, 충돌파라미터 이다.

Params.AddIgnoredActor(this) : 해당설정은 자기자신과의 충돌을 무시한다 보통 LineTrace의 시작점은 내 엑터의 위치인데 그럴경우 뻗어나가면서 엑터의 충돌처리 컴포넌트와 제일 먼저 맞닿게 된다 그럴경우를 예외로처리하기 위해 넣었다.

이후 지면에 닿지않고 하늘에서 엑터가 아무행동도 하지않을경우 구현한 중력에 의해 자연스럽게 낙하한다. 바닥에 닿을경우 떨어지는속도를 0 으로 고정한 후, 지면과 공중의 차이를 두기위해 엑터의 이동속도를 절반으로 바꿔준다.
Move에 결합되어있던 상승과 하강을 따로 처리해주기 위해 액션을 분리한다.
PlayerConroller.h
추가 : 

Pawn.h
추가 :



Flying : 상승과 하강을 담당하는 함수 같은경우 Z축 하나의 값만 필요로 하기 때문에 Float 형식으로 값을 받아주었다.


IA,IMC 추가 할당


공중과 지면 속도차이 확인 동작 확인
트러블 슈팅 문제해결
IA 축을 분리하면서 발생했던문제이다. EnhancedInput 의 SwizzleAxis에 대해 잘못이해를 했기때문에 발생했던 문제인듯한데,

IMC Move 의 구현도이다 움직임을 처리하기위해 Modefiers 에서 축을 재배치 하는 처리를 해주고 있는것을 볼 수 있는데 때문에 IA fly를 구현할때에도 결국엔 Z축을 계산하는 것이고 입력값은 (v,0,0) 처럼 들어온다고 생각했다.

때문에 IA_Fly 를 구현할때도 마찬가지롤 축을 재배치하여 들어온 값이 Z축으로 전달되게끔 해주었는데 작동하지 않았다. 바인딩이 문제일 수 도 있어서 로그도 찍어보았고 컨트롤러 블루프린트에 이벤트를 직접호출해봤는데 결과, 바인딩은 문제가 없으나 콜백함수를 호출하는과정에서 함수가 호출이 되지 않았던것을 알 수 있었다. BindAction 함수의 경우 내부에서 이벤트호출을 Triggers 로 하고있었는데,

이부분이 작동을 하지 않았던것이다. 하지만 trigger는 키를 입력하는것이 맞기 때문에 문제가 아니었다. 그리고 IA와 IMC를 다시 살펴보다가 IMC에서 modifiers 제거 한 후 실행해보니 정상적으로 맵핑이 호출되는것을 확인 할 수 있었다. 때문에 SwizzleAxis 와 1D 입력방식에대해 다시 찾아보니 SwizzleAxis 같은경우는 축을 재배치하는것이기때문에 입력값이 2D나 3D인 벡터에 한하여 동작하게끔 되어있다고한다. 때문에 1D float 형태로 값을 받아오던 나의 IA는 타입자체가 달라서 이벤트자체가 발생하지 않고있던것이었다. 생각해보면 1D의 경우 값을 소수점형태로 하나만 받아오기때문에 축하고는 전혀 관련이 없었던것이다.
최종적으로 하강하고싶은 바인딩에서 값을 반전해주기만 하면 되는것임을 깨달았다.

느낀점
전날 결과물을 제작하며 완전히 이해했다고 생각하는 부분이 단 하루만에 같은 시스템으로 문제가 발생했다. 새로운 내용을 이해하는것이 좋지만 스스로가 완벽히 이해한게 맞는지 다시한번 돌아볼 필요가 있었다.