2015-05-21 8 views
9

Sto provando a scrivere una semplice estensione di editor solo per scopi di apprendimento. Questa estensione controllerà solo se il target è un file JSON, quindi conta le sue chiavi o esegue qualche altro compito arbitrario.Unity Editor - DrawDefaultInspector non funziona

Ecco come appare l'ispettore per impostazione predefinita. This is how the inspector looks like by default

Poi ho iniziato a scrivere il mio ispettore personalizzato, proprio come questo.

[CustomEditor(typeof(TextAsset))] 
public class TestInspector : Editor 
{ 
    public override void OnInspectorGUI() 
    { 
     DrawDefaultInspector(); 
    } 
} 

Nota la chiamata a DrawDefaultInspector().

Ora l'ispettore si presenta così.

Now the inspector looks like this.

Perché non è il disegno l'ispettore di default? Quello che posso capire la mia estensione dovrebbe fondamentalmente non fare nulla, giusto?

risposta

2

Penso che il problema sia TextAsset che non usa la normale classe editor per inspector. Molti di classe integrato di unità utilizzando speciali classe redattore incorporato che non è pubblico

Si potrebbe provare con il cambiamento [CustomEditor(typeof(TextAsset))]-[CustomEditor(typeof(Transform))] o [CustomEditor(typeof(Animator))] di vedere il "ispettore di default reale" di trasformare e animatore non è la stessa come di consueto uno

Quindi, se vuoi creare un editor personalizzato. Non mi interessa l'ispettore di default. Basta farlo da zero. Buona fortuna

+0

Questa sembra essere la risposta giusta. 'DrawDefaultInspector' non sembra gestire' TextAssets' perché probabilmente c'è una classe di editor interno privato per il tipo 'TextAsset'. – Sam

+0

Ho aggiunto un esempio di come fare ciò che l'OP vuole usando la riflessione. – Sam

2

Se si desidera eseguire l'override della finestra di ispezione del testo incorporata, è necessario trovarla e richiamarla dal proprio editor. La classe è denominata UnityEditor.TextAssetInspector ma è una classe interna privata che di solito può essere referenziata internamente da Unity. Tuttavia, è possibile accedervi utilizzando la riflessione in questo modo:

 
using System; 
using System.Reflection; 
using UnityEngine; 
using UnityEditor; 

[CustomEditor(typeof(TextAsset))] 
public class TestInspector : Editor 
{ 
    private Editor m_editor; 

    public override void OnInspectorGUI() 
    { 
     if (m_editor == null) 
     { 
      var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
      foreach (var a in assemblies) 
      { 
       var type = a.GetType("UnityEditor.TextAssetInspector"); 
       if (type != null) 
       { 
        m_editor = Editor.CreateEditor(target, type); 
        break; 
       } 
      } 
     } 

     if (m_editor != null) 
      m_editor.OnInspectorGUI(); 
    } 
} 

Questo cerca attraverso tutti i gruppi attualmente caricati per il tipo UnityEditor.TextAssetInspector, e quindi crea un'istanza di esso per il target attività corrente. Usiamo la versione di Editor.CreateEditor che ci consente di passare il tipo di editor da creare, perché altrimenti tenterà di creare un'istanza di TestInspector.

Si noti che questo presuppone alcune cose sugli interni di Unity e potrebbe non funzionare nelle versioni future di Unity.

+1

Questo è così bello. E penso che potresti fare meglio per la ricerca, invece di cercare il tipo UnityEditor.TextAssetInspector. Si può iterare tutto il tipo e filtrare un tipo che ha attributo CustomEditor di TextAsset collegato a – Thaina

+0

Oh sì, certo! E poi controlla che non sia il tipo 'TestInspector' in modo che tu non entri in un ciclo ricorsivo. Anche la ricerca di cui sopra potrebbe essere accelerata trovando prima l'assemblaggio di 'UnityEditor' piuttosto che cercare in ogni assembly. Ma ti dà comunque alcune idee. – Sam

+0

Come hai scoperto quale classe interna nascosta è stata utilizzata da 'TextAsset'? Come potrei andare a scoprire quale viene utilizzato da, ad esempio, "SpriteRenderers"? – JeromeJ