벡터는 방향과 크기(길이)를 설명할 수 있는 기본적인 수학적 개념이다.
게임에서 벡터는 오브젝트의 위치, 이동 속도 또는 두 오브젝트 간 거리와 같은 기본적인 프로퍼티를 설명할 때 자주 사용된다.
벡터는 여러 차원으로 표현할 수 있으며, Unity는 2D, 3D 및 4D 벡터 작업을 위한 Vector2, Vector3 및 Vector4 클래스를 제공한다.
두 벡터를 더하면 그 결과는 오리지널 벡터를 '단계'대로 하나씩 차례대로 취한 것과 동일하다. 두 백터의 순서가 바뀌어도 결과가 같으므로 순서는 상관이 없다.
벡터가 힘을 나타내는 단위일 때 벡터를 힘의 크기인 강도와 방향으로 간주하면 더욱 직관적으로 이해할 수 있다.
두 가지 힘의 벡터를 더하면 두 힘을 합한 값과 동일한 새로운 벡터가 생성된다.
이 개념은 동시에 다수의 서로 다른 컴포넌트에 힘을 가할 때 유용하다. 예를 들어, 로켓이 추진력에 의해 앞으로 가고 있지만 역풍으로 인해 영향을 받는 경우를 구현하기 유용하다.
벡터의 뺄셈이 가장 많이 사용되는 경우는 한 오브젝트에서 다른 오브젝트까지의 거리와 방향을 구할 때이다.
주의할 점은 벡터의 뺄셈에서는 두 파라미터의 순서가 매우 중요하다는 것이다.
뺄셈 후 두 벡터의 크기는 동일하지만 정반대의 방향을 가리킨다.
A 좌표와 B 좌표가 있을 때, B 좌표에서 A 좌표를 빼면 A 좌표에서 B 좌표를 '가리키는' 벡터이다.
예를 들어, 몬스터가 플레이어를 추격해야 하는 상황을 구현할 때 플레이어의 좌표에서 몬스터의 좌표를 빼주게 되면 몬스터의 위치에서 플레이어 위치로 향하는 방향을 알 수 있다.
그 반대의 경우에는 (몬스터 좌표) - (플레이어 좌표) = (플레이어 위치에서 몬스터의 위치로 향하는 방향)
벡터를 논할 때, 일반적으로 보통의 수(예: 플로트 값)를 스칼라라고 부른다. 스칼라라는 말의 의미는 “스케일” 또는 크기만을 가진다는 의미이고 한편 벡터는 크기와 방향을 모두 가진다.
벡터에 스칼라를 곱하면 그 결과는 오리지널과 동일한 방향을 가리키는 벡터가 된다. 그러나 새 벡터의 크기는 오리지널 벡터의 크기에 해당 스칼라 값을 곱한 값과 동일하다.
마찬가지로 스칼라 나눗셈은 오리지널 벡터의 크기를 스칼라로 나누는 것이다.
이러한 연산은 벡터가 이동 오프셋 또는 힘을 나타낼 때 유용하다. 이 방식을 통해 방향에는 영향을 주지 않으면서 어떤 벡터의 크기를 변경할 수 있다.
예를 들어, 벡터에 속도 값을 곱해주어 속도를 조절할 수 있다.
using UnityEngine;
public class Monster : MonoBehaviour
{
public Transform player;
private Rigidbody2D rb2D;
private float speed = 5f;
private void Awake()
{
rb2D = GetComponent<Rigidbody2D>();
}
private void FixedUpdate()
{
Move();
}
private void Move()
{
// 플레이어로 향하는 방향 벡터를 계산
Vector2 direction = player.position - transform.position;
// 방향 벡터에 몬스터의 속도를 곱한다
Vector2 velocity = direction * speed;
// Rigidbody2D의 속도를 설정하여 몬스터 이동
rb2D.velocity = velocity;
}
}
어떤 벡터를 자신의 크기로 나누면 그 결과는 크기가 1인 벡터가 되며, 이 벡터를 노멀라이즈 벡터라고 한다.
노멀라이즈 벡터에 스칼라를 곱하면 결과 벡터의 크기는 해당 스칼라 값과 같아진다. 방향은 일정하지만 강도를 제어할 수 있는 경우에 유용하다.
예를 들어, 몬스터가 플레이어를 추격해야 하는 상황에서 (플레이어 좌표) - (몬스터 좌표)로 몬스터에서 플레이어를 향하는 벡터를 계산했을 때 이 벡터 크기(속도)는 둘 사이의 거리가 멀면 빨라지고 가까우면 느려지게 된다.
만약 몬스터의 속도를 계산할 때마다 변경되는 것이 아니라 일정하게 유지하고 싶다면 이때 사용하는 것이 노멀라이즈 벡터이다.
몬스터에서 플레이어를 향하는 벡터를 정규화해서 벡터의 크기를 1로 만들고 거기에 몬스터의 속도를 곱해주어 몬스터는 언제나 일정한 속도를 가질 수 있게 된다.
Unity에선 normalized로 간단하게 사용할 수 있다.
using UnityEngine;
public class Monster : MonoBehaviour
{
...
private void Move()
{
// 플레이어로 향하는 방향 벡터를 계산
Vector2 direction = player.position - transform.position;
// 방향 벡터를 정규화
Vector2 normalizedDirection = direction.normalized;
// 정규화된 방향 벡터에 몬스터의 속도를 곱한다
Vector2 velocity = normalizedDirection * speed;
// Rigidbody2D의 속도를 설정하여 몬스터 이동
rb2D.velocity = velocity;
}
}