[Unity] 이벤트 함수 2. Editor 단계(Reset, OnValidate)

세동네·2021년 7월 25일
0

[Unity] 이벤트 함수

목록 보기
3/5
post-thumbnail

· Editor 단계

유니티 스크립트에서 유일하게 게임 플레이 버튼을 누르지 않아도 에디터 상에서 실행되는 단계이다. 각 스크립트 사이의 상호작용에 의한 것이 아니라 인스펙터 창으로 값들을 직접 조정할 때만 호출되는 함수들이므로 Initialization 단계 사이에 수행되는 것으로 추정된다.. 정확한 이유는 아직 모르겠다.

- Reset

Reset 함수는 일반적으로 에디터 모드로 인스펙터 창을 이용해 원하는 기본값을 지정하기 위해 사용한다.

/* Test.cs */

public int attack;
public int hp;

private void Reset()
{
	attack = 10;
	hp = 50;
}

Test.cs라는 스크립트에 위와 같은 변수를 추가하고 게임 플레이 버튼을 누르기 전에 미리 attack 변수에는 10의 값을, hp 변수에는 50의 값을 저장하고자 한다. 위와 같이 스크립트만 작성하고 저장한 후 유니티 에디터로 돌아가면 인스펙터 상에서 변수의 값은 다음과 같이 초기화돼있을 것이다.

이때 Reset 함수에 변수 초기화를 해주었으므로 우측 상단 Context menu를 눌러 Reset을 해주면 아래와 같이 초기화된 것을 확인할 수 있다.

또는 컴포넌트로 추가하기 전에 Reset 함수를 작성한 후 스크립트를 컴포넌트로 추가해도 위와 같이 변수가 초기화돼있는 것을 확인할 수 있다.

물론 위와 같이 굳이 함수를 사용하지 않고 변수 선언과 동시에 초기화하는 것만으로도 같은 결과를 가져온다.

/* Test.cs */

public int attack = 10;
public int hp = 50;

private void Reset()	// 설명을 위해 넣은 빈 함수이며, 실제 코드를 작성할 때 빈 이벤트 함수는 삭제하는 것이 퍼포먼스에 도움을 준다.
{
}

이 중 어떤 방법을 사용할지는 본인의 선택이며, 예시를 위해 변수 초기화를 둔 것 뿐 실제로는 더 다양한 작업을 Reset 함수에 포함시키기도 한다. 예를 들어 유니티 공식 문서에선 Reset 함수를 public 접근 지시자인 컴포넌트 캐싱에 사용하기도 했다.

/* Unity Document */

// Sets target to a default value.
// This could be used in a follow camera.

using UnityEngine;

public class Example : MonoBehaviour
{
    public GameObject target;

    void Reset()
    {
        //Output the message to the Console
        Debug.Log("Reset");
        if (!target)
            target = GameObject.FindWithTag("Player");
    }
}

- OnValidate

이벤트 함수 실행 플로우 차트에는 직접 표시되지 않았지만 마찬가지로 유니티에서 지원하는 이벤트 함수인 OnValidate는 스크립트 또는 인스펙터 상에서 변수의 값이 변경될 때 호출되는 함수이다. 역시 Editor 단계의 이벤트 함수이므로 플레이 모드가 아닐 때 호출된다.

유니티 C# 스크립트는 VS/VSC에서 스크립트를 수정하고 저장한 뒤 유니티 에디터로 돌아오면 스크립트 변경사항을 적용하기 위해 로드하는데, 이때 OnValidate가 호출되거나 스크립트 컴포넌트를 인스펙터 상에서 수정할 때마다 호출된다.

/* Test.cs */

private void OnValidate()
{
	Debug.Log("OnValidate is executed.");
}

위 사진은 스크립트를 수정한 후 유니티 에디터로 돌아와 스크립트를 ReLoad 한 후 콘솔에 OnValidate가 자동으로 호출된 것을 확인한 화면이다.

이와 같이 인스펙터 창에서 필드의 값을 수정하면 엔터를 누르지 않아도 바뀔 때마다 실시간으로 OnValidate 함수가 호출된다. 필드의 값을 수정하는 것 외에도 컴포넌트 자체의 Enable/Disable을 변경할 때도 호출된다.

0개의 댓글