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 함수로 적용