Skip to content

Week_4: Editor Scripting

hongsam14 edited this page Oct 19, 2021 · 18 revisions

Execute In EditMode

에디터 스크립트를 작성할 때 'play mode'가 아닌 게임이 실행되지 않는 'edit mode'중에서도 특정 스크립트가 실행되도록 할 수 있다.

//Example WireBehaviour.cs
[ExecuteInEditMode]

[ExecuteInEditMode]에서 awake, start, update는 언제 호출되는가?

runtime script일 경우:

  • Awake:
  1. scene이 로드될 때 스크립트가 포함된 활성 gameobject가 초기화될 때
  2. 이전에 비활성된 gameobject가 활성으로 설정될 때
  3. Object.Instantiate 로 생성된 gameobject가 초기화 된 후 응용 프로그램이 시작되기 전에 Awake 를 사용 하여 변수 또는 상태를 초기화 한다.
  • Start: Update 메서드가 처음 호출되기 직전에 스크립트가 활성화되면 프레임에서 Start가 호출된다. -> 따라서 Awake가 start 후에 호출 될 수도 있음.
  • Update: MonoBehaviour가 활성화된 경우 Update가 모든 프레임에 호출된다.

Edit script일 경우: 로그를 찍어보니 update밖에 안찍힘. <- 첨인 필요.


이렇게 간단하게 editmode에서 스크립트를 실행할 수 있지만, 이 방법은 에디터 툴을 직접 만들 수 없다.

커스텀 에디터 생성

Unity에서 작성하는 스크립트는 기본적으로 Monobehaviour을 상속받는다. 이를 게임 오브젝트에 올려놓으면 Unity인스펙터에 표시가능한 모든 public 변수를 보고 편집할 수 있는 default interface가 표시된다. 커스텀 에디터는 이 default layout을 사용자가 선택하는 에디터 컨트롤로 대체하는 별도의 스크립트이다.

어떤 스크립트를 위한 커스텀 에디터를 만들고 싶다면 별도의 이름이 같지만 editor가 추가된 다른 스크립트를 작성해야 한다.

//Example WireBehaviourEditor.cs
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(WireBehaviour))]
[CanEditMultipleObjects]

이 클래스는 Editor에서 파생되어야 한다. CustomEditor 속성은 이 Editor script가 어떤 컴포넌트를 위해 동작해야하는지 Unity에 알린다. CanEditMultipleObject 속성은 사용자가 이 에디터 스크립트로 여러 오브젝트를 선택하고 모두 동시에 변경할 수 있음을 Unity에 알린다.

public class WireBehaviourEditor : Editor
{
 public override void OnInspectorGUI()
 {
  ~
 }
}

OnInspectorGUI는 Unity가 인스펙터에 에디터를 표시할때마다 실행이 된다. <-- 첨언 필요. 이 코드는 게임에서 OnGUI가 작동하는 것 처럼 작동하지만 인스팩터 내에서 실행된다.