참고 - 퍼블릭 변수 변경시 이벤트 발생 (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:
Unity Pro:
Unity 프리미엄 학습:
'개발 > Unity' 카테고리의 다른 글
유니티 Attribute - AddComponentMenu로 Script 메뉴 관리하기 (0) | 2022.07.27 |
---|---|
유니티 - 다양한 캐스트 사용하기 (RayCast, BoxCast, SphereCast, CapsuleCast) (0) | 2022.07.25 |
유니티 에디터 - 속성으로 인스펙터 정리하기 (Customizing the Inspector with Attributes) (0) | 2022.07.25 |
유니티 - 스크립트 모양을 톱니 바퀴 아이콘으로 바꾸기 (Replace Script Icon) (0) | 2022.07.22 |
유니티 - OverlapSphere로 주변 콜라이더 탐색하기 (Check Collisions using OverlapSphere) (1) | 2022.07.21 |
댓글