Extending the Editor

Introduction

사용자는 Editor Windows를 통해서 Unity안에서 사용자 자신의 맞춤 디자인 도구를 생성할 수 있습니다. EditorWindow 대신 MonoBehaviour로 부터 파생된 스크립트는 GUI/GUILayoutEditorGUI/EditorGUI/EditorGUILayout 컨트롤 둘 다 모두를 이용할 수 있습니다. 대체적으로 사용자는 GameObject 인스펙터에 GUI 컨트롤을 노출시키기 위해서 사용자 정의 인스펙터를 사용할 수 있습니다.

Editor Windows

사용자는 사용자의 응용 프로그램에서 사용자 정의 윈도우를 몇 개라도 생성할 수 있습니다. 이것들은 인스펙터, 씬 또는 다른 내장된 것들처럼 행동합니다. 이것은 사용자의 게임을 위해서 하위 시스템에 사용자 인터페이스를 추가하기 위한 좋은 방법입니다.


컷 씬 액션을 위해 사용되는 Serious Games Interactive에 의한 Custom Editor Interface

사용자 정의 Editor Window를 만드는 것은 다음의 간단한 과정을 포함합니다:

  • EdiotorWindow로 부터 파생되는 스크립트를 생성합니다.
  • 그 자체를 나타내기 위해 윈도우를 실행하는 코드를 사용합니다.
  • 사용자 도구를 위한 GUI 코드를 구현합니다.

Derive From EditorWindow

사용자 Editor Window를 만들기 위해서 사용자의 스크립트는 "Editor"라고 불려지는 하나의 폴더에 저장되어야 합니다. EditorWindow로 부터 파생하는 스크립트안에 클래스를 만듭니다. 그 후에 내부의 OnGUI 함수에 사용자의 GUI 컨트롤을 씁니다.

class MyWindow extends EditorWindow {
    function OnGUI () {
        // The actual window code goes here
    }
}

MyWindow.js - 사용자의 프로젝트 안에 'Editor'라 불리는 폴더안에 놓여집니다 ====Showing the window==== 씬위에 위도우를 보여주기 위해서 그것을 보여주는 메뉴 아이템을 만듭니다. 이것은 MenuItem 속성에 의해 활성화되는 하나의 함수를 생성하는 것에 의해 행해집니다. Unity에서 기본적인 행동은 윈도우를 재사용하는 것입니다 (그래서 다시 메뉴 아이템을 선택하는 것은 존재하고 있는 윈도우를 보여줄 것입니다). 이것은 아래처럼 EditorWindow.GetWindow 함수를 사용하는 것에 의해 행해집니다: <file csharp> class MyWindow extends EditorWindow { @MenuItem ("Window/My Window") static function ShowWindow () { EditorWindow.GetWindow (MyWindow); } function OnGUI () { The actual window code goes here } } </file> MyWindow를 보여줍니다 이것은 호출 사이의 위치를 저장하고 사용자 정의 레이아웃에서 사용될 수 있는 기본적인 도킹 위도우를 생성할 것입니다. 생성된 것보다 더 많은 컨트롤을 원한다면 사용자는 GetWindowWithRect를 사용할 수 있습니다. ====Implementing Your Window's GUI==== 윈도우의 실제 내용은 OnGUI 함수를 구현하는 것에 의해 표현되어 집니다. 사용자는 사용자의 게임 GUI (GUIGUILayout)을 위해 사용하는 UnityGUI 클래스를 사용할 수 있습니다. 게다가EditorGUIEditorGUILayout같은 편집만 되는 클래스들이 위치한 추가적인 GUI 컨트롤들도 제공합니다. 이러한 클래스들은 보통의 클래스에서 이미 사용가능한 컨트롤에 추가되어서 사용자가 섞어서 사용할 수 있습니다. 더 많은 정보를 위해서EditorWindow page에 있는 예들과 문서들을 살펴보시기 바랍니다. =====Custom Inspectors===== 게임 생성의 스피드를 상승하기 위한 키는 공통적으로 사용되는 컴포넌트들을 위해 사용자 정의 인스펙터를 생성하는 것입니다. 예를 들어, 우리는 하나의 지점에서 보이는 오브젝트를 항상 유지하기 위한 매우 간단한 스크립트를 사용할 것입니다. <file csharp> var lookAtPoint = Vector3.zero; function Update () { transform.LookAt (lookAtPoint); } </file>LookAtPoint.js 이것은 세계 공간 포인트로 향하는 오브젝트를 유지할 것입니다. 이것을 멋지게 만들어 보겠습니다! 편집기에서 그것이 훌륭하게 작동하게 만들기위한 첫 번째 단계는 심지어 사용자가 게임을 테스트하고 있지 않을 때에도 그 스크립트를 실행하게 만드는 것입니다. 우리는 이것을ExecuteInEditMode 속성을 그것에 추가하는 것을 통해 수행합니다: <file csharp> @script ExecuteInEditMode() var lookAtPoint = Vector3.zero; function Update () { transform.LookAt (lookAtPoint); } </file> 사용자의 주요 카메라에 스크립트를 추가하시고 씬 뷰에서 그것을 드래그 하시기 바랍니다. ====Making a Custom Editor==== 이것은 모두 좋습니다만 우리는 인스펙터를 사용자에 맞게 정의함으로써 훨씬 더 훌륭하게 만들 수 있습니다. 그것을 위해 우리는 그것을 위한 편집기를 만들 필요가 있습니다. Editor라 불리는 폴더에LookAtPointEditor라고 불리는 JavaScript를 생성하십시오. <file csharp> @CustomEditor (LookAtPoint) class LookAtPointEditor extends Editor { function OnInspectorGUI () { target.lookAtPoint = EditorGUILayout.Vector3Field ("Look At Point", target.lookAtPoint); if (GUI.changed) EditorUtility.SetDirty (target); } } </file> 이 클래스는 Editor로 부터 파생되어야 합니다. @CustomEditor 속성은 Unity에게 그것이 어떤 컴포넌트를 위한 편집기로 행해져야만 하는 지를 알려줍니다. OnInspectorGUI있는 코드는 Unity가 인스펙터를 보여줄 때마다 실행됩니다. 사용자는 여기에 어떠한 GUI 코드도 놓을 수 있습니다 – 그것은OnGUI이 게임을 위해 하는 것처럼 작동하나 인스펙터 내부에서 실행됩니다. Editor는 사용자가 검색되어져야 하는 오브젝트에 접근하기 위해 사용할 수 있는 타겟 속성을 정의합니다. EditorUtility.SetDirty 코드는 사용자가GUI.changed를 체크하는 것에 의해 값들의 어떠한 것이라도 변화시킨다면 실행됩니다. 이 경우에 우리는Vector3 필드 중 하나를 Transform Inspector에서 사용되는 것처럼 만듭니다:
빛나는 인스펙터를 위한 Yay
여기서 행해질 수 있는 것보다 훨씬 더 많은 것들이 있으나 이것은 지금 할 수 있을 것입니다… ====Scene View Additions==== 사용자는 자신의 사용자 정의 편집기에OnSceneGUI를 구현함으로써 씬 뷰로 여분의 코드를 추가할 수 있습니다. 이 경우에 우리는 위치 핸들러의 두 번째 집합을 사용자가 그 씬 뷰에서 포인트를 드래그하는 것을 통해서 추가할 것입니다. <file csharp> @CustomEditor (LookAtPoint) class LookAtPointEditor extends Editor { function OnInspectorGUI () { target.lookAtPoint = EditorGUILayout.Vector3Field ("Look At Point", target.lookAtPoint); if (GUI.changed) EditorUtility.SetDirty (target); } function OnSceneGUI () { target.lookAtPoint = Handles.PositionHandle (target.lookAtPoint, Quaternion.identity); if (GUI.changed) EditorUtility.SetDirty (target); } } </file> OnSceneGUI은OnInspectorGUI처럼 작동합니다 – 그것이 씬 뷰에서 실행된다는 점을 제외하고. 사용자가 사용자 편집기 인터페이스를 만드는 것을 돕기 위해서 사용자는 Handles 클래스에서 정의된 함수들을 사용할 수 있습니다. 모든 함수들은 3D 씬 뷰에서 작동하기 위해 디자인되어져 있습니다. 사용자가2D GUI 오브젝트를 넣기를 원한다면 (GUI, EditorGUI 와 친구들), 사용자는 Handles.BeginGUI() and Handles.EndGUI()를 부르는 콜에서 그것들을 하나로 묶을 필요가 있습니다. * 출처: 유니티코리아위키 (CC BY-NC-SA 2.0)

역링크