본문 바로가기
스파르타 내배캠

스파르타 내배캠 Unity 3기 28일차

by LemongO 2024. 1. 31.

정신 나갈거 같애!!

정신 나갈거 같애!!

점심 나가서 먹을거 같애!!

 

 

 

어제 오늘은... 너무 힘들었다...

결국 TIL도 하루 밀렸네 ㅠㅠ

 

 


유니티 인스펙터 커스텀 버튼 (Unity Inspector Custom Button)

 

사실 정확한 명칭은 모르겠다.

 

특강 중에도 잠깐 보았고, 팀 과제 다른 조의 발표를 보던 중 잠깐 스쳐 지나갔는데
그게 너무 편해보여서 바로 검색에 들어갔다.

 

 

결과부터 보면 인스펙터 창에 커스텀 버튼이 생겨난다.

 

버튼 이름도 커스텀 가능

해당 기능을 사용하기 위해선 다음과 같은 작업이 요구된다.

 

  • 커스텀 버튼을 만들기 위한 using UnityEditor
  • Editor 를 상속받은 C# 스크립트
  • 버튼을 만들 C# 스크립트는 반드시 프로젝트 뷰 Editor 폴더 안에 있을 것

 

먼저 버튼이 만들어질 C# 스크립트를 만든 뒤

기능은 다음과 같이 해줬다.

using UnityEngine;

public class CustomizableCube : MonoBehaviour
{
    [Header("Obj")]
    [SerializeField] GameObject cube;

    [Header("Spawn")]    
    [Range(0, 10)][SerializeField] int spawnCount;
    [Range(0, 10)][SerializeField] float randomSpawnDist;

    [Header("Move")]
    [SerializeField] Vector3 moveDist;
    
    public List<GameObject> cubeList = new List<GameObject>();    

    public void GenerateCube()
    {
        // 가상의 단위 구 * 거리 범위안의 랜덤한 위치 randomPos
        Vector3 randomPos = Random.insideUnitSphere * randomSpawnDist;

        GameObject go = Instantiate(cube);
        go.transform.position = transform.position + randomPos;
        
        cubeList.Add(go);
    }
    
    public void RemoveCube()
    {
        foreach(GameObject go in cubeList)
            Destroy(go);
    }

    public void MoveCube()
    {
        transform.position += moveDist;
    }
}

 

cube 오브젝트를 생성 후 현재 컴포넌트가 있는
오브젝트의 위치 + (가상의 단위 구 * 거리) 범위안 랜덤한 위치로 이동시킬

GenerateCube 함수.

 

생성된 모든 cube를 삭제시킬

RemoveCube 함수

 

현재 컴포넌트가 있는 오브젝트의 위치를 변경시키는

MoveCube 함수.

 

다음은 버튼GUI를 작성할 스크립트를 만들자.

코드는 다음과 같다.

using UnityEditor;
using UnityEngine;

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

        CustomizableCube cube = (CustomizableCube)target;

        if (GUILayout.Button("Generate Cube"))
        {
            cube.GenerateCube();
        }

        if (GUILayout.Button("Remove Cube"))
        {
            cube.RemoveCube();
        }
        
        if (GUILayout.Button("Move Cube"))
        {
            cube.GenerateCube();
        }
    }
}

코드를 위 부터 차례로 보도록 하자.

 

부모 클래스 Editor 를 사용하기 위한

using UnityEditor

 

커스텀 에디터 기능을 사용하기 위한 상속public class 클래스이름 : Editor

 

버튼을 만들 클래스를 찾는 [CustomEditor(typeof(클래스이름))]

 

GUI를 만들기 위한 함수 public override void OnInspectorGUI

 

클래스의 내부 함수를 사용하기 위한 ClassType 변수명 = (ClassType)target;

 

실제 GUI 생성 if (GUILayout.Button("버튼이름"))

 

 

 

위와같은 코드를 작성 후 프로젝트 뷰 Editor 폴더에 이 스크립트를 넣어주자.

 

 

 

이렇게 하면 첫 사진과 같이 인스펙터에 커스텀 버튼이 생겨난다.

한 번 만든 기능을 시험 해보도록 하자.

 

 

 

 

 

 

오오...

 

이건 잘 사용하면 개발할 때 굉장히 편할 거 같다.