게임 개발/Unity

[유니티 C#] 에디터 OnInspectorGUI()후 저장

Heesuk Lee 2020. 11. 21. 21:37

프로그래머가 아닌 팀원과 협업하기위해 에디터 제너레이터를 만들면서 겪었던 문제를 해결하면서 블로그에 남깁니다.

 

 

 

게임에 등장하는 맵을 꾸미기위한 에디터 제너레이터를 구현했습니다.

아래와같이 인스펙터에 Enum배열을 조절하고 Generate Image 버튼을 누르면 해당 Enum에 맞는 이미지로 맵이 꾸며지는 클래스입니다.

 

1번 이미지

 

2번 이미지

 

 

// 인스펙터에서 맵을 꾸밀 수 있도록 구현

// 인스펙터에서 제어하기위한 enum
public enum TILE
{
    FLOOR_01,
    FLOOR_02,
}

// 9개의 블럭이미지를 가지고있는 MapBlock 클래스입니다.
public class MapBlock : MonoBehaviour
{
    [SerializeField]
    private SpriteRenderer[] spriteRenderers = { };
    [SerializeField]
    private Sprite[] sprites = { };

    // 인스펙터에서 수정 가능
    [SerializeField]
    private TILE[] tileTypes = { };

	// 해당함수는 인스펙터에서 버튼을 누르면 호출되는 함수입니다.
    public void GenerateImage()
    {
    	// 9개의 SpriteRenderer를 방문하며 이미지를 초기화해줍니다.
        for (int i = 0; i < this.spriteRenderers.Length; i++)
        {
            this.spriteRenderers[i].sprite = this.sprites[(int)this.tileTypes[i]];
        }
    }
}

 

에디터클래스는 project창에 Editor라는이름의 폴더안에 존재해야 적용됩니다.

MapGenerator.cs

// 유니티에디터 네임스페이스를 사용해야합니다.
using UnityEditor;


[CustomEditor(typeof(MapBlock))]
public class MapGenerater : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        // 블럭 초기화
        MapBlock block = (MapBlock)target;
        if (GUILayout.Button("Generate Image"))
        {
            block.GenerateImage();
        }


	// ****** 프리팹안에서 변경후 나갔다오면 변경되지 않았던 문제가 해결 ******
        // 프리팹 gui가 변경됨을 표시
        if (GUI.changed) EditorUtility.SetDirty(target);
        
    }
}

 

제너레이터 구현자체는 문제가 없었으나 프리팹으로 관리를할때 제너레이터를 사용해서 변경한 후에도

변경된 프리팹이 저장이 안되는 것이 문제였습니다.

 

하지만 위에 코드처럼 모든 변경설정후 마지막에 EditorUtility.SetDirty(target)을 호출하여 target 즉 프리팹이

변경되었음을(더러워졌음을?) 알려주면 프리팹이 변경되었다고 표시가 됩니다.

 

이로써 일일이 수정작업할 필요없이 당연한거지만 원버튼으로 변경이 가능하게 되었습니다!

 

 

반응형