2D 오브젝트를 이동시키는 방법으론 대표적으로 두가지 방법이 있다.
1. 첫번째로 오브젝트의 Transform 컴포넌트의 포지션 값을 변경해주는 방법이다. 즉 포지션에 할당하는 좌표값을 바꾸어 오브젝트가 위치 이동을 하는 것처럼 보이도록 만드는 것이다.
위의 코드는 내가 실제로 오브젝트를 (왼쪽으로) 움직이게 하기 위해 작성했던 코드이다.
생략은 되어있지만 tr이라는 변수에는 오브젝트의 Transfrom 컴포넌트를 할당하였다.
그리고 Vector2.MoveTowards 메소드를 사용하였다.
3개의 인자가 있는데, 각각 순서대로 처음위치, 목표위치, 움직이는 속도를 지정해주어야 한다.
목표 위치는 target이라는 새로운 2차원 벡터에 할당하였다.
움직이는 속도는 프레임 전환 속도 차이를 보정해주기 위해 Time.deltaTime을 활용하였다.
그런데, 이 방식으로 오브젝트의 이동을 완성하고 게임을 개발하다보니, 한가지 문제가 발생했다.
오브젝트가 벽에 충돌하였을 때 이동을 유지하면, 오브젝트가 살짝살짝 콜라이더를 뚫고 벽을 침범했다.
이게 무슨 말이냐 하면, 나는 오브젝트의 움직임을 포지션값 변환으로 주었기 때문에,
이동키를 누르는 순간 그 다음 프레임에서 오브젝트는 어쨌든 충돌여부에 상관없이 살짝 이동한다. 물론 이 다음 프레임에서는 다시 충돌을 감지하고 되돌아온다.
이게 무슨 일이 생기냐면, 플레이어 오브젝트를 벽에 닿게하고 계속 이동을 유지시키면, 플레이어가 벽에 닿은채로 막 진동을 한다... 벽을 뚫을 기세로.....
처음엔 이를 크게 신경쓰지않았으나 나중에 너무 연쇄적으로 발생하는 문제들이 커져서 플레이어 움직임을 다른 방법으로 제어하게 되었다. 그것이 아래의 두번째 방법이다.
2. 두번째 방법은 오브젝트에 리지드바디2D 컴포넌트를 추가하고,
리지드바디에 Horizontal 축과 평행하게 힘을 가하여 주는 방법이다.
위의 코드가 그 방법을 이용한 예시이다. 위의 코드는 오브젝트를 오른쪽으로 움직이게 하는 코드다.
변수 rb에는 오브젝트의 RigidBody2D 컴포넌트를 할당해 놓았다.
그리고 AddForce 메소드를 이용하여 특정 벡터 방향으로 힘을 가하도록 한다.
그런데 고등학교에서 배웠던 물리를 떠올려보면, 물체에 힘을 일정하게 가하면 물체는 가속도 운동을 한다. (뉴턴의...제2법칙.. F= ma)
오브젝트의 속도가 점점 빨라진다면 안되기 때문에, 오브젝트의 속도에 제한을 걸어주었다.
위의 코드가 그 방법이었다.
float speed라는 변수에 미리 속도의 최대치를 할당해주었다.
그리고 if문을 활용하여 현재 오브젝트의 속도값이 최대속도보다 작을 때만, 오브젝트에 힘을 걸어주기로 했다.
오브젝트의 속도값이 최대속도에 도달하게 되면, 오브젝트가 등속운동을 하도록 강제적으로 velocity를 고정시켜 주었다.
이 두번째 방법을 사용해보니 오브젝트의 움직임이 훨씬 부드러워졌다. 또한 1번째 방법을 사용했을 때의 문제점을 해소시켜주었다.
댓글