Map tool 구현3

ㅋㅋ·2022년 9월 15일
0

Custom Grid Palette class

[CreateAssetMenu(menuName = "CustomGrid/Create Palette")]
public class CustomGridPalette : ScriptableObject
{
    public List<CustomGridPaletteItem> Items;

    public CustomGridPaletteItem GetItem(int id)
    {
        return Items.Find(t => t.id == id);
    }
}

에디터에서 마우스 오른쪽 클릭으로 생성할 수 있는 커스텀 메뉴를 생성하는 클래스

팔레트는 또한 맵을 그릴 때 사용할 아이템들을 들고 있는 리스트를 멤버 변수로 갖도록 함


Custom Grid Palette Item class

[Serializable]
public class CustomGridPaletteItem
{
    public int id;
    public string name;
    public GameObject targetObject;
}

위에서 만들어낸 팔레트들이 가지고 있는 데이터들을 정의


Custom Grid Palette Drawer class

public void Draw(Vector2 winSize)
{
    ...

    scrollPos = EditorHelper.DrawGridItems(scrollPos, 10, TargetPalette.Items.Count, winSize.x, slotSize, (index) =>
    {
        bool selected = CustomGridPaletteItemDrawer.Draw(slotSize, (selectedIndex == index), TargetPalette.Items[index]);

        if (selected)
        {
            selectedIndex = index;
        }
    });
}

에디터 창에 팔레트들을 그리는 클래스

팔레트에서 아이템들을 가지고 와서 그리고, 창을 통하여 선택된 인덱스를 관리하는 역할


Custom Grid Palette Item Drawer class

public static bool Draw(Vector2 slotSize, bool isSelected, CustomGridPaletteItem item)
{
    var area = GUILayoutUtility.GetRect(slotSize.x, slotSize.y, GUIStyle.none, GUILayout.MaxWidth(slotSize.x), GUILayout.MaxHeight(slotSize.y));

    bool selected = GUI.Button(area, AssetPreview.GetAssetPreview(item.targetObject));
    GUI.Label(new Rect(area.center.x, area.center.y, 100, 50), item.name);

    ...

    return selected;
}

팔레트에 등록된 아이템들을 그리는 클래스

GetRect를 통해 파라미터를 가지고 Layout으로 그려질 Rect를 가져올 수 있음

그리고 가져온 Rect를 버튼들로 만들어 선택할 수 있도록 구현


Tool window class

void DrawCreateMode()
{
    using (var scope = new GUILayout.VerticalScope(GUI.skin.window))
    {
        ...

        targetPalette = (CustomGridPalette)EditorGUILayout.ObjectField("palette to connect", targetPalette, typeof(CustomGridPalette));
        paletteDrawer.TargetPalette = targetPalette;
    }

    ...
}

DrawCreateMode 함수에서 팔레트를 입력 받는 필드를 생성하고,

입력받을 시 해당 팔레트를 멤버 변수에 저장하도록 한다.


void DrawEditMode()
{
    ...

    var lastRect = GUILayoutUtility.GetLastRect();
    var area = new Rect(0, lastRect.yMax, position.width, position.height - lastRect.yMax - 1);

    GUI.Box(area, GUIContent.none, GUI.skin.window);

    paletteDrawer.Draw(new Vector2(position.width, position.height));
}

DrawEditMode 함수에서 마지막 영역의 크기를 계산하여,

해당 크기를 가지는 박스를 만들고, 박스에 아이템들을 그려 넣는다.

0개의 댓글