Unityプロジェクトで編集モードのスクリプトを実装しようとしています。アイデアは、オブジェクトにスクリプトを付けることができ、編集時にスケール/位置/回転などの属性が更新されていることがわかります。Unity/CでCustomEditorクラスを動的に作成する
編集モードスクリプトを作成しなくても、これらのすべてが可能ですが、再生ボタンが押されるまで変更内容は表示されません。それがここの違いです。
私はこれを行うにはhereのスクリプトのバリエーションを使用しています。
私はゲームオブジェクトに添付MonoBehaviorスクリプト持ってまず第一 - それはそうのようになります。
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);
}
}
セカンドを、私はいつでも、「更新」ボタンこのupdateEditorState
メソッドを呼び出し、エディタフォルダ内のスクリプトを持っています押された:
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
機能を起動することができます動的にクラスを生成する方法を知っている。