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
기능을 실행할 수 있습니다 동적으로 클래스를 생성하는 방법을 알고 있어야합니다.