[TIL] 30일 차 - Unity 캐릭터 발사기 구현 트러블슈팅

ChangBeom·2025년 3월 10일

TIL

목록 보기
31/53
post-thumbnail

[배경]

Unity 2022.3.17f버전을 사용하여 Adventure Game을 개발하던 도중 플레이어가 상호작용하면 특정 방향으로 플레이어를 날려주는 캐릭터 발사기를 구현하려는 상황.


[발단]

발사기 오브젝트와 상호작용하면 발사기 가운데로 플레이어를 위치시키고, 입력받은 각도를 Vector3로 바꿔 앞쪽 상단 대각선 방향에 Impulse 형식으로 힘을 가해 포물선을 그리며 캐릭터를 발사하도록 만드려고 했으나, 앞(z축)으로는 엄청 조금 순간이동 하듯이 이동하고, 위(y축)로는 정상적으로 연속적인 이동을 하는 현상이 발생했다.


[전개]

그리고 문제를 해결하기 위해 다음과 같은 시도를 했다.

  • AddForce의 두번째 매개변수인 ForceMode 바꿔서 테스트
  • Vector3(0,1,1)같은 고정된 값으로 힘을 가해보기
  • 바닥과의 마찰 때문일수도 있다고 생각하여, 마찰계수 조정
  • Player 오브젝트의 Rigidbody 여러 설정들을 바꿔가며 테스트

위 과정들을 통해 해당 로직에는 문제가 없다는 판단을 했다.


[위기]

그래서 어디서 문제가 생긴건지 찾기 위해 튜터님과 함께 고민을 하던 도중, Player를 이동시킬 때 사용하는 Move() 함수에 문제가 있다는 것을 깨달았다.

위 코드를 보면 알 수 있듯이, Move()함수가 호출되면(0,velocity.y,0) 값이 들어가는데 문제는 이 Move()함수가 FixedUpdate에서 호출되기 때문에 지속적으로 (0,velocity.y,0) 값이 들어간다. 간단하게 설명하자면 y축은 변화량을 넣어주고 있어서 정상적으로 작동하지만, x축과 z축은 AddForce값이 딱 1번만 연산 되고 바로 변화량이 0으로 바뀌어서 순간적으로 1번만 이동하기 때문에 순간 이동 하듯이 보이는 것이었다.


[절정]

그래서 나는 임시방편으로 발사대에서 플레이어를 발사할 때 isLauncher라는 bool값 변수를 ture로 만들고, Move()함수는 isLauncher가 false일때만 호출되도록 if문을 사용하여 조건을 걸었다. 그리고 플레이어가 지면에 닿으면 isLauncher를 false로 바꾸는 식으로 해결했다.


[결말]

이제 버그를 수정하여 정상적으로 작동한다.

또 이런일이 생길수 있기 때문에 다음부턴 Move() 함수를 구현할 때, transform.position을 이용하여 Update 함수에서 플레이어의 위치를 변경하도록 구현하고, 나머지 물리 연산은 FixedUpdate에서 관리하도록 설계하는 것도 고려해봐야겠다.

0개의 댓글