Menu
CoddyTech

움직이는 방향을 바라보기

Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 44번째.

transform.LookAt에는 바라볼 지점이 필요합니다. 하지만 보통은 대신 방향을 알고 있습니다. 예를 들면 속도, 바람, 무언가가 움직인 방향입니다. Quaternion.LookRotation(direction)은 앞쪽(파란색 z 화살표)이 그 방향을 향하고 오브젝트의 위쪽이 월드의 위쪽을 향하도록 하는 회전을 반환합니다. 공중으로 쏜 화살은 처음에는 위쪽을 향하고, 떨어지면서 기울어집니다. 속도가 그렇게 변하기 때문입니다.

Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (rb.linearVelocity != Vector3.zero)
    {
        transform.rotation = Quaternion.LookRotation(rb.linearVelocity);
    }
}

중요한 것은 길이가 아니라 방향입니다. (1, 0, 2)와 (3, 0, 6)은 같은 회전을 만듭니다. 영벡터에는 방향이 없으므로 LookRotation(Vector3.zero)은 Look rotation viewing vector is zero를 로그에 기록하고 Quaternion.identity를 반환합니다. 이 값은 오브젝트가 +z를 향하도록 합니다. 그래서 화살은 먼저 확인합니다. 화살이 멈추면 기존에 향하던 방향을 유지합니다. LookAt(target.position)은 LookRotation(target.position - transform.position)과 같은 회전을 만듭니다.

방향의 위아래 성분에 따라 앞쪽도 함께 위나 아래를 향합니다. 경사면을 올라가는 보행자처럼 항상 똑바로 서 있어야 하는 오브젝트라면, 먼저 방향의 y를 0으로 설정하여 오브젝트가 y축을 중심으로만 회전하게 합니다. 두 번째 인수인 LookRotation(direction, Vector3.up)은 어느 쪽이 위인지 지정합니다. 이 인수를 생략하면 Vector3.up이 사용됩니다.

challenge icon

챌린지

중급

벌이 똑바로 선 상태로 날아가는 방향을 향하게 하세요.

  1. LateUpdate()에서 Vector3 direction = transform.position - lastPosition;를 설정하고 direction.y = 0;으로 설정하세요.
  2. direction != Vector3.zero일 때만 transform.rotation = Quaternion.LookRotation(direction);을 설정하여, 벌이 쉬고 있을 때 바라보는 방향을 유지하게 하세요.
  3. 마지막으로 transform.position을 lastPosition에 저장하세요.

‘플레이’를 누르세요. 벌이 날아가는 각 꽃을 향해 몸을 돌립니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

public class FaceMotion : MonoBehaviour
{
    Vector3 lastPosition;

    void Start()
    {
        lastPosition = transform.position;
    }

    void LateUpdate()
    {
        // 마지막 프레임 이후 벌이 이동한 방향을 바라보게 합니다.
    }
}

물리와 게임플레이의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드