속도(Velocity)는 속력(Speed) 와 유사하지만 다르다.
Velocity는 크기와 방향을 모두 가지는 벡터량이고, 속력은 크기만을 가지는 스칼라량이다.
Velocity를 구하는 공식은 다음과 같다.
이는 Velocity가 변위를 시간으로 나눈 값이라는 것을 의미하며 2초에 14m 움직인 경우 Velocity는 14m/2s 즉 7m/s 가 된다.
transform.Translate를 통해 물체를 이동시켜보자.
Update(){
transform.Translate(Time.deltaTime, 0, 0);
}
이는 오브젝트에 동쪽으로 초속 1m로 움직이는 속도를 부여한다.
만약 동쪽으로 초속 2m로 움직이도록 만들고 싶다면 간단하 Time.deltaTime에 2를 곱해주면 된다.
Update(){
transform.Translate(Time.deltaTime * 2, 0, 0);
}
여기서 스칼라값인 2는 속력이라고 할 수 있다.
위의 유니티짱은 동쪽으로 1m/s 로 이동하고 아래 유니티짱은 동쪽으로 2m/s로 이동한다.
대각선으로 이동시키고 싶다면
Update(){
transform.Translate(Time.deltaTime * 2, Time.deltaTime * 2, 0);
}
이런식으로 x, y, z 에 값을 넣어 구현해주면 된다.
하지만 이때 속력은 2m/s가 아닌 2m/s일 것이다.
위의 사진처럼 대각선의 길이는 밑변의 제곱 + 높이의 제곱에 루트를 씌운것이기 때문이다.
이를 신경쓰지 않는다면
// 1. X축으로만 이동하는 상황
Vector3 direction = new Vector3(1, 0, 0);
// 2. 대각선으로 이동하는 상황
Vector3 direction = new Vector3(1, 1, 0);
transform.Translate(direction * (Time.deltaTime * 2));
x축으로만 이동할때는 2m/s 로 움직이고 대각선으로 이동할때는 2m/s 로 움직이는 의도한게 아니라면 꽤 거슬리는 상황이 발생한다.
이를 해결하기 위해서는 normalized를 사용해야 하는데,
만약 북동쪽으로 2m/s 만큼 이동하게 하고 싶다면
void Update()
{
Vector3 direction = new Vector3(1, 1, 0).normalized;
transform.Translate(direction * (Time.deltaTime * 2));
}
위와 같이 코드를 작성하면 된다. normalized는 벡터를 단위벡터로 만들어 크기를 1로 고정시켜준다. 위의 코드에서는 방향은 북동쪽이고 크기가 1인 벡터가 direction에 저장되는 것이다.
여기에 Time.deltaTime과 속력(speed)을 곱해주면 원하는 속도를 얻을 수 있다.
위에서 사용한 코드 및 예시는 모두 속도의 변화가 없이 일정한 등속운동이라고 할 수 있다.
하지만 실생활에서 등속운동하는 물체를 찾아보기는 쉽지 않다.
물론 가만히 있는 내 아령도 속도의 변화가 없으니 등속운동한다고 할 수 있지만 말이다.
따라서 이번에는 속도의 변화를 나타내는 가속도에 대해 알아보도록 하자.
가속도는 이름에서 알 수 있듯이 "속도"가 들어가므로 방향을 포함한 벡터값이다.
가속도는 속도 변화율을 나타내는 물리량인데,
가속도 = 속도 변화량 / 시간 변화량 으로 나타낼 수 있다.
가속도의 단위는 m/s 로 1초에 속도가 1m/s 씩 변한다는 의미이다.
F = ma 라는 유명한 수식을 아는가?
이는 Force = Mass * Acceleration 으로 힘은 질량 * 가속도 라는 뜻이다.
이것을 유니티짱에게 적용해보도록 하자.
public class UnityChanBullet : MonoBehaviour
{
// 힘(N)
private float force = 180;
// 질량(kg)
private float mass = 60;
// 가속도
private float acceleration;
// 속력
private float speed;
void Start()
{
acceleration = force / mass;
Destroy(gameObject, 4f);
}
void Update()
{
speed += acceleration * Time.deltaTime;
transform.Translate(0, speed * Time.deltaTime, 0);
}
}
간단하게 위와 같이 구현해보았다.
acceleration은 force / mass 로 결정되어 3m/s 의 가속도를 갖는다.
따라서 유니티짱은 매초 3m/s씩 속력이 증가하게 된다.
속도와 가속도에 대해 간단하게 알아보았다.
F=ma를 무언가에 직접 적용해 본 것은 처음이라 감회가 새롭다.( 귀여운 수준이지만 )
오늘 배운 내용을 잘 활용하면 적의 속도와 가속도, 좌표를 통해 n초뒤에 적이 위치할 좌표를 계산해서 사격 위치를 화면에 보여주는 것도 가능할 것 같다.
참고한 강의