2013-03-26 7 views
5

Czy mogę mimo to otrzymać powiadomienie (prawdopodobnie poprzez podniesienie metody/zdarzenia), gdy Component zostanie dodany do GameObject (a nawet dziecka GameObject)?Jak zostać powiadomionym o Komponencie lub dziecku GameObject został dodany do GameObject

Chciałbym być powiadamiany (ewentualnie w niektórych skryptach redaktorzy), gdy niektóre zdarzenia występuje w edytorze na przykład:

  • Component został załączonym do GameObject przykład
  • Component został dołączony do Prefab
  • GameObject stała dziecko z anot jej GameObject istance

Czy to możliwe? Jeśli tak, to w jaki sposób?


EDIT

I okazało się, delegata na co troska rodziców: EditorApplication.hierarchyWindowChanged

Odpowiednio do doc To się nazywa:

Wywoływana, gdy hierarchia scena zmieniła.

to transform.parent zmieniło gameObject.name, tworząc nową grę obiekt itp

ja nadal nie rozumiem, jeśli nie jest to wygodny sposób, aby rozumieć który obiekt w hierarchii został zmienione.

Odpowiedz

-1

Nie ma "wbudowanego" sposobu robienia tego wygodnie. Jednak można go symulować na kilka sposobów.

  • Wykorzystać funkcję Awake() w komponencie zadzwonić to rodzic gameObject (SendMessage pracuje bardzo równo do tego) [uwaga: to działa tylko jeśli dodanie nowego komponentu instancja]

LUB

  • Utwórz zmienną do śledzenia jej rodzica. W metodzie Update() sprawdź bieżący element nadrzędny, aby wywołać funkcję SendMessage dla nowego elementu nadrzędnego.

    Oto tylko dwa przykłady tego, co może zadziałać w tej sytuacji - jest o wiele więcej. Pod koniec dnia nic nie jest zbudowane (jak dotąd), ale z pewnością można je zrobić z punktu widzenia pracy.

1

Możesz dodać składnik do obiektu w (tylko do edytora) Poziom edycji sceny:

#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 

Następnie w ciągu zwrotnego można uzyskać dostęp do aktualnie zaznaczonego obiektu (dodany obiekt będzie być aktywny wybór):

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

i teraz można sprawdzić jego rodzica, aby zobaczyć czy pasuje jakikolwiek inny przedmiot, a także wykonywać inne kontrole, aby upewnić się, jest to rzeczywiście wydarzenie jesteś zainteresowany (rememb er będzie również wywoływany dla różnych innych zmian hierarchii), wtedy możesz wywołać inną funkcję, aby wykonać dowolną akcję.

Uwaga: To nie będzie działać jak jest dla scen w grze, jeśli zmieniać swoich scen w grze bezpośrednio z poziomu skryptów edytor następnie będziesz musiał użyć bardziej staranne rozmieszczenie #if UNITY_EDITOR i rozważ, jak usunąć niepotrzebny komponent (być może w Start lub w czasie kompilacji, jeśli to możliwe), lub po prostu zostaw to, nie robiąc nic, jeśli jesteś z tego zadowolony. W moim przypadku mój edytor poziomów jest sceną tylko dla edytora i zapisuje określony podzbiór sceny edytora jako scenę do wykorzystania w grze.

Powiązane problemy