본문 바로가기

게임개발

유니티 인스펙터 에디터를 내 맘대로 갖고놀아보자

일단 유니티 에디터는 MonoBehaviour을 기본으로 작동한다

근데, 이 모노비해비어를 집어넣으면 그 아래쪽에 

이렇게 된다

 

위 처럼 간단한 것들은 [Range(a,b)]같은 애트리뷰트를 집어넣는것 만으로 해결이 되지만

버튼 하나 집어넣는것만 해도 애트리뷰트로는 해결이 안되기 시작한다

따라서 우리는 에디터 스크립트를 써야한다

 

Editor

요놈이 뭐하는 놈인가 싶을텐데, 역할을 요약하면

"Editor에서 모노비헤비어 인스펙터를 어떻게 보여줄지 처리 해줌"

정도로 생각하면 된다

 

이 코드를 특수 폴더 Script를 만들어 집어넣게 되면,

[CustomEditor(typeof(Platform))] 애트리뷰트로 인해

Platform이라는 타입의 인스펙터를 PlatformEditor의 Editor가 된다

쉽게말해 모노비헤비어 Platform의 에디터를 뺏어와서 대신 처리한다는 거다

이 코드에서는 OnInspectorGUI를 오버라이딩 했기 때문에 인스펙터에 띄우는 기능을 대신하게 되는 것이다

 

즉, 스크립트의 인스펙터를 어떻게 띄울지를 내가 가로채서 처리할수 있음 

위 코드대로 하면 위처럼 아무것도 안나오게 된다. 왜냐하면 내가 만든 Platform의 에디터는 인스펙터에서 아무것도 띄우지 말라고 하고있기 때문이다.

(오버라이딩한 OnInspectorGUI는 텅텅 비어있다. 이게 그뜻이다.)

 

그럼 이제 여기다가 몇가지 원하는 필드들을 추가해보자.

 

 

열거형이랑 수를 추가해봤다

Int, Double같은것도 IntField DoubleField로 대신하면 똑같이 가능하다

 

요컨대 입력해서 넣을곳= EditorGUILayout.타입에맞는메소드("이름",보여줄것);

이런식으로 하면 되는 것이다

 

사실 여기까지만 보면 "어차피 애트리뷰트로 되는데 왜 이렇게 함" 싶을텐데

문제는 버튼 생성은 단순 애트리뷰트로 안되기 때문이다

이유는 나도 모른다... 그냥 [Button(Method)] 이럼 안됐을까?

 

하여간 하는 방식은

이렇게 if 안에다가 버튼을 누르면 실행하고 싶은 메서드를 집어넣으면 된다.

 

Q. 센세 제가 실행하고 싶은건 모노비헤비어에 있는데 어떡해요?

이 역시 방법이 있는데, 

에디터의 멤버인 target을 모노비헤비어의 타입으로 캐스팅(여기선 Platform)한 후 원하는 함수를 호출하면 된다

그럼 내가 만든 모노비헤비어쪽의 메서드를 실행할 수 있다.

 

이제 이걸 응용하면 타입에 따라 인스펙터가 달라지게끔 설계할 수도 있는데

요런식으로 해보자

간단한 코드다.

타입이 A냐 B냐를 갖고 실행을 달리 해줄 뿐이다

A면 버튼을 만들고,

B면 float 필드를 하나 만든다

그러면 짜잔

이렇게 열거형 값에 따라 인스펙터가 달라지는걸 볼 수 있다

 

모두 이렇게 편리한 인스펙터를 만들어주어 기획에게 사랑받는 프로그래머가 되도록 하자