OnValidate() 함수란?

🔍 OnValidate() 함수란?

Unity에서 OnValidate()는 Inspector에서 값이 변경될 때 자동으로 호출되는 함수입니다.
즉, 스크립트가 Play Mode가 아닐 때도 작동하며, 값이 변경되면 자동으로 검증하거나 업데이트할 수 있도록 도와줍니다.


📌 OnValidate()의 주요 특징

  1. Inspector에서 값이 변경될 때 호출됨
    • Unity Editor에서 public 또는 [SerializeField] 필드의 값을 수정하면 실행됨.
    • 수동으로 값 변경 코드(GetComponent, FindObjectOfType 등)에서는 호출되지 않음.
  2. 게임이 실행 중일 때는 호출되지 않음
    • OnValidate()는 Editor에서만 작동하며, Play Mode에서 실행되는 동안은 호출되지 않음.
    • Awake(), Start(), Update() 같은 실행 시간(Runtime) 함수와는 다름.
  3. 스크립트가 처음 추가될 때 한 번 호출됨
    • 해당 컴포넌트가 GameObject에 처음 추가되면 OnValidate()가 자동 실행됨.
  4. 값 자동 검증 및 조정 가능
    • 잘못된 값을 감지하고 자동으로 올바른 값으로 수정 가능.
    • 예를 들어, 값이 음수가 되지 않도록 강제하거나, 특정 범위 내에서만 변경되도록 조정 가능.

📌 예제 코드

✅ 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에서는 작동 안 함 → 개발 및 디버깅에 유용

필요한 곳에 적절히 사용하면 디버깅 시간을 단축하고 생산성을 높일 수 있는 유용한 기능입니다! 🚀