본문 바로가기
개발/Unity

유니티 - 에디터 윈도우에서 블럭의 위치 Mapping 하기 (EditorWindow)

by 피로물든딸기 2022. 6. 20.
반응형

Unity 전체 링크

 

2차원 배열 디버깅

 

(1) 2차원 배열 인스펙터에 보여주기 (2D Array in the Inspector)
(2) 커스텀 에디터로 인스펙터 수정하기 (Inspector with Custom Editors)
(3) 에디터 윈도우에서 실시간으로 2차원 배열 디버깅하기 (EditorWindow)
(4) 에디터 윈도우에서 블럭의 위치 Mapping 하기 (EditorWindow)


에디터 윈도우를 이용해서 큐브에 저장된 2차원 배열을 직접 디버깅하였다.

여기에서는 큐브의 위치를 새로운 창에서 볼 수 있도록 해보자.

이렇게 만들면 게임에서 존재하지만 보이지 않는 큐브와 같은 오브젝트를 눈으로 볼 수 있다.

 

아래와 같이 큐브의 위치가 My Window Editor 창에 mapping 되도록 해보자.


블럭을 컨트롤하는 스크립트를 만들자.

여기서는 Show2DArray와 mapping하는 것이 목적이므로 단순하게 하드코딩으로 만든다.

 

BlockContoller.cs는 아래와 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BlockController : MonoBehaviour
{
    public int[,] mapInfo = new int[5, 5];
    bool[,] check = new bool[5, 5];
    public GameObject[] block;

    void Update()
    {
        System.Array.Clear(check, 0, 5 * 5);

        for (int i = 0; i < block.Length; i++)
        {
            int x, y;
            GameObject b = block[i];

            x = (int)b.transform.position.x;
            y = (int)b.transform.position.y;

            check[x, y] = true;
        }

        for (int r = 0; r < 5; r++)
            for (int c = 0; c < 5; c++)
                mapInfo[r, c] = check[r, c] ? 1 : 0;
    }
}

위 스크립트는 public으로 선언된 block의 위치의 정수 부분을 Update에서 mapInfo에 저장한다.

2차원 배열을 커스텀 창에서 보기 위한 과정이기 때문에 Scene에서 블럭을 직접 움직인다.

 

스크립트를 만들었으면 빈 오브젝트(GameManager)를 만든 후, 큐브를 3개 추가한다.

 

Show2DArray.cs는 아래와 같이 수정한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class Show2DArray : EditorWindow
{
    public Color blockColor = new Color(.0f, .0f, .0f, 1.0f);
    Object blockManager;
    int[,] debug2d;

    [MenuItem("Tools/2D Array Console")]
    static void init()
    {
        Debug.Log("init");

        EditorWindow wnd = GetWindow<Show2DArray>();
        wnd.titleContent = new GUIContent("My Window Editor");
    }

    void OnInspectorUpdate()
    {
        Repaint();
    }

    void OnGUI()
    {
        GUILayout.BeginHorizontal();
        blockColor = EditorGUILayout.ColorField("Block Color", blockColor);
        GUILayout.EndHorizontal();
        GUILayout.BeginHorizontal();
        blockManager = EditorGUILayout.ObjectField(blockManager, typeof(Object), true);
        GUILayout.EndHorizontal();

        if (blockManager == null) return;

        GameObject go = (GameObject)blockManager;
        BlockController bc = go.GetComponent<BlockController>();

        debug2d = new int[3, 3];
        debug2d = bc.mapInfo.Clone() as int[,];

        for (int k = 4; k >= 0; k--)
        {
            GUILayout.BeginHorizontal();

            for (int i = 0; i < 5; i++)
            {
                if (debug2d[i, k] == 1) GUI.color = blockColor;
                else GUI.color = Color.black;

                GUILayout.Box(GUIContent.none, GUILayout.ExpandWidth(true), GUILayout.MinHeight(50));
            }

            GUILayout.EndHorizontal();
        }
    }
}

 

대부분 이전의 에디터 윈도우와 동일하다.

여기서는 블럭의 위치에 해당하는 색깔을 바꿀 수 있게 Color Picker를 창에 추가하였다. 

그리고 blockManager를 받을 수 있도록 수정하였다.

    GUILayout.BeginHorizontal();
    blockColor = EditorGUILayout.ColorField("Block Color", blockColor);
    GUILayout.EndHorizontal();
    GUILayout.BeginHorizontal();
    blockManager = EditorGUILayout.ObjectField(blockManager, typeof(Object), true);
    GUILayout.EndHorizontal();

 

이후 BlockController의 mapInfo를 copy한 후 Box를 이용해 에디터 창을 그린다.

Box에 [GUILayout.여러 설정]을 추가하였다.

mapInfo가 1인 곳이 블럭이 존재하는 곳이므로 해당 위치를 blockColor로 변경하였다.

그렇지 않은 곳은 Color.black으로 설정한다.

    if (blockManager == null) return;

    GameObject go = (GameObject)blockManager;
    BlockController bc = go.GetComponent<BlockController>();

    debug2d = new int[3, 3];
    debug2d = bc.map.Clone() as int[,];

    for (int k = 4; k >= 0; k--)
    {
        GUILayout.BeginHorizontal();

        for (int i = 0; i < 5; i++)
        {
            if (debug2d[i, k] == 1) GUI.color = blockColor;
            else GUI.color = Color.black;

            GUILayout.Box(GUIContent.none, GUILayout.ExpandWidth(true), GUILayout.MinHeight(50));
        }

        GUILayout.EndHorizontal();
    }

 

2차원 배열과 유니티 좌표의 위치가 다르기 때문에 이중 for문의 k, i 값의 시작점을 맞춰줘야 한다.

    for (int k = 4; k >= 0; k--)
    ...
        for (int i = 0; i < 5; i++) 
        ...

블럭의 (x, y) 좌표

이제 게임을 실행해서 My Window Editor를 확인해보자.

블럭의 위치를 직접 만든 에디터 창에서 볼 수 있다.


(1) 2차원 배열 인스펙터에 보여주기 (2D Array in the Inspector)
(2) 커스텀 에디터로 인스펙터 수정하기 (Inspector with Custom Editors)
(3) 에디터 윈도우에서 실시간으로 2차원 배열 디버깅하기 (EditorWindow)
(4) 에디터 윈도우에서 블럭의 위치 Mapping 하기 (EditorWindow)

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글