Rigidbody.velocity는 Transform.Translate처럼 간편하게 오브젝트를 일정속도로 이동시키고자 할 때 사용됩니다. Transform.Translate는 물리법칙을 무시하지만 Rigidbody.velocity는 물리법칙이 적용되는 차이가 있습니다.
1. 장점
간편한 이동구현 : 복잡한 연산없이 이동을 구현할 수 있습니다. 또한 프로그래밍적으로 속도 조절이 간편합니다.
물리법칙 적용 : AddForce는 지속적인 이동시 가속도가 붙지만 Velocity는 일정속도로만 움직입니다. 그리고 중력, 마찰, 충돌과 힘의 여파 등이 적용됩니다.
2. 단점
예측 불가능한 이동 : 기본적인 이동은 예측이 쉬우나 충돌과 힘의 여파 등으로 인하여 물리법칙이 적용되면 예측하기 어려운 이동을 보입니다.
성능 이슈 : 물리법칙을 연산하기 때문에 한순간에 과도한 오브젝트가 이동하게 된다면 연산 과부하로 프레임이 저하될 수 있습니다. 따라서 대규모 시뮬레이션이나 오브젝트가 나오는 게임에서 velocity를 사용시 최적화를 고려해야 합니다.
3. 예문
Rigidbody는 2D와 3D전용 메소드가 다릅니다. 3D는 Rigidbody를 2D는 Rigidbody2D를 사용합니다.
다음은 3D기준의 이동구현입니다.
public Rigidbody rb;
void Start() {
rb = GetComponent<Rigidbody>();
}
void Update() {
rb.velocity = new Vector3(5, 0, 0);
}
오브젝트에 이 스크립트와 Rigidbody를 넣습니다.
Rigidbody타입의 변수 rb를 선언합니다.
프로그램이 실행될 때 start()를 1회 호출합니다.
rb에 GetComponent로 Rigidbody를 가져옵니다.
매 프레임마다 Update()를 호출합니다.
rb.velocity에 Vector3 값을 넣어줍니다. 값은 5,0,0으로 각 숫자는 x,y,z축을 의미합니다.
x축이 양수면 우측으로 이동합니다. 이동하는 속도는 5를 나타냅니다.
딱히 GetKeyDown같은 기능으로 조작을 해야 이동하는 예문이 아니기에 그냥 실행시 매 프레임마다 오른쪽으로 5의 속도로 이동합니다.
Rigidbody.velocity는 물리엔진이 적용되면서 일정속도로 이동하는 기능으로 간단하게 구현할 수 있습니다. 보통 일정속도로 이동하면서 물리엔진으로 인해 중력 등이 적용되는 플래포머 계열에서 캐릭터들의 움직임을 담당합니다.
몬스터와 부딪힐 때도 물리법칙이 적용되서 밀리는 효과가 발생할 수 있습니다. 이런 효과를 원치 않는다면 충돌영역을 감지하는 콜라이전을 수정하고 닿았을시 물리법칙이 적용되기전에 다른 피격효과를 먼저 일으키는 등의 적용이 필요합니다. 기획에 따라 달라지는 부분으로 게임에 맞게 구현을 하면 되겠습니다.