[Unity6] Custom Editor

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: ,


TextField Button Color GUIContent GUIStyle GUILayoutOption



Custom Editor

1.ย Editor ํด๋”
Editor API ์‚ฌ์šฉ์„ ์œ„ํ•ด ์œ ๋‹ˆํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋”
Runtime์— ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
Assets ํด๋” ํ•˜์œ„๋ผ๋ฉด Editor ํด๋”์˜ ์œ„์น˜๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค (์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑ ๊ฐ€๋Šฅ)
Editor๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํด๋”์— Editor, EditorWindow ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์Šคํฌ๋ฆฝํŠธ ์ €์žฅ ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ
ย 
2.ย Editor Default Resources ํด๋”
Resources ํด๋”์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Custrom Editor์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์ €์žฅ ํด๋”.
EditorGUIUtility.Load(string path) โ€œsample.pngโ€๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.





์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค

์—๋””ํ„ฐ ํ™•์žฅ์„ ์œ„ํ•œ UI ์ถœ๋ ฅ์— ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค
GUI, GUILayout, EditorGUI, EditorGUILayout
ย 
GUI : ๊ฐ€์žฅ ์˜ค๋ž˜๋œ GUI ์‹œ์Šคํ…œ ์ฃผ๋กœ OnGUI() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ
GUILayout : ์ƒ๋Œ€์ ์ธ ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•ด UI ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•  ๋•Œ ์‚ฌ์šฉ
Runtime(O) / button(O)
ย 
EditorGUI : ์—๋””ํ„ฐ ์œˆ๋„์šฐ ๋ฐ ์—๋””ํ„ฐ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์œ ๋‹ˆํ‹ฐ GUI ์š”์†Œ
EditorGUILayout : EditorGUI์˜ ๋ ˆ์ด์•„์›ƒ ๋ฒ„์ „ ์ƒ๋Œ€์ ์ธ ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•ด UI ๋ฐฐ์น˜
Runtime(X) / button(X)
ย 
GUI / Layout
GUI, EditorGUI : Rect(x,y,width,heigh)๋ฅผ ํ†ตํ•ด UI์˜ ์œ„์น˜ ์„ค์ •, ๋„“์ด ๋†’์ด๋ฅผ ์ง์ ‘ ์„ค์ •
GUILayout, EditorGUILayout : UI ์œ„์น˜, ํฌ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •, ์ •๋ ฌ, (๋†’์ด : 18, ์ฝ”๋“œ ์ž‘์„ฑ ์ˆœ์œผ๋กœ ์ •๋ ฌ)
ย  GUILayoutOption, Space(float Width)๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๊ฒฉ ์กฐ์ ˆ





TestEditorWindow

SetUp() : ์—๋””ํ„ฐ ์ฐฝ ์ œ๋ชฉ, ํฌ๊ธฐ ์„ค์ •
OnGUI() : GUI ์ถœ๋ ฅ
TextField Button Color GUIContent GUIStyle GUILayoutOption

Image

TestEditorWindow
using UnityEngine;
using UnityEditor;

public class TestEditorWindow : EditorWindow
{
    private static TestEditorWindow window;

    // ํ˜„์žฌ๋Š” ์ž„์‹œ๋กœ ์—ฌ๊ธฐ์— ๋ณ€์ˆ˜๋ฅผ ๋‘์—ˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋Š” ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉ
    private string textGUI = "GUI.TextField()";
    private string textGUILayout = "GUILayout.TextField()";
    private string textEditorGUI = "EditorGUI.TextField()";
    private string textEditorGUILayout = "EditorGUILayout.TextField()";

    [MenuItem("Window/Unitynote/EmptyWindow")]
    private static void Setup()
    {
        window = GetWindow<TestEditorWindow>();

        // SceneView ์— ํฌํ•จ๋˜๋„๋ก ์„ค์ •
        // window = GetWindow<TestEditorWindow>(typeof(SceneView));

        // ์œˆ๋„์šฐ ์ œ๋ชฉ(Title) ์„ค์ •
        window.titleContent = new GUIContent("Unitynote");

        // ์œˆ๋„์šฐ ์ตœ์†Œ/์ตœ๋Œ€ ํฌ๊ธฐ ์„ค์ •
        window.minSize = new Vector2(300, 300);
        window.maxSize = new Vector2(1920, 1080);
    }

    private void OnEnable()
    {
        Debug.Log("OnEnable() : ์œˆ๋„์šฐ๊ฐ€ ์—ด๋ฆด ๋•Œ 1ํšŒ ํ˜ธ์ถœ");
    }

    private void OnGUI()
    {
        Color defaultContentColor = GUI.contentColor;
        GUI.contentColor = Color.red;

        // ์•„๋ž˜์™€ ๊ฐ™์ด new๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์œ ๋‹ˆํ‹ฐ ์—๋””ํ„ฐ ์Šคํƒ€์ผ ์ „์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
        // GUIStyle customLabelStyle	= EditorStyles.label;
        GUIStyle customLabelStyle = new GUIStyle(EditorStyles.label);
        customLabelStyle.alignment = TextAnchor.MiddleCenter;
        customLabelStyle.fontStyle = FontStyle.BoldAndItalic;
        customLabelStyle.fontSize = 20;

        GUIStyle customLabelStyle2 = new GUIStyle(GUI.skin.label);
        customLabelStyle2.fontStyle = FontStyle.Bold;

        GUIContent LabelContent = new GUIContent("GUI.Label()", "[GUIContent Hover]");

        GUI.Label(new Rect(0, 130, 300, 20), LabelContent, customLabelStyle);
        GUILayout.Label("GUILayout.Label()", customLabelStyle2);
        EditorGUI.LabelField(new Rect(0, 150, 300, 20), "EditorGUI.LabelField()");
        EditorGUILayout.LabelField("EditorGUILayout.LabelField()");

        GUI.contentColor = defaultContentColor;

        Color defaultBackgroundColor = GUI.backgroundColor;
        GUI.backgroundColor = Color.blue;


        textGUI = GUI.TextField(new Rect(0, 170, 300, 20), textGUI);
        textGUILayout = GUILayout.TextField(textGUILayout, GUILayout.Height(50), GUILayout.MaxWidth(500));
        textEditorGUI = EditorGUI.TextField(new Rect(0, 190, 300, 20), "EditorGUI : ", textEditorGUI);
        textEditorGUILayout = EditorGUILayout.TextField("EditorGUILayout : ", textEditorGUILayout);

        GUI.backgroundColor = defaultBackgroundColor;

        GUIContent btnContent = new GUIContent("GUI.Button()", "[GUIContent Hover]");

        if (GUI.Button(new Rect(0, 210, 300, 20), btnContent))
        {
            Debug.Log("GUI.Button() Click");
        }

        if (GUILayout.Button("GUILayout.Button()"))
        {
            Debug.Log("GUILayout.Button() Click");
        }
    }
}


/* Editor Default Resources
using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
public class TestEditorWindow
{
	static TestEditorWindow()
	{
		var tex = EditorGUIUtility.Load("SampleTex.png");
		Debug.Log(tex);
	}
}*/

/* GUIContent
GUILayout.Label("์ถœ๋ ฅ ๋‚ด์šฉ");

GUIContent content = new GUIContent("์ถœ๋ ฅ ๋‚ด์šฉ", "๋งˆ์šฐ์Šค๋ฅผ Hoverํ–ˆ์„ ๋•Œ ์ถœ๋ ฅํ•  ์„ค๋ช…");
GUILayout.Label(content);
*/





Label

Lable, LabelField
GUI.Label(Rect rect,string text)
GUILayout.LabelField(string text)

Image

Label
GUI.Label(new Rect(0, 130, 300, 20), "GUI.Label()", customLabelStyle);
GUILayout.Label("GUILayout.Label()", customLabelStyle2);
EditorGUI.LabelField(new Rect(0, 150, 300, 20), "EditorGUI.LabelField()");
EditorGUILayout.LabelField("EditorGUILayout.LabelField()");



TextField

string result = GUI.TextField(Rect rect, string text);
์ž…๋ ฅ ํ•„๋“œ ์ถœ๋ ฅ, ํ•„๋“œ์— ์ž…๋ ฅํ•œ ๋‚ด์šฉ์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
ย 
private string textGUI = โ€œGUI.TextField()โ€;
textGUI = GUI.TextField(new Rect(0, 170, 300, 20), textGUI);
ย 
ย 
string result = GUILayout.TextField(Rect rect, string label, string text);
Label๊ณผ ์ž…๋ ฅ ํ•„๋“œ ์ถœ๋ ฅ, ํ•„๋“œ์— ์ž…๋ ฅํ•œ ๋‚ด์šฉ์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
ย 
private string textGUILayout = โ€œGUILayout.TextField()โ€;
textGUILayout = GUILayout.TextField(textGUILayout, GUILayout.Height(50), GUILayout.MaxWidth(500));

Image

TextField
textGUI = GUI.TextField(new Rect(0, 170, 300, 20), textGUI);
textGUILayout = GUILayout.TextField(textGUILayout, GUILayout.Height(50), GUILayout.MaxWidth(500));
textEditorGUI = EditorGUI.TextField(new Rect(0, 190, 300, 20), "EditorGUI : ", textEditorGUI);
textEditorGUILayout = EditorGUILayout.TextField("EditorGUILayout : ", textEditorGUILayout);



Button

GUI๋งŒ ๊ฐ€๋Šฅ Editor(x)
bool isClick = Button(Rect rect, string text)
๋ฒ„ํŠผ ์ถœ๋ ฅ ๋ฒ„ํŠผ ์ž…๋ ฅ ์—ฌ๋ถ€๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

Image

Button
GUIContent btnContent = new GUIContent("GUI.Button()", "[GUIContent Hover]");

if (GUI.Button(new Rect(0, 40, 300, 20), btnContent))
{
    Debug.Log("GUI.Button() Click");
}

if (GUILayout.Button("GUILayout.Button()"))
{
    Debug.Log("GUILayout.Button() Click");
}



Color

๊ธฐ๋ณธ ์ƒ‰์ƒ ์ €์žฅ - GUI ์ƒ‰์ƒ ๋ณ€๊ฒฝ - ๋ณ€๊ฒฝ๋œ ์ƒ‰์ƒ์œผ๋กœ ์ถœ๋ ฅ - GUI ๊ธฐ๋ณธ ์ƒ‰์ƒ์œผ๋กœ ๋ณต๊ตฌ

Image

Color
// ๊ธ€ ์ƒ‰์ƒ ๋ณ€๊ฒฝ
Color defaultContentColor = GUI.contentColor;   // ๊ธฐ๋ณธ ์ƒ‰์ƒ ์ €์žฅ  
GUI.contentColor = Color.red;                   // GUI ์ƒ‰์ƒ ๋ณ€๊ฒฝ  

GUI.Label(new Rect(0, 0, 300, 20), "GUI.Label()", customLabelStyle);  // ๋ณ€๊ฒฝ๋œ ์ƒ‰์ƒ์œผ๋กœ ์ถœ๋ ฅ

GUI.contentColor = defaultContentColor;         // GUI ๊ธฐ๋ณธ ์ƒ‰์ƒ์œผ๋กœ ๋ณต๊ตฌ 

// ๋ฐฐ๊ฒฝ ์ƒ‰ ๋ณ€๊ฒฝ
Color defaultBackgroundColor = GUI.backgroundColor;
GUI.backgroundColor = Color.blue;

textGUI = GUI.TextField(new Rect(0, 30, 300, 20), textGUI);

GUI.backgroundColor = defaultBackgroundColor;



GUIContent

UI์— ๋งˆ์šฐ์Šค๋ฅผ hover ํ–ˆ์„ ๋•Œ ์ถœ๋ ฅํ•  ์„ค๋ช… ์„ค์ •
Label, TextField ๋“ฑ๊ณผ ๊ฐ™์ด ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์—์„œ string, GUIContent๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
GUIContent textandhovertext = new GUIContent(โ€œTextโ€, โ€œHoverTextโ€);

Image

GUIContent
GUIContent LabelContent = new GUIContent("GUI.Label()", "[GUIContent Hover]");
GUI.Label(new Rect(0, 130, 300, 20), LabelContent, customLabelStyle);

GUIContent btnContent = new GUIContent("GUI.Button()", "[GUIContent Hover]");
if (GUI.Button(new Rect(0, 210, 300, 20), btnContent))
{
    Debug.Log("GUI.Button() Click");
}



GUIStyle

ํŠน์ • style์„ ์„ค์ •ํ•˜๊ณ  ์›ํ•˜๋Š” UI์— ์ ์šฉํ•ด ๋ณ€๊ฒฝ
new๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์œ ๋‹ˆํ‹ฐ ์—๋””ํ„ฐ ์Šคํƒ€์ผ ์ „์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.

Image

GUIStyle
// ์•„๋ž˜์™€ ๊ฐ™์ด new๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์œ ๋‹ˆํ‹ฐ ์—๋””ํ„ฐ ์Šคํƒ€์ผ ์ „์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
// GUIStyle customLabelStyle	= EditorStyles.label;
GUIStyle customLabelStyle = new GUIStyle(EditorStyles.label);
customLabelStyle.alignment = TextAnchor.MiddleCenter;
customLabelStyle.fontStyle = FontStyle.BoldAndItalic;
customLabelStyle.fontSize = 20;

GUIStyle customLabelStyle2 = new GUIStyle(GUI.skin.label);
customLabelStyle2.fontStyle = FontStyle.Bold;

GUI.Label(new Rect(0, 30, 300, 20), "GUI.Label()", customLabelStyle);
GUILayout.Label("GUILayout.Label()", customLabelStyle2);



GUILayoutOption

Layout์˜ ์ตœ์†Œ, ์ตœ๋Œ€ ํฌ๊ธฐ ๋“ฑ์„ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉ
Width, minWidth, MaxWidth
Height, minHeight, maxHeight
ExpandWidth ๋‚จ๋Š” ๊ณต๊ฐ„๋งŒํผ UI๋ฅผ ์ฑ„์›Œ์„œ ์ถœ๋ ฅ
ExpandHeight ๋‚จ๋Š” ๊ณต๊ฐ„๋งŒํผ UI๋ฅผ ์ฑ„์›Œ์„œ ์ถœ๋ ฅ

Image

Color
textGUILayout = GUILayout.TextField(textGUILayout);
textGUILayout = GUILayout.TextField(textGUILayout, GUILayout.Height(50), GUILayout.MaxWidth(500));





์ด๊ฒƒ์ €๊ฒƒ ๋ฉ”๋ชจ

๊ธฐ๋ณธ์ ์œผ๋กœ Layout์„ ์‚ฌ์šฉํ•˜๊ณ  ์ƒํ™ฉ์— ๋งž๊ฒŒ GUI/Editor, ๊ธฐ๋ณธ/Layout ๊ฒฐ์ •ํ•ด์„œ ์“ฐ๋ฉด ๋  ๊ฑฐ ๊ฐ™๋‹ค.







์žก๋‹ด, ์ผ๊ธฐ?

Custom Editor๋กœ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.




๐Ÿ“”

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ