Menu
CoddyTech

Update와 LateUpdate

Coddy Unity 여정의 Unity 스크립팅 기초 섹션에 포함된 레슨. 85개 중 71번째.

매 프레임마다 Unity는 모든 스크립트에서 Update()를 호출하고, 모든 스크립트가 작업을 마친 뒤에야 모든 스크립트에서 LateUpdate()를 호출합니다. 어떤 오브젝트의 Update()가 먼저 실행될지는 여러분이 정할 수 없습니다.

이 점은 다른 대상의 동작을 따르는 모든 것에 중요합니다. Update()에서 플레이어의 위치를 복사하는 카메라는 플레이어의 Update()가 플레이어를 움직이기 전에 실행될 수 있습니다. 그러면 카메라는 플레이어가 한 프레임 전에 있던 위치를 복사하게 됩니다. 그 결과 카메라가 한 걸음 뒤처지고, 오브젝트를 추가하거나 씬을 다시 불러올 때 이런 현상이 발생할지가 달라질 수 있습니다. LateUpdate()에서는 플레이어가 움직인 뒤에 항상 위치를 복사합니다.

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);

void LateUpdate()
{
    transform.position = player.position + offset;
}

규칙은 다음과 같습니다. 오브젝트를 움직이는 코드는 Update()에 넣고, 카메라, 레이블, 조준처럼 오브젝트가 최종적으로 위치한 곳에 반응하는 코드는 LateUpdate()에 넣으세요. 둘 다 프레임마다 한 번 실행되며, Time.deltaTime은 두 메서드에서 같은 의미입니다.

challenge icon

챌린지

중급

매 프레임 이름표가 플레이어 바로 위에 오도록 하세요.

  1. 모든 스크립트의 Update() 이후에 실행되는 void LateUpdate()를 추가하세요.
  2. if (target != null) 부분을 그 안으로 옮기고, Update()에는 if (target == null) 아래에 화살표 이동 코드만 남기세요.

‘플레이’를 누르고 화살표 키를 길게 누르세요. 이름표가 플레이어 바로 위에 유지됩니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

public class Mover : MonoBehaviour
{
    public Transform target;
    public Vector3 offset;
    public float speed = 4f;

    void Update()
    {
        if (target != null)
        {
            transform.position = target.position + offset;
        }
        else
        {
            if (Input.GetKey(KeyCode.RightArrow))
            {
                transform.position += new Vector3(speed * Time.deltaTime, 0, 0);
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                transform.position -= new Vector3(speed * Time.deltaTime, 0, 0);
            }
        }
    }
}

Unity 스크립팅 기초의 모든 레슨

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