Game Programming/Game Engine

Unity3D :: Editor Customize (유니티 에디터 커스터마이즈)

VallistA2015.03.26 10:54

Unity 엔진이 시장에서 독보적인 위치에 올라감에 따라서 유니티의 에셋스토어의 많은 기능을 가진 에셋들이 올라오기 시작했다.

우리가 구매하거나 여러가지 기능을 가진 에셋을 음지의 경로(..) 로 다운받아서 자신의 유니티 프로젝트에 Import를 시키면 몇몇의 에셋들은 유니티의 메뉴바에 기능을 여러개 달아놓은 새로운 바를 볼 수 있을 것이다.



<사진 1: 대표적인 NGUI의 예>


이러한 툴들은 유니티 프로젝트를 더욱더 풍요롭게 하며, 도움이 되는 기능을 제공한다.

그럼, 에셋들은 과연 이런 에디터에 추가하는 기능을 어떻게 만들지 생각을 해봤는가?

필자는 회사에서 회사에서 쓰는 라이브러리, 만들어둔 자원들을 한번에 관리 할 수 있는 에디터의 메뉴바를 만들어야해서 그 기능을 상세하게는 아니지만 삽질을 해보았다.


1. 먼저 Unity의 Bar 기능을 구현하기에 앞서 UI쪽을 알아보도록하자.


먼저 자신이 원하는 폴더를 만들고 그 안에 Editor라는 폴더를 만든다.

그리고 그 하위에 스크립트를 만들고 스크립트 안에 이렇게 설정을 한다.



여기서 중요한 사항은 using UnityEditor를 해주어야 한다.


이렇게 만들게 되면 아래와 같은 메뉴가 추가된다.


<사진 2: 위의 소스코드로 추가한 Test 메뉴와 하단 TestCode 버튼>


한번 버튼을 눌러보자. 버튼을 누르면 아래와 같은 화면이 나올 것이다.


<사진 3: Test Code 버튼을 누를시 나오는 콘솔로그>


기존에 Unity에서 게임쪽에서 소스를 만들때 에디터에 수치를 보이게 적용되게 만드는 수단은 아래와 같았다.



MonoBehaviour를 상속받은 클래스안에 public 메서드를 추가해주므로써 해당스크립트를 추가한 에디터의 inspector에서 보게끔 지원을 하였다. 하지만 우리는 아래와 같다.



위와같은 소스코드는 MonoBehaviour 클래스를 상속받지 않고 Editor를 상속받는다.

Editor를 상속받는순간부터 이 소스코드는 Editor의 안으로 들어가게 되며 Hierarchy의 다른 오브젝트에 이 소스코드를 넣어두지 않아도 소스코드를 에디터에서 인식하게 되며 내부 메서드를 통해 메뉴등 여러가지를 추가 할 수 있는 기능을 접할 수 있게 된다.


그리고, MonoBehaviour를 사용하지 못한다고 해서 우리가 GameObject등 에디터의 Hierarchy 단의 오브젝트를 컨트롤 불가능 한게 아니다. 우리는 using UnityEngine; 메서드를 통해서 유니티 엔진에서 쓰던 기능을 그대로 사용할 수 있다.


다만, Editor에서는 Invoke나 Coroutine은 전혀 쓰지 못한다.
그리고 우리가 Editor에 추가해줄 기능은 static이 붙은 정적 함수여야 한다.



위의 소스에서는 [MenuItem("Test/TestCode")] 를 통해서 옵션을 컨트롤 하게끔 설정을 해주었다.

MenuItem은 말그대로 유니티 상단의 메뉴바를 말하는 것이며, 그 내부에 인자를 몇 개씩 등록 할 수 있다.

물론 인자에 따라서 옵션이 틀려지며 내부의 string에 따라서 오브젝트를 컨트롤 할 수 있는것도 달라진다.


동일하지만 다른 옵션을 가진 함수를 3개 만들어 놓았다.

첫번째는 가장 기본적인 옵션인데, 첫번째 인자는 이름을 나타낸다.

즉 "Test/TestCode" 라고 적으면 Test 타이틀 메뉴의 TestCode 버튼이 만들어진다.

혹 Test 카테고리 안에 여러개 오브젝트를 만들고 싶다면 다른 기능은 없고 만들때

"Test/sadfasdf" 등 앞의 상단 오브젝트명만 통일해주면 된다.


두번째 옵션은 validate 기능이다.

validate기능이 의미하는 것은 오브젝트가 해당 상태에 동의하지 않으면 회색으로 단색처리가 되고 클릭이 불가능한 오브젝트로 된다.


validate 기능을 사용하는 방법에 대해 소개하겠다.



해당 소스는 Hierarchy에 "GameObject" 라는 오브젝트가 존재하지 않으면 일반적으로 나오게 되고, 존재하면 회색으로 단색처리가 되어 클릭이 불가능한 오브젝트가 된다.


<사진 4: Validate 버튼을 클릭 못할때 (GameObject가 Hierarchy에 존재>


<사진 5: Validate 버튼을 클릭 할 수 있을때 (GameObject가 Hierarchy에 존재하지 않음>



세번째 옵션은 priority 기능이다.

priority 기능은 칸을 나누는 기능인데, priority 기능이 11, 21, 31 등 각 숫자의 1이 될 때마다 칸이 나눠지게 된다.

그리고 이 기능을 통해서 윗 우선순위를 만들 수 있다.


이 기능을 사용하지 않은 오브젝트는 그냥 칸 없이 만들어지게 된다.


<사진 6: priority 기능을 사용한 칸 나누기 기능>


소스는 아래와 같다.



자 그럼 여기서 Test 메뉴 안의 Validate 안에 오브젝트를 넣는 것을 해보도록 하자.


<사진 7: 칸을 여러개 생성해서 사용한 예제>


소스는 아래와 같다.




댓글

댓글쓰기 폼

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.

자고 싶습니다. ㅠㅠ

페이스북    :: 링크
카카오톡    :: kingbye1
Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today : 17

Total : 247,588

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘