Component GUI

ㅋㅋ·2022년 9월 7일
0
public class CustomScript : MonoBehaviour
{
    [SerializeField]
    private int n = 0;

}

SerializeField는 유니티 에디터가 읽을 수 있도록 직렬화함

데이터 보호 수준과 상관 없음


[CustomEditor(typeof(CustomScript))]
public class CustomEditorTest : Editor
{
	CustomScript target;

    SerializedProperty targetObjectProperty;
	...
}

컴포넌트 GUI를 수정하기 위해서는 Editor 클래스를 상속 받아야 하고,

CustomEditor 어트리뷰트에 재정의를 하려는 컴포넌트 타입을 넣어준다.


private void OnEnable()
{
    targetObjectProperty = serializedObject.FindProperty($"{nameof(CustomScript.otherObject)}");
	...

    target = (CustomScript)base.target;
}

GUI를 재정의 한 컴포넌트 스크립트가 붙은 게임 오브젝트를

에디터에서 클릭할 시 OnEnable 함수가 호출 된다.

에디터 인스펙터에서 표시할 변수들을 FindProperty를 통하여 찾아준다.


public override void OnInspectorGUI()
{
    serializedObject.Update();

    if (hpProperty.intValue < 50)
    {
        GUI.color = Color.red;
    }
    else
    {
        GUI.color = Color.green;
    }

    hpProperty.intValue = EditorGUILayout.IntSlider("HP", hpProperty.intValue, 0, 100);

    ...

    EditorGUILayout.PropertyField(targetObjectProperty);

    serializedObject.ApplyModifiedProperties();
}

SerializedProperty는 제네릭한 데이터이기 때문에

해당 데이터에서 적절한 데이터 값을 intValue와 같은 함수를 통해 뽑아와야 한다.

PropertyField 함수로 SerializedProperty를 적용할 수 있음

(기존의 표시 방식을 그대로 쓰거나 일부 수정하여 쓰는 등의 사용)

serializedObject는 전역적으로 사용하기 때문에 함수 시작 부분에서 Update한 후,

수정할 사항을들 모두 수정 후 ApplyModifiedProperties 함수로 적용

0개의 댓글