유니티 엔진의 이동 방식 중 Rigidbody.AddForce에 대해서 알아보겠습니다.
Rigidbody.AddForce는 정해진 방향으로 물리적인 힘을 가해서 이동하는 방식입니다. 힘을 계속 가하면 가속도가 붙고 짧게 가하면 튕기듯이 이동하게 됩니다. 일반적인 이동보다는 투사체를 쏘는 형태로 주로 사용됩니다.
1. 장점
물리적인 상호작용 : Rigidbody와 AddForce를 이용하여 중력, 마찰, 충돌 등의 효과를 오브젝트에 적용할 수 있습니다. 이를 통해 충격을 줬을 때 반동으로 해당 방향으로 튕겨져 나가는 등의 효과를 구현할 수 있습니다.
구현이 쉬움 : 유니티의 물리엔진을 사용하여 복잡한 공식없이도 물리적인 상호작용을 쉽게 구현할 수 있습니다. AddForce 메서드를 사용하여 간단하게 적용시킬 수 있습니다.
2. 단점
성능 이슈 : 간단한 게임에서는 상관이 없으나 수많은 오브젝트에 한순간에 물리연산을 하게 되는 경우 프레임 저하 등의 문제가 발생할 수 있습니다.
예측하기 어려운 물리효과 : 오브젝트가 이동하는 속도에 따라 충돌을 판정하는 범위를 넘어가는 경우 등이 발생하여 정면에서 충돌했지만 오브젝트가 이동하던 방향으로 밀리는 것이 아닌 다른 방향으로 힘의 여파가 전해질 수 있습니다. 폭발해서 잔해가 흩뿌려지는 그런 상황에서는 약간의 무작위성으로 흩뿌려져도 상관이 없지만 항상 같은 결과를 내야 하는 경우에는 버그성 플레이가 발생할 수 있습니다.
3. 예문
Rigidbody는 2D와 3D를 위한 메소드가 따로 존재합니다. 기본적으로 3D를 기준으로 만든 메소드이기 때문에 Rigidbody는 3D를 Rigidbody2D는 2D를 담당하는 메소드입니다.
다음 예문은 2D 기준입니다.
public Rigidbody2D rb;
void Start() {
rb = GetComponent<Rigidbody2D>();
}
void Update() {
if (Input.GetKeyDown(KeyCode.Space)) {
rb.AddForce(Vector2.up * 500);
}
}
이동시킬 오브젝트에 이 스크립트와 Rigidbody2D 컴퍼넌트를 같이 넣어둡니다.
Rigidbody2D 타입의 변수 rb를 선언합니다.
프로그램 실행시 Start()영역을 한번 실행합니다. 미리 선언한 rb에 인스펙터 창에 넣어둔 컴퍼넌트중에 Rigidbody2D를 가져옵니다.
이후 Update()영역을 프로그램 종료시까지 매 프레임마다 실행합니다. 스페이스바를 누를시 이 스크립트와 RIgidbody2D 컴퍼넌트가 같이 들어간 오브젝트가 Vector2.up의 방향인 위로 500의 힘으로 발사하듯이 이동합니다. 중력이 적용되기에 스페이스바를 떼면 서서히 감속하다가 추락합니다.
3D인 경우 맨처음의 rb를 선언할때 Rigidbody2D대신 Rigidbody를, GetComponent를 사용할 때 <Rigidbody2D>(); 대신 <Rigidbody>();를 사용하며 Vector2.up에서 Vector3.up을 사용하면 됩니다.
이 기능은 오브젝트에 힘을 가해서 쏘는 형태에 어울립니다. 하지만 게임은 기획하기 나름이기에 캐릭터의 이동을 발사하듯이 대쉬하는 형태로 구현하는식으로도 사용이 가능합니다.
자신이 만드는 게임에 적합한 이동방식을 찾아 구현하면 현실적으로 어색한 구현이라도 재미측면에서 좋은 결과를 보일 수도 있습니다.
자신의 게임스타일에 맞춰서 Rigidbody.AddForce를 창의적으로 사용해보세요.