
Unity에서 방향 벡터 계산 시 실수하기 쉬운 예시
Unity에서는 벡터를 활용하여 캐릭터 이동, 회전, 방향 계산 등을 처리하는 일이 매우 빈번합니다. 하지만 이 과정에서 의외로 많은 개발자들이 실수를 하곤 합니다. 이번 글에서는 Unity에서 자주 발생하는 벡터 계산 실수와 그에 대한 올바른 사용법을 정리해보겠습니다.
1. 목표 위치를 향한 방향 벡터 계산 시 normalized 누락
가장 흔한 실수는 목표 위치에서 현재 위치를 뺀 후, 그 벡터를 방향 벡터로 사용하려는 경우입니다. 이때 normalized를 사용하지 않으면 의도치 않게 거리까지 포함된 벡터가 되어 캐릭터가 급가속하거나 느리게 움직일 수 있습니다.
// 잘못된 예시
Vector3 dir = target.position - transform.position;
transform.position += dir * Time.deltaTime; // 너무 빠르게 이동할 수 있음
// 올바른 예시
Vector3 dir = (target.position - transform.position).normalized;
transform.position += dir * moveSpeed * Time.deltaTime;
2. 회전 시 LookAt 대신 방향 벡터 직접 대입
캐릭터가 목표를 바라보게 만들 때 transform.forward = direction;을 직접 대입하면 회전이 어색하거나 물리적으로 이상한 결과가 나올 수 있습니다. 대신 Unity의 LookAt이나 Quaternion.LookRotation을 사용하는 것이 좋습니다.
// 잘못된 예시
transform.forward = direction;
// 올바른 예시
transform.rotation = Quaternion.LookRotation(direction);
3. Vector3.zero와 방향 벡터를 비교할 때 == 연산자 사용
Vector3.zero와 방향 벡터를 비교할 때 단순히 == 연산자를 사용하면, 부동 소수점 오차로 인해 예상과 다른 결과가 나올 수 있습니다. 반드시 Vector3.Distance()를 사용하거나 magnitude를 비교하는 것이 안전합니다.
// 잘못된 예시
if (direction == Vector3.zero) { ... }
// 올바른 예시
if (direction.magnitude < 0.001f) { ... }
추가로 다룰 수 있는 벡터 관련 실수 및 오해
4. transform.forward vs Vector3.forward 오해
많은 개발자들이 Vector3.forward가 오브젝트가 바라보는 방향이라고 착각하는 경우가 있습니다. 하지만 Vector3.forward는 월드 좌표 기준 Z+ 방향이고, 오브젝트의 실제 전방은 transform.forward입니다.
// 잘못된 예
Vector3 moveDir = Vector3.forward;
// 올바른 예
Vector3 moveDir = transform.forward;
5. Vector3.Angle()의 방향성 없음
Vector3.Angle(a, b)는 두 벡터 사이의 절대 각도만 알려줍니다. 즉, A가 B의 왼쪽에 있는지, 오른쪽에 있는지를 판단할 수 없습니다. 방향까지 고려해야 하는 경우에는 Vector3.SignedAngle()을 사용해야 합니다.
float angle = Vector3.Angle(a, b); // 방향 알 수 없음
float signed = Vector3.SignedAngle(a, b, Vector3.up); // 방향 포함
6. 방향 벡터 보간(Lerp) 시 .normalized 누락
두 방향 벡터 사이를 선형 보간할 때도 .normalized를 붙이지 않으면, 중간 방향의 벡터 길이가 달라져 속도가 느려지거나 빨라질 수 있습니다.
// 잘못된 예시
Vector3 newDir = Vector3.Lerp(dirA, dirB, t);
// 올바른 예시
Vector3 newDir = Vector3.Lerp(dirA, dirB, t).normalized;
7. normalized와 ClampMagnitude()의 혼동
둘은 자주 헷갈리지만 전혀 다른 기능입니다:
- normalized: 방향을 유지하면서 길이를 1로 고정합니다.
- ClampMagnitude(vector, max): 방향은 유지하되, 벡터의 길이를 최대값 이하로 제한합니다.
Vector3 normalized = vector.normalized;
Vector3 clamped = Vector3.ClampMagnitude(vector, 5f);
벡터 연산은 게임 개발에서 정말 자주 등장하는 만큼, 정확한 이해가 필수
'Unity' 카테고리의 다른 글
| Unity에서 CompareTag를 사용하는 이유와 주의사항 (0) | 2025.04.15 |
|---|---|
| Unity 애니메이션에 대하여 (0) | 2025.04.14 |
| Unity에서 특별한 폴더들과 폴더들의 역할 (0) | 2025.04.10 |
| Unity 전처리 지시문(Preprocessor Directive)과 XML 주석 (0) | 2025.04.08 |
| Unity 유한상태머신 (FSM)에 대하여 (0) | 2025.04.07 |