Unity/Tips

Unity Editor 유연하게 사용하기 [ 에디터 커스텀 확장 !?]

최애뎡 2021. 7. 15. 00:01
728x90
반응형

코드 먼저

#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;
using UnityEngine.Serialization;

//[RequireComponent(typeof(BoxCollider))] // 지정한 component를 요구 -> 지정한 component가 없으면 자동 추가
[AddComponentMenu ("A_CustomAddComponent/EditorTest")] // Component에 Script에서만 script찾지말고 따로 Menu만들어서 넣어 둘 수 있음
[ExecuteInEditMode] // script가 play mode가 아니라 editor mode에서도 동작 가능하게 함
public class Editor_Test : MonoBehaviour
{
    [Header("use Range")]
    [Tooltip("Basic number")]    
    public int number_0;

    [Space(10)] // 공백 살짝
    [Range(0f, 100f)]
    public int number_1;
    
    [Space(10)]
    [Range(0f, 100f)]
    public float number_2;

    [Header("use ContextMenu, ContextMenuItem")]
    [Space(10)] // [Header("use ContextMenu, ContextMenuItem")]다 위에 쓰면 Header아래 먹음
    [ContextMenuItem("Print", "PrintString")]
    [ContextMenuItem("Reset", "ResetString")]
    [TextArea]
    public string _string;

    public void PrintString() => Debug.Log(_string);

    [ContextMenu("ResetString")]
    public void ResetString() => _string = string.Empty;

    [Space(10)]
    [SerializeField] private int number_3;
    [HideInInspector] public int number_4;

    [FormerlySerializedAs("_healthCount")] //using UnityEngine.Serialization; 기존 값(_healthCount) 이름을 _killCount으로 바꿈 (값은 그대로)
    public int _killCount;
    
    //MenuItem -> using UnityEditor;
    [MenuItem("CustomMenu/CheckingTest", false, 1)] // 마지막에 priority - 우선순위 => 메뉴에 위치 우선 순서를 지정
    static void Test_0()
    {        
        string menuPath = "CustomMenu/CheckingTest";
        bool checking = Menu.GetChecked(menuPath);

        if (checking) Debug.Log("check false");
        else Debug.Log("check true");

        Menu.SetChecked(menuPath, !checking);
    }

    [MenuItem("CustomMenu/Test_1", false, 0)]
    static void Test_1() => Debug.Log("new Menu_Test_1");

    [MenuItem("CustomMenu/Test_1", true)] //CustomMenu/Test_1을 Validate로 
    static bool ConditionLogic()
    {
        return false; // 사용 못 하 도록 < - > true면 사용 가능인데 이 안에 로직을 짜서 사용하면 됨
    }

    private void OnEnable()
    {
        Debug.Log("OnEnable");
    }

    private void OnDisable()
    {
        Debug.Log("OnDisable");
    }
}

#if UNITY_EDITOR
[CustomEditor(typeof(Editor_Test))] //using UnityEditor;
public class customEditor : Editor
{
    public override void OnInspectorGUI()
    {
        EditorGUILayout.HelpBox("간단한 설명을 적어둘 수 있구만", MessageType.Info);

        base.OnInspectorGUI();
    }
}
#endif

 

* Number_2는 float (Range의 매개변수는 float), Number_1은 int여서 위처럼

 

* ContextMenuItem - 메뉴 이름 + 실행할 함수 이름

 

*ContextMenu - 메뉴 이름

 

* ContextMenuItem, ContextMenu 잘됨 :')

 

*[ExecuteInEditMode]

 

*[MenuItem]

 

customEditor class 따로 빼서 HelpBox Inspector에 아름답게 ..

 

* 하나씩 빼보고 다시 써보고 하면 쉽게 터득 가 능

+ 빌드 오류 방지 위해 전처리기 필 수

반응형