Menu
CoddyTech

Update와 LateUpdate

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

모든 프레임마다 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

챌린지

중급

플레이어와 이름표 모두 Mover 스크립트를 실행합니다. Player에서는 target이 비어 있으므로 화살표 키로 이동합니다. NameTag에서는 target이 플레이어이므로 이름표가 플레이어 위 offset 위치에 놓입니다.

Play를 누르고 화살표 키를 길게 누르세요. 이름표가 플레이어 뒤를 따라옵니다. 여기서는 이름표의 Update()가 먼저 실행되어 플레이어가 한 프레임 전에 있던 위치를 복사합니다. 이름표가 매 프레임 플레이어의 바로 위에 있도록 수정하고, 화살표 이동은 Update()에 그대로 두세요. 그런 다음 Check를 누르세요.

직접 해보기

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);
            }
        }
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

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