26.06.16

홍종우·2026년 6월 16일

<지난번 문제점>
1. WASD를 누르면 원하는 방향을 바라보기는 하나 연속적으로 눌리지 않음.
3. 회전시에 부드럽게 움직이지 않고 순간이동으로 움직임
-> 이 두 가지는 Pawn을 기준으로 Local 로 움직여야 하는데 World방향으로 설정이 되어 있어서 World 기준으로 방향을 움직였던 것. 그래서 w를 누르면 World의 w방향을 보고 있고 s를 누르면 World의 s방향을 보고 있던 형태로 움직였던 것임.
-> Local기준으로 움직이도록 모두 수정.

  1. 이동을 안함. 점프해서 이동을하면 이동이 되는데, 바닥에 붙은 채로는 이동이 안됨.
    -> 이 문제는 오늘 해결한 것과 같이 설명하겠음.

지난 구현에서 마우스 움직임은 잘 구현된 것 같았으나 실은 문제가 있었음.
축이 너무 회전을 해서 매우 어지럽고 마우스를 움직일때 바닥면이 점점 기울어지는 현상이 있었던 것. 이를 통해 두 가지 문제점을 오늘 해결함

<문제점>
1. 마우스 회전에서 바닥면이 기울어 지는 현상
2. 게임 시작이 이동을 안함

1번 해결방법
-> 마우스의 움직임에 Pitch와 Roll값까지 모두 Pawn의 회전과 함께 카메라도 동시에 움직이니 화면이 꿀렁거리고 미세하게 값이 들어와도 카메라가 기울어지는 현상이 발생
-> 축을 두 가지로 나누었음 (Yaw회전을 Pawn에 받기/Pitch값을 SpringArm에 받기)
-> 마우스의 Yaw회전을 Pawn이 받아 Camera와 함께 회전. 이때 Pitch와 Roll의 값은 0으로 고정하고 들어온 Yaw의 값만을 Pawn에 더해 회전하게 만듬.
-> SpringArm의 Pitch회전값만을 받아옴. 이렇게 하면 Camera가 Pawn의 뒷통수에 고정.
-> 흔히 게임에서 만들어지는 3인칭 시점 처럼, Pawn의 움직임에 따라 마우스가 자연스럽게 움직이는 상태가 됨.

2번 해결방법
-> 이전에 Tick()에서 입력 값이 없을시 AddActorLocalOffset()에서 그 값이 더해지지 않도록 Tick() 마지막에 MoveInput = FVector2D::ZeroVector로 값을 Tick마다 계속 초기화해 주었음. 그런데 이것이 Pawn이 입력값을 받기도 전에 계속 ZeroVector로 초기화되어 값이 제대로 입력되지 않는다고 판단
-> MoveInput = FVector2D::ZeroVector를 삭제
-> 여전히 Pawn이 움직이지 않고 오히려 Pawn이 값을 한번 입력하면 슬라이딩하는 상황 발생
-> 슬라이딩을 막기 위해 Jump처럼 Move에도 Triggerd상황과 Completed상황 두가지 경우로 나눔. 입력값이 있으면 움직이고 키보드에서 손을 떼면 멈추도록 설정
-> 여전히 시작시에 Pawn이 제자리에 고정되고 점프를 해서 움직일때만 이동. 더더욱 점프 후 착지 이후에도 움직이지 않는 현상 발생
-> GameMode에서 Pawn이 리스폰되는 높이가 Pawn의 CapsuleComponent보다 짧은 것을 확인. 즉, 리스폰 직후에 높이가 충분하지 않아서 Pawn이 바닥에 끼는 현상이 발생했던것. 이후 점프를 통해 바닥보다 높이 올라온 후 바닥에 충돌하는 판정으로 인해 Pawn이 끼지 않게되고 움직일 수 있게됨
-> 리스폰 위치를 높이자 게임 시작시에 Pawn이 바닥에 추락하면서 움직임
-> 리스폰 위치를 (0.0.0)으로 설정하자 게임시작시 바로 움직이게됨

[깨달은 점]

코드가 바르게 되어있는 경우라 하더라도 언리얼에디터 상에서 설정을 이상하게 해놓은 경우 원하는 대로 움직이지 않는 다는 것을 알게됨. 대부분이 과제를 위해 Character클래스로 만들지 않고 Pawn클래스로 만들면서 발생한 문제이지만 IMC에서 축을 설정한다던가 Negate를 걸어준다던가 하는 등의 문제도 코드가 아닌 언리얼에디터 상에서 설정하면서 생긴 문제였음. 다음부터는 로직상에서 문제가 없다고 생각하는 경우에는 언리얼 에디터에서 문제가 없는지 살펴볼 필요가 있어보임.

Plus) 코드를 AI한테 물어보니 AI는 게임 시작시에 Pawn의 스폰지점을 코드로 강제로 설정해서 위에서 떨어지도록 알려줌. 이것을 보고 언리얼에디터에서 조절하는게 낫지 않냐라고 물어보자 그게 더 좋은 방법이라고 대답. 즉, 코드상으로 모든 것을 끝내는 것이 아니라 C++코드와 언리얼에디터를 적절하게 사용하는 방법이 매우 중요해보임.

profile
홍종우

0개의 댓글