Post

생명주기 [1]

Reset(), OnValidate()

생명주기 [1]

생명주기


스크립트의 실행시작과 실행종료까지 일어나는 일련의 과정을 생명주기 Life Cycle 라고 한다.

img Life Cycle Flow Chart


이벤트 함수

Reset(), Awake(), OnEnable() 등 유니티에서 제공하는 특별한 함수를 이벤트 함수라고 한다.


Reset()


기본값으로 재설정하는데 사용하며, 흔히 인스펙터를 초기화 할 때 Reset 버튼을 누를 때 볼 수 있다.

사용자가 인스펙터의 컨텍스트 메뉴에서 컴포넌트를 처음 추가할 때 호출된다.

Reset 함수는 에디터 모드에서만 호출되고, Runtime 에선 동작하지 않는다.

img


활용

Reset() 함수를 스크립트에서 직접 활용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using UnityEngine;

public class ResetTest : MonoBehaviour
{
    public int a;
    public int b;
    public int c;
    
    void Reset()
    {
        a = 5;
        b = 3;
        c = 7;
        Debug.Log("재설정"); // Reset 버튼을 누르면, 콘솔에 "재설정" 문구 알림
    }
}

위 스크립트를 게임 오브젝트의 컴포넌트로 추가하면, Reset() 함수가 자동으로 호출되며 기본값으로 설정된다.

img 컴포넌트 추가


아래와 같이 값을 임의로 변경한다.

img 값 변경


우측 상단의 더보기 버튼을 눌러 Reset 을 실행한다.

img Reset


스크립트에서 설정했던 기본값으로 초기화 되었다.

img 초기화


OnValidate()


생명주기 플로우차트에는 OnValidate 함수가 적혀있지 않다.

유니티 에디터에서 스크립트가 수정되거나, 컴포넌트의 필드 값이 변경될 때 호출되는 함수이다.


참고로 스크립트를 수정할 때 마다 에디터에서 잠깐 멈추고 로딩이 진행되는 컴파일 창이 뜨는 현상은

OnValidate 가 호출되서 뜨는 것이 아니라, 유니티의 스크립트 리컴파일 및 도메인 리로드1 때문이다.

img 수정할 때 마다 개발자들의 발목을 붙잡는…


활용 1

OnValidate() 함수를 스크립트에서 직접 활용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
using UnityEngine;

public class OnValidateTest : MonoBehaviour
{
    public int a = 0;
    
    void OnValidate()
    {
        Debug.Log("OnValidate");
    }
}

위 스크립트를 작성 후 저장하면 도메인 리로드를 진행한 뒤, OnValidate 가 호출된다.

콘솔창에 아래와 같은 알림이 나타난다.

img


아래와 같이 스크립트에 선언된 a 변수의 값을 인스펙터 창에서 수정해본다.

수정이 이루어질 때 마다 OnValidate 함수가 호출되는 것을 볼 수 있다.

img 호출되는 모습


활용 2

아래의 코드를 작성하여 a 변수가 0 미만으로 설정된다면 a0 으로 강제로 변경시키고 에러로그를 알리도록 했다.

이러한 방법으로, 인스펙터에서 값을 잘못 넣게되는 휴먼에러를 줄일 수 있는 방어적인 로직을 작성할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using UnityEngine;

public class Test : MonoBehaviour
{
    public int a = 0;
    
    void OnValidate()
    {
        Debug.Log("OnValidate");

        if (a >= 0) return;
        a = 0;
        Debug.LogError("a 는 0 이하로 설정할 수 없습니다.");
    }
}

-1 을 대입하자 아래와 같이 에러로그가 발생하고 0 으로 강제설정 되는 모습이다.

img Error


Reference



Footnote

  1. 모든 스크립트 상태 초기화, 플레이 모드를 시작할 때마다 정적 필드와 등록된 핸들러가 전부 초기화되는 기능.
    공식문서 참조. ↩︎