🌟 Unity의 OnValidate()😋 🌟
안녕하세요. 박민성입니다. ☺️
오늘은 Unity의 OnValidate()에 대해서 글을 쓰고자 합니다. 🤔
1. OnValidate()란?
OnValidate()는 Unity Editor에서 직렬화된 값이 변경되거나 스크립트가 로드될 때 Unity가 자동으로 호출하는 메시지 함수입니다.

직접 호출하는 메서드가 아닌 Unity가 필요한 시점에 자동 호출하는 메서드입니다. (ex. Update, Start)
2. 언제 호출될까요?
대표적으로 Inspector에서 직렬화된 값을 수정했을 때 호출됩니다. 그리고 스크립트가 로드되는 과정에서도 호출됩니다.
[SerializeField] private int health = 100;
Inspector 창에서 health를 100에서 200으로 수정하면 OnValidate()가 호출됩니다.
여기서 중요한 점은 OnValidate()는 단순하게 “Inspector 값 변경 이벤트”라고만 생각할 수 있지만.
직접 수정하지 않았는데도 객체나 스크립트가 로드되는 과정 등에서 호출될 수 있기 때문입니다.
3. Inspector 값 검증하기
가장 대표적인 사용 방법입니다.
체력이 음수가 되면 안 된다고 했을 때
[SerializeField]
private int health = 100;
private void OnValidate()
{
if (health < 0)
{
health = 0;
}
}
Inspector에서 실수로 Health를 -500으로 바꿔도 OnValidate()가 실행되어서 Health가 음수가 아니게 보정할 수 있습니다.
Unity에서도 OnValidate()의 주된 용도를 직렬화 필드의 유효성 검사와 데이터 제약 유지로 설명하고 있습니다.
OnValidate()는 자동 계산으로도 사용할 수 있고 Mathf.Clamp을 사용해서 범위를 간단하게 제한할 수 있습니다.
이외 등등 여러 방면, 여러 방식과 방법으로 사용됩니다.
4. 내부적으로 어떻게 호출될까요~?
OnValidate();
보통 OnValidate()는 그냥 다른 곳에서 코드를 호출하지 않습니다.
그냥 Unity가 자동으로 찾아서 실행하는 것입니다.
OnValidate()는 Update(), Awake()처럼 Unity가 인식하는 MonoBehaviour 메시지 함수 중 하나입니다.
그렇기 때문에 개념적으로 Inspector 데이터 변경 -> Unity Editor가 직렬화 데이터 변경 처리 -> 해당 객체의 OnValidate 메시지 호출 -> 개발자가 작성한 OnValidate() 실행 이라고 이해하면 될 것 같습니다.
5. 주의할 점
Inspector 창에서 값을 바꾸면 그 바로바로 OnValidate가 실행 되기 때문입니다.
OnValidate()는 런타임 게임 로직을 처리하는 곳이 아니라 Editor에서 데이터를 올바르게 유지하기 위한 곳이라고 생각하시면 됩니다.
그치만
[SerializeField] private int enemyId;
private void OnValidate()
{
gameObject.name = $"Enemy_{enemyId}";
}
[SerializeField] private BoxCollider boxCollider;
[SerializeField]
private Vector3 hitBoxSize;
private void OnValidate()
{
if (boxCollider != null)
{
boxCollider.size = hitBoxSize;
}
}
이런식으로 인스펙터 창에서 어떤 것을 바꾸면 따라 바꿔어야할 값들이 있다면 OnValidate()를 사용해서 편의성 높게 사용할 수 있습니다.
오늘은 Unity의 OnValidate()에 대해서 알아보았습니다.
사실 찾아보면서 제가 거의 다 아는 내용이고.. 별거 없어서..... 흠.......
내일은 더욱 알찬 내용으로 돌아올 수 있게 노력해보겠습니다.
봐주셔서 감사합니다. ☺️