2017-09-20 8 views
0

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機能を起動することができます動的にクラスを生成する方法を知っている。

答えて

1

あなたのアプローチは純粋に動的には機能しません。 Unityは、何かを変更して単一性に戻るたびにコードをコンパイルします。コンパイル後、Unityはリフレクションを使用して、使用可能なエディタを決定します。

理論的には、エディタコードを含む新しいソースファイルを作成できます。私はそれが自動的にスクリプトを再インポートするか、手動で再インポートをトリガする必要があるかどうかはわかりません。

AssetDatabase.Refresh()の組み合わせを手動で再インポートする場合は、Selectionクラスを使用してスクリプトアセットを選択し、EditorApplication.ExecuteMenuItemを使用して再インポートメニューエントリをトリガーします。

関連する問題