
맵이 될 러닝 킷과 캐릭터가 될 에셋을 가져와 구성해주었다.

캐릭터 에셋에 내장되어있는 기본 삼인칭 캐릭터에서 자손을 만든뒤 카메라를 오른쪽 왼쪽으로 움직일 수 없었던 부분을 수정해주었다.

언리얼 기본 캐릭터에서 다른 메시로 바꿔 캐릭터 준비완료
먼저 에디터의 툴 메뉴에서 새로운 C++클래스 추가를 눌러 소스코드가 사용가능하게 만들어준다.
이 과정에서 비주얼을 빌드하고 에디터를 컴파일해도 에디터에 C++파일이 뜨지않아 에디터를 닫았다 다시키려 했더니 켜지질 않는 오류가 발생
뜨는 창에서 Yes를 누르고 에디터가 다시 프로젝트를 로드하기 시작한다.
로드가 끝나고 다시 들어갈때 Yes를 눌러도 잠잠하다.
그리고 다시 실행하니 작동
전에 RPG만들기할 때 나왔던 오류가 또 등장한 것이다.
그때는 C++파일을 생성 후 잘못만진거라서 결국 해결하지 못해 3~4시간 분량을 복습하는 마음으로 다시 했었는데 이번에는 잘 해결돼서 다행이다.

액터를 상속받은 MovingPlatform을 생성하고 크기를 조정해준다.

무빙플랫폼 소스파일의 틱 부분에서 정의된 MyVector를 캐릭터앞으로 초기화 후 Y에 1씩 계속 더해주고 위치를 계속 업데이트한다.

그럼 날아가는 발판 완성

발판이 잘 날아가지만 틱 함수에서 조정해주었기에 모든 환경에서 속도가 일정하지 않을 수 있다.
DeltaTime을 사용하여 1초에 100cm를 모든 환경에서 일정하게 이동하도록 설정해주었다.

먼저 발판이 이동한거리를 알기 위해 시작지점을 표시할 변수 StartLocation을 생성, BeginPlay에서 액터의 현재 위치를 받는다.
시작위치와 현재위치의 거리를 알기 위해 DistanceMoved 변수를 Tick에생성하고 FVector의 내장 함수인 Dist로 두 값의 차이를 받는다.
발판이 어디까지 이동할지 MovedDistance함수로 거리를 설정해준 뒤 if문을 통하여 거리에 도달하면 시작지점을 초기화 발판이 반대로 가도록 발판 속도를 음수로 설정해준다.
발판의 이동거리를 100, 속도를 1000으로 올리면 발판은 속도대로 1000을 이동한 뒤 되돌아오는 오류가 발생한다.
즉 마지막으로 이동할때 이동속도의 크기가 남은 거리보다 크다면 목표지점을 지나친다는 것이다.
이것을 해결하기 위해 마지막에는 직접 목표지점을 명시해줘야할 필요가 있다.

여기서 사용하는 것이 GetSafeNormal 함수, 벡터의 방향만을 1의 크기로 가지고 있는 함수이다. (1, 1, 0) -> x와 y 사이 정확히 가운데로 1만큼
위와 같이 지나치게될 상황이 온다면 PlatformVelocity(100, 0, 0)의 크기가 아닌 x라는 방향을 MoveDirection이라는 벡터에 정규화시켜 담아(1, 0, 0) 이동거리(100)에 곱해주면 (100, 0, 0) 방향이 있는 이동거리로 전환되고 그것을 시작지점에 더해 목표지점을 명시해준다.

만들어 뒀던 C++ MovingFlatform을 블루프린트 클래스로 상속받아 에셋을 이용해 돌기둥으로 만들어주었다.

속력과 거리를 이용해 땅에서 솟아오르는 크고 대단한 돌기둥 완성

돌기둥 다음으로 좌우로 움직이는 큐브를 만들었다.
큐브와 캐릭터 충돌시 충돌이 매끄럽지 못한 부분을 많이 보여주었다.

매끄러운 충돌은 MoveUpdateComponent에서 Sweep을 통해 충돌을 강제적용 시켜주고 캐릭터가 충돌의 문제가 있는 x와 y방향으로 1씩 이동하도록 업데이트해주고 다시 -1씩 이동하도록하여 충돌 직전에 캐릭터를 밀어주는 방식으로 해결할 수 있었다.
또한 캐릭터의 위치만을 업데이트 해주기에 캐릭터가 전방밖에 바라보지 못하는 상황이 되었고 그 부분을 GetActorRocation을 통해 해결해주었다.

재사용률이 있을 수 있는 부분을 반환 함수로 만들어 소스를 정리해주었다.

액터가 이동하면서 지정된 위치에서 벗어날 수 있는 상황을 로그로 남겨 보고 관리할 수 있도록 만들어주었다.

회전하는 액터를 만들기 위해 변수 RotationVelocity와 함수 RotationPlatform을 만들어 회전 기능을 추가해준다.
SetActorRotation는 90도 회전 이후 다시 초기화하여 처음부터 돌려야하는 문제가 있기 때문에 액터에 일정회전을 계속 더해주는 AddActorLocalRtation을 사용하였다.

회전 원판과 회전문들을 설치해준 뒤 아래의 성을 그대로 올려 골 지점을 만들어주었다.