2013-03-26 10 views
5

È comunque possibile ricevere una notifica (eventualmente attraverso qualche metodo/evento innalzato) quando un Component viene aggiunto a GameObject (e anche a un bambino GameObject)?Come essere avvisati o un componente o un figlio GameObject è stato aggiunto a un GameObject

mi piacerebbe ricevere una notifica (possibilmente in alcuni script editor), quando alcuni eventi si verifica nell'editor per esempio:

  • Un Component è stato attaccato ad un GameObject esempio
  • A Component è stato attaccato ad un Prefab
  • un GameObject è diventato bambino di anot lei GameObject istanza

E 'possibile? Se si, come?


EDIT

ho scoperto un delegato per quanto riguarda genitorialità: EditorApplication.hierarchyWindowChanged

Di conseguenza per il doc si chiama:

chiamato ogni volta che la gerarchia scena è cambiata.

Questo è transform.parent cambiata, gameObject.name, la creazione di un nuovo oggetto gioco , ecc

Non ho ancora capito se c'è un modo comoda per capire quale oggetto nella gerarchia è stata cambiato.

risposta

-1

Non esiste un modo "integrato" per farlo comodamente. Tuttavia, è possibile simularlo in un paio di modi.

  • utilizzare la funzione Awake() nel componente di chiamare suo genitore gameObject (SendMessage opere in modo molto pulito per questo) [Nota: questo funziona solo se si sta aggiungendo una nuova istanza del componente]

O

  • Creare una variabile per tracciare il suo genitore. Nel metodo Update(), selezionare genitore corrente per attivare SendMessage sul nuovo genitore.

    Ecco solo 2 esempi di cosa può fare per la situazione: ce n'è ancora. Alla fine della giornata, nulla è stato costruito (fino ad ora), ma certamente fattibile da un punto di vista pratico.

1

È possibile aggiungere un componente a un oggetto nel vostro (-unico editor) Livello-editing scena:

#if UNITY_EDITOR 
using UnityEditor; 
using UnityEngine; 

public class LevelEditorHelper : MonoBehaviour 
{ 
    LevelEditorHelper() 
    { 
     EditorApplication.hierarchyWindowChanged -= MyHierarchyChangedCallback; 
     EditorApplication.hierarchyWindowChanged += MyHierarchyChangedCallback; 
    } 

    private static void MyHierarchyChangedCallback() 
    { 
     Debug.Log("Hierarchy has changed"); 
    } 
} 
#endif 

Poi all'interno della richiamata è possibile accedere all'oggetto selezionato corrente (l'oggetto aggiunto sarà la selezione attiva):

GameObject activeObj = Selection.activeGameObject; 
if(activeObj != null) { 
    ... 

e ora si può controllare il suo genitore per vedere se corrisponde a qualsiasi altro oggetto, ed eseguire altri controlli per assicurare che questo è in realtà l'evento che ti interessa (rememb er sarà chiamato anche per altre modifiche alla gerarchia), quindi puoi chiamare un'altra funzione per fare qualsiasi azione tu voglia.

Nota: Questo non funziona così com'è per le scene in-game, se si modifica le scene in-game direttamente con i vostri script di livello-redattore allora avrete bisogno di utilizzare più attento posizionamento di #if UNITY_EDITOR e considera come rimuovere il componente non necessario (forse nel Start o, se possibile, in fase di costruzione), oppure lascialo lì senza fare nulla se sei soddisfatto. Nel mio caso il mio editor di livelli è una scena di solo editore, e salva un sottoinsieme specifico della scena dell'editor come scena per l'uso in-game.

Problemi correlati