파일을 통해 데이터를 저장하여 불러오거나 해도 되지만

유니티에는 스크립터블 오브젝트라는 형태로 데이터 저장 및 사용이 가능합니다.

 

using UnityEngine;

[CreateAssetMenu(fileName = "MyEditorData", menuName = "Custom ScriptableObject/MyEditorData")]
public class MyEditorData : ScriptableObject
{
    public string filePath;
}

 

우선 string형 하나만 입력받도록 설정해줍니다. 클래스는 ScriptableObject 를 상속 받기만 하면 됩니다.

생성을 위해 CreateAssetMenu 를 설정해주겠습니다.

fileName : 생성될 파일명

munuName : 메뉴에 나타날 이름입니다.

 

CreateAssetMenu를 통해 해당 이름으로 파일 생성이 가능해졌습니다.

 

 

해당 파일을 클릭하면 Inspector에서 보기 및 편집이 가능합니다.

 

유니티를 껏다켜도 해당 정보는 저장되어 있게 됩니다.

이제 이것을 통해 윈도우 에디터 값들을 저장하며 만들 예정입니다!

using UnityEngine;
using UnityEditor;

public class MyEditor : EditorWindow
{
    private static EditorWindow window;
    private static float width = 600;
    private static float height = 600;

    [MenuItem("CustomWindow/MyEditor")] //상단 메뉴에 추가됩니다.
    public static void Open ()
    {
        window = GetWindow<MyEditor>();

        Rect main = EditorGUIUtility.GetMainWindowPosition(); //전체 화면 크기를 갖고 옵니다.

        window.minSize = window.maxSize = new Vector2(width, height); //시작 사이즈를 width, height로 만들어 주고

        window.minSize = new Vector2(200, 200);
        window.maxSize = new Vector2(main.width, main.height); //제한을 풀어줍니다.

        //window.position에 x, y 좌표와 width, height가 들어있습니다.
        window.position = new Rect((main.width - width) * 0.5f, (main.height - height) * 0.5f, width, height);
    }

    private void OnGUI()
    {
        GUILayout.Label("Hello!");
    }
}

 

[MenuItem("CustomWindow/MyEditor")] 를 통해 메뉴가 상단에 추가 된 모습

 

윈도우 창이 실행 된 모습. 가운데에 위치하게 됩니다. (전체화면으로 한 경우만!)

유니티 에디터에 대해 독학 중인데 엄청난 뻘짓들을 하고 있습니다..

가끔씩 이상한데 꽂혀서 시간을 많이 쓰네요.. ㅠ_ㅠ

 

찾아보면 기능들이 다양하고 많네요 ' - '@

시간이 되면 만져 본 것들을 하나씩 정리해보기!

커스텀 에디터를 만들 때 가장 중요한 항목은 사용자의 확인, 취소에 대한 입력을 받는 것입니다.

그리고 실수로 잘 못 된 버튼을 누르는 것을 방지하거나 무언가 오류가 생길시 알림을 주는 기능도 할 수 있습니다.

 

C#으로 치면 MessageBox 기능이고

유니티에서는 UnityEditor.EditorUtility.DisplayDialog 를 통해 메시지 출력이 가능합니다.

 

에디터 모드에서도 가능하지만 실시간 게임 중에도 출력이 가능하기에 우선

플레이 버튼 시 메시지가 뜨도록 MonoBehaviour에 작성하여 실행시켜보았습니다.

 

파라미터 개수에 따라 확인만 가능하거나 취소까지 가능하며

해당 결과를 bool 값으로 받을 수 있습니다.

using UnityEngine;
using UnityEditor;

public class ShowMessage : MonoBehaviour
{
    void Start()
    {
        bool result = EditorUtility.DisplayDialog("제목", "메시지", "확인", "취소");

        if (result)
        {
            EditorUtility.DisplayDialog("클릭 결과", "확인 메시지가 클릭되었습니다.", "확인");
        }
        else
        {
            EditorUtility.DisplayDialog("클릭 결과", "취소 메시지가 클릭되었습니다.", "확인");
        }
    }
}

 

초기 메시지

 

Scriptable Object Instances


유니티에서 스크립터블 오브젝트를 통해 게임내의 필요한 것들을 관리할 수 있다.

위의 Scriptable_Skill은 아래와 같이 구성되어 있다.

 

using UnityEngine;

[CreateAssetMenu(fileName = "Scriptable_Skill", order = 1004)]
public class Scriptable_Skill : ScriptableObject
{
    public Skill skill;
    public Sprite sprite;
    public float hitPower;
    public float sensorDistance;
    public float sensorRadius;
}

CreateAssetMenu 를 해당 파일을 생성할 수 있게 만들 수 있다.

생성되는 파일명, 보여질 순서이다. (order를 생략하면 Folder 윗쪽으로 생기게 된다.)

프로젝트 뷰에서 마우스 오른쪽 클릭 후 스크립터블 오브젝트 생성이 가능하다.

 

충분히 편리하지만 이미지가 너무 작다는 것이 아쉽기에

인터넷 검색을 해보았고 결국 찾아냈다. 원하는 결과물은 다음과 같다.

 

Sprite = Source Image 와 같다.

 

새로운 스크립트를 작성해주어 Scriptable_Skill에 대한 에디터를 정의해주어야 된다. 최종적으로

2개의 스크립트를 작성해준다.

using UnityEngine;

[CreateAssetMenu(fileName = "Scriptable_Skill", order = 1004)]
public class Scriptable_Skill : ScriptableObject
{
    public Skill skill;
    public float hitPower;
    public float sensorDistance;
    public float sensorRadius;
    public Sprite sprite;
}
using UnityEngine;
using UnityEditor; //Editor 상속 받기위해 써줌

[CustomEditor(typeof(Scriptable_Skill))] //해당 타입에 대해 적용을 해준다. (반드시 써줘야됨)
public class Scriptable_SkillEditor : Editor //에디터를 상속 받는다. OnInspectorGUI 재정의 가능
{
    private Scriptable_Skill scriptable_Skill;
    private Sprite sprite;
    private GUILayoutOption[] options;

    private void OnEnable()
    {
        //GUI 옵션 설정. 크기를 위해 설정해줌
        options = new GUILayoutOption[] { GUILayout.Width(128), GUILayout.Height(128) };
        
        //Editor에선 serializedObject 를 통해 해당 스크립트에 접근이 가능하다.
        //serializedObject.target의 형 변환을 통해 해당 값에 접근이 가능해진다.
        scriptable_Skill = serializedObject.targetObject as Scriptable_Skill;
        
        //기존 sprite를 기본으로 해줌.
        sprite = scriptable_Skill.sprite;
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        EditorGUILayout.BeginHorizontal(); //줄 맞춤을 위해 설정
        
        GUILayout.Label("Source Image"); //라벨 설정. 이 후 값들이 오른쪽으로 정렬 된다.
        //EditorGUILayout.PrefixLabel("Source Image"); //라벨 설정. 왼쪽으로 정렬 된다.
        
        //EditorGUILayout.ObjectField 를 통해 이미지를 보이게 할 수 있다.
        //(Object, type, allowSceneObject (수정 가능 여부), options)
        EditorGUILayout.ObjectField(sprite, typeof(Sprite), false, options);
        
        EditorGUILayout.EndHorizontal();  //줄 마무리
    }
}

 

 

+ Recent posts