생명주기 [1]
Reset(), OnValidate()
생명주기
스크립트의 실행시작과 실행종료까지 일어나는 일련의 과정을 생명주기 Life Cycle 라고 한다.
이벤트 함수
Reset(), Awake(), OnEnable() 등 유니티에서 제공하는 특별한 함수를 이벤트 함수라고 한다.
Reset()
기본값으로 재설정하는데 사용하며, 흔히 인스펙터를 초기화 할 때 Reset 버튼을 누를 때 볼 수 있다.
사용자가 인스펙터의 컨텍스트 메뉴에서 컴포넌트를 처음 추가할 때 호출된다.
Reset 함수는 에디터 모드에서만 호출되고, Runtime 에선 동작하지 않는다.
활용
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() 함수가 자동으로 호출되며 기본값으로 설정된다.
아래와 같이 값을 임의로 변경한다.
우측 상단의 더보기 버튼을 눌러 Reset 을 실행한다.
스크립트에서 설정했던 기본값으로 초기화 되었다.
OnValidate()
생명주기 플로우차트에는 OnValidate 함수가 적혀있지 않다.
유니티 에디터에서 스크립트가 수정되거나, 컴포넌트의 필드 값이 변경될 때 호출되는 함수이다.
참고로 스크립트를 수정할 때 마다 에디터에서 잠깐 멈추고 로딩이 진행되는 컴파일 창이 뜨는 현상은
OnValidate 가 호출되서 뜨는 것이 아니라, 유니티의 스크립트 리컴파일 및 도메인 리로드1 때문이다.
활용 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 가 호출된다.
콘솔창에 아래와 같은 알림이 나타난다.
아래와 같이 스크립트에 선언된 a 변수의 값을 인스펙터 창에서 수정해본다.
수정이 이루어질 때 마다 OnValidate 함수가 호출되는 것을 볼 수 있다.
활용 2
아래의 코드를 작성하여 a 변수가 0 미만으로 설정된다면 a 를 0 으로 강제로 변경시키고 에러로그를 알리도록 했다.
이러한 방법으로, 인스펙터에서 값을 잘못 넣게되는 휴먼에러를 줄일 수 있는 방어적인 로직을 작성할 수 있다.
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 으로 강제설정 되는 모습이다.
Reference
- Unity Docs - Order of execution for event functions
- Unity Docs - Reset()
- Unity Docs - OnValidate()
- Unity Docs - Domain Reloading







