🔍 OnValidate() 함수란?
Unity에서 OnValidate()는 Inspector에서 값이 변경될 때 자동으로 호출되는 함수입니다.
즉, 스크립트가 Play Mode가 아닐 때도 작동하며, 값이 변경되면 자동으로 검증하거나 업데이트할 수 있도록 도와줍니다.
📌 OnValidate()의 주요 특징
- Inspector에서 값이 변경될 때 호출됨
- Unity Editor에서 public 또는 [SerializeField] 필드의 값을 수정하면 실행됨.
- 수동으로 값 변경 코드(GetComponent, FindObjectOfType 등)에서는 호출되지 않음.
- 게임이 실행 중일 때는 호출되지 않음
- OnValidate()는 Editor에서만 작동하며, Play Mode에서 실행되는 동안은 호출되지 않음.
- Awake(), Start(), Update() 같은 실행 시간(Runtime) 함수와는 다름.
- 스크립트가 처음 추가될 때 한 번 호출됨
- 해당 컴포넌트가 GameObject에 처음 추가되면 OnValidate()가 자동 실행됨.
- 값 자동 검증 및 조정 가능
- 잘못된 값을 감지하고 자동으로 올바른 값으로 수정 가능.
- 예를 들어, 값이 음수가 되지 않도록 강제하거나, 특정 범위 내에서만 변경되도록 조정 가능.
📌 예제 코드
✅ 1. 값이 음수가 되지 않도록 자동 조정
using UnityEngine;
public class PlayerStats : MonoBehaviour
{
[SerializeField] private int health = 100;
void OnValidate()
{
if (health < 0)
{
Debug.LogWarning("Health는 0보다 작을 수 없습니다. 자동 수정됨.");
health = 0;
}
}
}
💡 설명:
- health가 0보다 작은 값을 가지면 자동으로 0으로 변경됨.
- Inspector에서 값을 수정할 때마다 OnValidate()가 실행됨.
✅ 2. Transform을 자동 정렬하기
using UnityEngine;
public class SnapToGrid : MonoBehaviour
{
[SerializeField] private float gridSize = 1f;
void OnValidate()
{
transform.position = new Vector3(
Mathf.Round(transform.position.x / gridSize) * gridSize,
Mathf.Round(transform.position.y / gridSize) * gridSize,
Mathf.Round(transform.position.z / gridSize) * gridSize
);
}
}
💡 설명:
- gridSize 값을 기준으로 객체가 자동으로 그리드에 맞춰 이동됨.
- Inspector에서 위치를 변경하면 즉시 OnValidate()가 실행되어 자동으로 그리드 정렬됨.
📌 OnValidate()와 Awake()의 차이
기능 OnValidate() Awake()
언제 실행됨? | Inspector 값 변경 시 | 게임 시작 시 |
Play Mode에서 실행? | ❌ (Editor에서만) | ✅ (Runtime에서) |
주요 목적 | 값 검증 및 자동 수정 | 초기 설정 |
호출 시점 | Inspector 값 변경 직후 | 오브젝트가 활성화될 때 |
👉 요약:
- OnValidate() → 에디터에서 값이 변경될 때 실행 (게임 실행 전)
- Awake() → 게임이 시작될 때 실행 (Runtime)
📌 사용하면 좋은 경우
✅ 값이 잘못되었을 때 자동으로 수정하고 싶을 때
✅ 특정 값이 변경될 때 실시간으로 반영해야 할 때
✅ Inspector에서 특정 조건을 강제하고 싶을 때 (예: 값 범위 제한)
📌 주의할 점
⚠ 실행 중에는 동작하지 않음 → OnValidate()는 Play Mode에서는 호출되지 않음.
⚠ 무거운 연산을 넣으면 비효율적 → Inspector에서 변경될 때마다 실행되므로, 복잡한 연산이 있으면 성능에 영향을 줄 수 있음.
⚠ Debug.Log() 남발 주의 → Inspector에서 값 변경 시마다 호출되므로, Debug.Log()를 남발하면 콘솔이 너무 많이 출력될 수 있음.
✅ 정리
- OnValidate()는 Inspector에서 값이 변경될 때 자동 호출되는 함수.
- 값을 검증하거나 자동 수정하는 용도로 사용할 수 있음.
- Play Mode에서는 실행되지 않고, 오직 Unity Editor에서만 작동함.
- 값 변경 시 바로 반영되므로 디버깅 및 개발 편의성을 높이는 데 유용함.
🚀 요약:
✔ 값 검증 자동화 → 잘못된 값 자동 수정 가능
✔ 실시간 반영 → Inspector에서 수정하면 즉시 적용됨
✔ Play Mode에서는 작동 안 함 → 개발 및 디버깅에 유용
필요한 곳에 적절히 사용하면 디버깅 시간을 단축하고 생산성을 높일 수 있는 유용한 기능입니다! 🚀