본문 바로가기

Programming/유니티

유니티(Unity) MonoBehaviour 의 이벤트 함수 설명과 FixedUpdate 예제

MonoBehaviour

MonoBehaviour의 함수들의 호출 시점과 쓰임새들을 알아보자

이벤트 함수

MonoBehaviour 를 상속하고

Awake, OnEnable, Start, FixedUpdate, OnTrigger, OnCollision,

Update, LateUpdate, OnDisable, OnDestroy, OnApplicationQuit 의

함수들을 작성하게 되면

개발자가 호출하지 않아도 자동으로 호출하게 됩니다.

순서는 위의 나열한 대로 순서대로 호출되게 됩니다.

여기서 신경써야할 두가지 함수가 있는데 Awake 와 Start 함수입니다.

이 함수들은 오브젝트를 초기화 할때 주로 쓰이는 함수입니다.

두 함수 모두 오브젝트가 활성화 되면 자동으로 한번만 호출됩니다.

차이점이 있다면

Awake는 오브젝트가 활성화 되어있다면 스크립트 컴포넌트가 활성되지 않아도 실행되고

Start는 오브젝트가 활성화 되어있어도 스크립트 컴포넌트가 비활성화라면 실행되지 않습니다.

아래의 그림을 보면 이해하는데 도움이 될 수 있습니다.

----

----

위의 세가지 사진은 순서대로 오브젝트와 컴포넌트의 활성비활성을 비교하고 있습니다.

첫번째는 오브젝트와 컴포넌트 모두 활성

Awake, Start 모두 호출됩니다.

두번째는 오브젝트만 활성

Awake만 호출됩니다.

세번째는 오브젝트 컴포넌트 모두 비활성

Awake, Start 모두 호출되지 않습니다.

FixedUpdate

Update함수는 일정한 시간을 간격으로 호출되지 않고 환경에 따라 들쑥 날쑥한 호출 간격을 가지게된다.

private void FixedUpdate()
{
    Debug.Log("FixedUpdate : " + Time.deltaTime);
}

// Update is called once per frame
void Update()
{
    Debug.Log("Update : " + Time.deltaTime);
}

다음과 같이 호출해보게 되면

FixedUpdate는 0.02 로 고정되어 호출되는 것을 확인 할 수 있다.

그러므로 FixedUpdate 는 물리효과를 관리할 때 사용된다.

FixedUpdate의 주기에 물리효과가 처리 되기 때문이다.

하나의 예를 들자면

RigidBody2d 를 이용하여 점프 효과를 나타내고 싶을 때

RigidBody의 velocity를 이용하여 점프연출을 만들게 된다.

이 때, 자연스러운 카메라 연출을 위해 카메라와 점프 대상의 위치를 보간할 때

Update 함수 안에서 보간을 한다면 Stuttering 현상이 발생하게 된다.

떨떨 거리거나 끊기는 현상이 발생하게 되는 것이다.

반면 FIxedUpdate 함수 안에서 보간을 한다면 자연스러운 연출이 된다.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SmoothLookAt : MonoBehaviour
{
    [SerializeField] Transform target;
    [SerializeField] float smooth;

    Vector2 velocity = Vector2.zero;

    private void FixedUpdate()
    {
        Vector2 smoothPos = Vector2.SmoothDamp(transform.position, target.position, ref velocity, smooth);
        transform.position = new Vector3(0, smoothPos.y, -10);
    }
}

위의 코드같이 작성하면 카메라가 자연스럽게 타겟을 따라가는 연출을 만들 수 있다.