유니티 스크립트에서 유일하게 게임 플레이 버튼을 누르지 않아도 에디터 상에서 실행되는 단계이다. 각 스크립트 사이의 상호작용에 의한 것이 아니라 인스펙터 창으로 값들을 직접 조정할 때만 호출되는 함수들이므로 Initialization 단계 사이에 수행되는 것으로 추정된다.. 정확한 이유는 아직 모르겠다.
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는 스크립트 또는 인스펙터 상에서 변수의 값이 변경될 때 호출되는 함수이다. 역시 Editor 단계의 이벤트 함수이므로 플레이 모드가 아닐 때 호출된다.
유니티 C# 스크립트는 VS/VSC에서 스크립트를 수정하고 저장한 뒤 유니티 에디터로 돌아오면 스크립트 변경사항을 적용하기 위해 로드하는데, 이때 OnValidate가 호출되거나 스크립트 컴포넌트를 인스펙터 상에서 수정할 때마다 호출된다.
/* Test.cs */
private void OnValidate()
{
Debug.Log("OnValidate is executed.");
}
위 사진은 스크립트를 수정한 후 유니티 에디터로 돌아와 스크립트를 ReLoad 한 후 콘솔에 OnValidate가 자동으로 호출된 것을 확인한 화면이다.
이와 같이 인스펙터 창에서 필드의 값을 수정하면 엔터를 누르지 않아도 바뀔 때마다 실시간으로 OnValidate 함수가 호출된다. 필드의 값을 수정하는 것 외에도 컴포넌트 자체의 Enable/Disable을 변경할 때도 호출된다.