본문 바로가기
개발/Unity

유니티 에디터 - OnValidate와 Reset으로 디버깅하기

by 피로물든딸기 2022. 7. 25.
반응형

Unity 전체 링크

 

참고 - 퍼블릭 변수 변경시 이벤트 발생 (Public Value Event Handler)

 

OnValidate는 변수 값의 유효성을 검사해준다.

Play 도중이 아니더라도 작동한다.

 

그리고 Reset 메서드로 스크립트를 Reset 할 때, 원하는 코드를 실행할 수 있다.

 

이 두 가지 메서드를 이용해서 디버깅을 할 때 도움이 될 수 있다.


OnValidate

 

InspectorTest.cs를 만들고 큐브에 컴포넌트로 추가하자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InspectorTest : MonoBehaviour
{
    [Range(0, 100)]
    public float maxPower;

    [Range(0, 100)]
    public float power;

    void OnValidate()
    {
        if(power > MaxPower)
        {
            Debug.LogError("Power Setting Error");
        }
    }
}

 

maxPower보다 power 값이 큰 것 이상하다.

따라서 OnValidate에서 에러를 찍도록 코드를 작성하였다.

 

Play 여부와 상관없이 작동한다.

또한 변수 변경이 감지되었을 때만 동작하기 때문에 매번 로그가 찍히지 않는다.

 

로그를 찍는 것뿐만 아니라 실제 오브젝트를 움직이는 것도 가능하다. 

즉, 변수의 유효성을 검사하며 원하는 코드를 작성할 수 있다.

 

power가 maxPower보다 클 때는 오브젝트를 위로, 그렇지 않을 때는 아래로 움직이게 해보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InspectorTest : MonoBehaviour
{
    [Range(0, 100)]
    public float maxPower;

    [Range(0, 100)]
    public float power;

    void OnValidate()
    {
        if (power > maxPower)
        {
            Debug.LogError("Power Setting Error");

            Vector3 pos = this.transform.position;
            pos.y += 0.1f;
            this.transform.position = pos;
        }
        else
        {
            Vector3 pos = this.transform.position;
            pos.y -= 0.1f;
            this.transform.position = pos;
        }
    }
}

 

마찬가지로 Play 여부와 상관없이 정상 동작한다.


Reset

 

이제 현재 상태에서 스크립트 옆의 를 눌러 Reset을 해보자.

 

Reset을 해도 슬라이더의 값이 0으로 돌아갈 뿐이다.

 

현재 오브젝트가 계속 움직였기 때문에 필요할 때는 원하는 값으로 초기화할 필요가 있다.

이럴 때는 Reset() 함수를 작성하면 된다. 

 

아래의 코드를 추가하여 Reset을 하면 (0, 0, 0)으로 바뀌도록 하자.

    void Reset()
    {
        this.transform.position = Vector3.zero;    
    }

 

이제 Reset을 하면 슬라이더도 변경되고 Position도 변경된다.

 

최종 코드는 아래와 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InspectorTest : MonoBehaviour
{
    [Range(0, 100)]
    public float maxPower;

    [Range(0, 100)]
    public float power;

    void OnValidate()
    {
        if(power > maxPower)
        {
            Debug.LogError("Power Setting Error");

            Vector3 pos = this.transform.position;
            pos.y += 0.1f;
            this.transform.position = pos;
        }
        else
        {
            Vector3 pos = this.transform.position;
            pos.y -= 0.1f;
            this.transform.position = pos;
        }
    }

    void Reset()
    {
        this.transform.position = Vector3.zero;    
    }
}

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글