유니티 프로그래밍 기초 : AddForce를 이용한 간단한 이동 구현

이번 포스팅에서는 저번에 포스팅한 AddForce를 이용해서 간단한 이동을 구현해보겠습니다.

AddForce는 오브젝트에 물리적으로 힘을 가하는 방식으로 이동하기에 일반적인 이동방식과는 차이가 있습니다. 오브젝트를 밀고, 당기고, 쏘거나(곡사) 중력이 적용되는 상태에서의 점프, 레이싱게임의 캐릭터(자동차) 등에 사용할 수 있습니다.

 

1. 예문

1.1 직접 방향지정

 

이 스크립트는 Space키의 입력에 따라서 이 스크립트가 심겨진 오브젝트를 순간적으로 힘을 가하는 방식으로 이동시킵니다. 일회성인 Input.GetkeyDown이 아닌 Getkey이기 때문에 Space키를 계속 누르고 있는동안 계속 참값을 반환하게 되고 FixedUpdate의 반복간격에 따라 힘을 점점 더 가해지면서 가속도가 더 붙습니다.

이 원리를 이용해서 레이싱게임이라면 AddForce이전에 최고속도와 현재속도를 비교하여 현재속도가 최고속도 미만일때만 AddForce가 실행되게끔 하여 자동차가 점점 빨라지게 할 수 있습니다.

현재 AddForce의 방향이 Vector3.foward로 정면으로 이동하게 됩니다. forward 이외에도 back, left, right, up, down으로 벡터3의 값을 지정할 수 있습니다.

 

1.2 GetAxiRaw를 통해 방향값 받기

 

transform.translate의 캐릭터 이동처럼 Input.GetAxisRaw로 8방향 이동도 구현이 가능합니다.

방향키 입력을 받아서 수평과 수직 방향값을 받고 그것을 Vector3 move에 담은후 AddForce(방향 * 힘)에서 방향의 값으로 넣어줍니다.

 

 

위의 스크립트가 심겨져서 움직일 Box 오브젝트의 인스펙터입니다. 이 오브젝트에는 컴퍼넌트중 Rigidbody가 있어야 스크립트에서 rb = GetComponenent에서 <Rigidbody>를 가져올 수 있습니다.

기본적으로는 Use Gravity(중력)이 v체크가 되어있는데 Plane같이 바닥을 별개로 만들지 않아 무한히 추락하는 관계로 이번에는 v체크를 해제했습니다.(이건 필수가 아니라 기획의도에 따라 다름)

 

2. 결과

이것은 첫번째 스크립트로 구현된 AddForce입니다.

위에서 UseGravity의 v체크를 해제했기 때문에 Box가 처음에 추락하지 않고 제자리에 그대로 있는 것을 볼 수 있습니다.

만약에 v체크를 했다면 AddForce의 방향이 상단방향이 아니기때문에 계속 추락하면서 foward방향으로 이동했을겁니다.

움짤에서는 정면방향으로 이동하기 때문에 점점 멀어지면서 박스가 작아지는것을 볼 수 있습니다.

 

 

이건 두번째 스크립트로 구현된 AddForce입니다. 힘을 지속적으로 받아 가속도가 붙고 반대로 힘을 주면 역으로 속도가 줄어듭니다.

또한 4방향의 값을 받기 때문에 자유롭게 좌우와 전후로(라고 해야되나?) 이동이 가능합니다.

 

오늘은 오브젝트에 힘을 가해 움직이는 방식인 AddForce에 대해서 알아봤습니다. 물리연산이 필요하기에 Update가 아니라 FixedUpdate()에서 작동해야 하며, 레이싱이나 슈팅(곡사) 등에서 유용하게 쓰입니다.

그 외에 사용처는 딱히 생각이 나지 않지만 기획의도에 따라 오브젝트 이동하는데에 유용하게 쓰일 것 같습니다.

이것으로 이번 포스팅을 마칩니다.

댓글 남기기