Unity & C#

CustomEditor 활용하기 - bool 값으로 variable 보여주기

왼손잡이개발자 2022. 4. 3. 16:16

 

직접 작성한 컴포넌트에 public이나 [SerializeField] 로 선언된 변수들이 사용되지 않는 경우들이 있습니다. 이럴 때 해당 변수들이 인스펙터에서 비어있는 것이 보기 싫을 때가 있죠. 이럴 때 toggle 버튼 역할을 하는 bool 값을 만들어서 해당 변수들이 쓰일 때는 인스펙터에서 보이고 쓰이지 않을 때는 보여주지 않는 기능을 한번 작성해보겠습니다.

 

 먼저 예시로 쓰일 클래스 MyScript를 작성해보겠습니다. MyScript에는 다양한 변수들이 있습니다  bool 형태의 myNumber, string 형태의 myName, AudioSource 컴포넌트의 audioSource, Rigidbody 컴포넌트인 rigid. 그리고 우선 [HideInInspector]를 attribute를 붙여서 인스펙터에서 보이지 않도록 해줍니다. 그리고 각 변수들의 존재를 확인하는 bool 값이 각각이 있습니다. (hasNumber, hasName, ...) 

public class MyScript : MonoBehaviour
{
	public bool hasNumber;
	[HideInInspector]
	public int myNumber;

	public bool hasName;

	[HideInInspector]
	public string myName;


	public bool hasAudioSource;
	[HideInInspector]
	public AudioSource audioSource;

	public bool hasRigidBody;
	[HideInInspector]
	public Rigidbody rigid;
}

 

그러면 MyScript를 컴포넌트로 사용하는 오브젝트 중에 위에 변수들을 다 사용하지 않고 몇개만 선택적으로 사용되는 경우들이 있습니다. 그럴 때는 쓰이지 않는 변수를 인스펙터에서 보고 싶지 않을 텐데요. 유니티의 CustomEitor 기능를 사용해서 인스펙터에서 bool 값을 체크해 사용되지 않는 변수는 보이지 않고, 사용되는 변수만 보이도록 해보겠습니다.

MyScript를 customize 할 Editor 클래스를 상속받는 MyScript_Editor 를 작성해보겠습니다.  

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

		MyScript script = target as MyScript;
		if(script.hasNumber)
		{
			script.myNumber = EditorGUILayout.IntField("myNumber", script.myNumber);
		}

		if(script.hasName)
		{
			script.myName = EditorGUILayout.TextField("Name", script.myName);
		}

		if(script.hasAudioSource)
		{
			script.audioSource = EditorGUILayout.ObjectField("AudioSource", script.audioSource, typeof(AudioSource), true) as AudioSource;
		}

		if(script.hasRigidBody)
		{
			script.rigid = EditorGUILayout.ObjectField("RigidBody", script.rigid, typeof(Rigidbody), true) as Rigidbody;
		}
	}
}

 

MyScript_Editor 클래스 앞에 [CustomEditor(typeof(MyScript))]을 붙여주어서 MyScript 클래스를 CustomEditor 기능을 사용하겠다고 명시해줍니다. 그리고 Editor 클래스를 상속받아줍니다. Editor 클래스를 상속받음으로 OnInspectorGUI() 를 override 함수로 사용할 수 있게 되었습니다. 위와 같이 작성후에 MySciprt를 게임 씬의 아무 오브젝트의 컴포넌트로 추가를 하게 되면 아래 사진과 같은 모습을 인스펙터에서 확인할 수 있습니다. 

 

 

MyScript에서 선언한 bool 값 4개를 볼 수 있고요, 각 bool 값들을 true로 체크하게 되면 아래에 [HideInInspector]로 숨겨 놓았던 variables 들을 각각 볼 수 있습니다.