2017-09-20 29 views
0

Unity 프로젝트에서 편집 모드 스크립트를 구현하려고합니다. 아이디어는 스크립트를 객체에 첨부 할 수 있고 편집 할 때 크기/위치/회전과 같은 속성을 업데이트 할 수 있다는 것입니다.Unity/C#에서 CustomEditor 클래스를 동적으로 생성하기 #

편집 모드 스크립트를 작성하지 않고도 모든 작업이 가능하지만 재생 버튼을 누르기 전에는 변경 사항이 표시되지 않습니다. 그것은 차이점입니다.

나는이 스크립트를 변형하여 here을 사용하고 있습니다. -

은 나는 MonoBehavior 스크립트 내 게임 객체에 첨부 한 모든

먼저 그렇게 것 같습니다 :이 updateEditorState 메소드를 호출 편집기 폴더에 스크립트가

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

[ExecuteInEditMode] 
public class FlippersEditMode : MonoBehaviour { 
    public float extraScale = 1f; 
    public void updateEditorState() { 
     transform.localScale = (Vector3.up * extraScale); 
    } 
} 

둘째 때마다 "업데이트"버튼을 누를 때마다이 잘 작동하고 내가 그 감사 해요,하지만 코드의 마지막 청크가 순수 보일러입니다

using UnityEngine; 
using UnityEditor; 

[CustomEditor(typeof(FlippersEditMode))] 
public class FlipperEditModeMeta: Editor { 
    public override void OnInspectorGUI() { 
     base.OnInspectorGUI(); 
     if (GUILayout.Button("Update")) { 
      if (target.GetType() == typeof(FlippersEditMode)) { 
       FlippersEditMode flippers = (FlippersEditMode)target; 
       flippers.updateEditorState(); 
      } 
     } 
    } 
} 

. 편집 모드를 적용하려는 각 스크립트에 대해이 파일 중 거의 동일한 파일이 필요합니다.

그래서 "메타"편집기 스크립트를 만들기 시작했습니다. 아이디어는이 스크립트가 개발자가 스크립트를 드래그 할 수있는 일련의 슬롯을 갖게된다는 것입니다. 여기에 드래그 된 각 스크립트는 위에 표시된 것과 같이 정의 된 CustomEditor 클래스를 가져옵니다. 물론 여기서 드래그되는 클래스는 각각 updateEditorState을 구현해야하지만 프로토콜의 유일한 요구 사항입니다.

그래서 다음과 같습니다 다른 편집기 스크립트를 만들 경우 :

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEditor; 

public class EditModeScripts : MonoBehaviour { 

    public MonoBehaviour[] scripts = {}; 

    public void updateEditorState() { 
     for (int i = 0; i < scripts.Length; i++) { 
      MonoBehaviour script = scripts[i]; 
      // How to generate an editor class here for each script? 
     } 
    } 
} 

을하지만 보시다시피 난 몰라 :

다음
using UnityEngine; 
using UnityEditor; 

[CustomEditor(typeof(EditModeScripts))] 
public class EditModeScriptsMeta : Editor { 
    public override void OnInspectorGUI() { 
     base.OnInspectorGUI(); 
     if (GUILayout.Button("Update")) { 
      if (target.GetType() == typeof(EditModeScripts)) { 
       EditModeScripts edit_mode_scripts = (EditModeScripts)target; 
       edit_mode_scripts.updateEditorState() 
      } 
     } 
    } 
} 

나는 다음에 updateEditorState 기능을 실행할 수 있습니다 동적으로 클래스를 생성하는 방법을 알고 있어야합니다.

답변

1

나는 귀하의 접근 방식이 순전히 동적으로 작동하지 않을 것이라고 생각합니다. Unity는 사용자가 무언가를 변경하고 화합 할 때마다 코드를 컴파일합니다. 그것을 컴파일 한 후에 Unity는 Reflection을 사용하여 사용할 수있는 편집기를 결정합니다.

이론적으로 편집기 코드가 포함 된 새 소스 파일을 만들 수 있습니다. 자동으로 스크립트를 다시 가져올 지 또는 다시 가져 오기를 수동으로 트리거해야하는지는 알 수 없습니다. 수동 AssetDatabase.Refresh()의 조합을 사용하고이 충분하지 않은 경우, Selection 클래스를 통해 스크립트 자산을 선택하고 EditorApplication.ExecuteMenuItem를 사용하여 다시 가져 오기 메뉴 항목을 트리거 할 수 있습니다 다시 가져 오기 위해

.