인스펙터 커스텀 버튼 만들기


작성 기준 버전 :: 2018.3.2f1


유니티 엔진에서 게임을 제작할 때, 모든 작업을 일일이 수작업으로 진행하면 개발 시간이 길어진다. 특히 같은 오브젝트를 여러 개 생성하고 각각 다른 수치를 입력하는 반복적인 세팅 작업의 경우에는 꽤나 큰 시간 낭비를 초래한다.


여러 개의 오브젝트를 생성하는데, 그 오브젝트들에 입력되어야 하는 설정이 일정한 규칙을 가지고 있거나, 설정될 값들에 대한 테이블을 미리 가지고 있다면, 오브젝트를 일일이 생성하고 설정 값을 입력하는 것보다, 버튼을 누르면 자동으로 모든 오브젝트들을 생성하고 일정한 규칙에 따라서 설정 값을 세팅하거나 테이블에서 설정 값을 가져와서 세팅하도록 만드는 것이 많은 시간을 절약할 수 있다.


이런 커스텀 버튼을 만드는 데도 작업 시간이 소모되겠지만, 일일이 오브젝트를 생성하고 값을 세팅하는 작업 시간이 누적되면 커스텀 버튼을 만드는 데 드는 누적 시간을 빠르게 추월할 것이다. 그리고 이런 종류의 버튼은 만들어두면 다른 프로젝트에서도 충분히 재활용할 수 있기 때문에 인스펙터 커스텀 버튼을 만드는데 시간을 투자할 가치가 있다.



예제


이번 예제에서는 한 오브젝트를 기준으로 그 오브젝트의 forward 방향으로 distance 거리마다 cubeCount 개의 큐브 오브젝트를 배치하는 인스펙터 커스텀 버튼을 만드는 작업을 해볼 것이다.



위의 작업은 수작업으로 진행할 경우, cubeCount 횟수만큼 반복 작업을 해야하며, 나중에 중심 오브젝트를 추가로 배치할 계획이면 다시 그 추가배치 횟수 * cubeCount 만큼 작업 횟수가 폭발적으로 증가한다.


이런 큐브 생성 작업을 버튼 클릭 한 번에 자동으로 처리해주는 인스펙터 커스텀 버튼을 만들어 보자.


우선 CubeGenerator 클래스를 생성하고 다음과 같은 코드를 작성한다.


public class CubeGenerator : MonoBehaviour
{
    [SerializeField]
    private GameObject cubePrefab;
    [SerializeField]
    private float distance;
    [SerializeField]
    private int cubeCount;

    public void GenerateCubes()
    {

        if (transform.childCount != 0)
        {
            for (int i = transform.childCount - 1; i >= 0; i--)
            {
                DestroyImmediate(transform.GetChild(i).gameObject);
            }
        }


        for (int i = 0; i < cubeCount; i++)
        {
            var newCube = Instantiate(cubePrefab);
            newCube.transform.SetParent(gameObject.transform);
            newCube.transform.localPosition = new Vector3(0f, 0f, i * distance);
            newCube.transform.localRotation = Quaternion.identity;
        }
    }
}


코드를 모두 작성한 뒤에는 CubeGenerator 클래스를 CubeStandard 오브젝트에 컴포넌트로 추가하고 큐브 오브젝트를 프리팹화하여 Cube Prefab 프로퍼티에 추가해준다.



이 다음에는 커스텀 버튼을 추가하기 위해 CubeGenerteButton 클래스를 새로 추가한다. 인스펙터 창에 커스텀 버튼을 추가하는 기능은 유니티 에디터를 수정하는 것이기 때문에 UnityEditor 네임스페이스에 들어가는 기능을 사용해야한다. UnityEditor 네임스페이스의 기능을 사용하는 클래스는 반드시 Editor 폴더 아래에 들어가야 되기 때문에 Editor 폴더를 만들어서 그 안에 넣어준다.


 

그리고 아래와 같이 CubeGenerateButton의 코드를 작성한다.


using UnityEngine;
using UnityEditor;

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

        CubeGenerator generator = (CubeGenerator)target;
        if (GUILayout.Button("Generate Cubes"))
        {
            generator.GenerateCubes();
        }
    }
}


코드를 저장하고 에디터로 돌아가면 CubeGenerator 컴포넌트 하단에 "Generate Cubes" 버튼이 생겨난 것을 확인할 수 있다.


 

distanse와 cubeCount 값을 수정하고 Generate Cubes 버튼을 누르면 설정된 값에 맞춰서 큐브가 생겨나는 것을 확인할 수 있다.



반응형

+ Recent posts