Home [Unity Editor] OnValidate()를 이용하여 인스펙터 관리하기
Post
Cancel

[Unity Editor] OnValidate()를 이용하여 인스펙터 관리하기

유니티 인스펙터를 통해 데이터를 관리하다 보면 컬렉션 개수를 제한한다거나 특정 값을 넣지 못하게 한다거나 하고 싶을 때가 있다.

이때 에디터 코드나 Attribute를 이용해서 막는 방법도 있지만 MonoBehaviour.OnValidate()를 이용해서 처리하는 방법을 발견해서 정리하였다.

1. MonoBehaviour.OnValidate()

 Unity - Scripting API: MonoBehaviour.OnValidate()

2. 사용해보기

인스펙터에 변경 사항이 있을 때 체크를 할 수 있기 때문에 사용할 수 있는 범위가 무궁무진한데 몇 가지 예시와 함께 사용 방법과 느낌을 알아보자

2-1. 컬렉션 개수 제한하기

예를 들어,

아래와 같이 List 컬렉션이 존재한다고 가정하자.

1
2
[SerializeField]
List<Transform> _points;

인스펙터로 객체 정보를 받고 싶지만 _points의 개수를 3개로 하고 싶다.

이때 아래와 같이 코드를 구성하면 개수를 제한할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void OnValidate()
{
    if (_points != null &&
        _points.Count != 3)
    {
        Debug.Log(_points.Count);
        Debug.LogError($"{nameof(_points)} 컬렉션 개수는 3개 고정입니다.");
        int count = _points.Count;

        if(_points.Count > 3)
            _points.RemoveRange(3, count - 3);
        else
        {
            while (_points.Count != 3)
                _points.Add(null);
        }
    }
}

이렇게 세팅을 한 후 아래와 같이 개수를 4개 이상이나 1~2개로 설정하려고 하면 에러 로그를 남기면서 리스트 컬렉션 개수가 3개로 변경된다.

Ex) Points 개수를 2개와 8개로 세팅한다면
Unity_img_38

Unity_img_39

Error 로그가 발생하면서 Points 개수가 3개로 변경되는 것을 볼 수 있다.
Unity_img_40

Unity_img_41

2-2. 음수를 가지지 않게 하기

Attribute를 이용해서 양수만 가지게 처리하는 게 가장 좋지만 예를 들어서 아래와 같이 설정할 수도 있다.

1
2
3
4
5
6
7
8
[SerializeField]
float _duration;

private void OnValidate()
{
    if (_duration < 0f)
        _duration = 0f;
}

코드 작성 후 인스펙터를 조절해보면 음수가 되지 않는 것을 볼 수 있다.

3. 정리

이것으로 에디터 코드를 구현하지 않더라도 인스펙터에 노출되는 변수들을 관리할 수 있다.

하지만 재사용할 수 없기 때문에 자주 사용하는 것들은 에디터 코드로 관리해주는 게 가장 좋지 않을까 싶다.

This post is licensed under CC BY 4.0 by the author.

구면 좌표계 구현해보기

[Unity] 베지어 곡선(Bezier Curves) 구현해보기