2013-03-26 12 views
5

Component bir (ve hatta GameObject'e) eklendiğinde (muhtemelen bazı yöntem/olay aracılığıyla) bildirilebilir mi?Nasıl bilgilendirilmeli o Bir GameObject bir GameObject öğesine eklenmiştir veya bir GameObject

bazı olaylar, örneğin editörü ortaya çıktığında ben (muhtemelen bazı editörler komut) bildirilmesini istiyorum:

  • A Component olmuştur bir GameObject örneği
  • A Component için ekli olmuştur Prefab
  • A GameObject için ekli anot arasında çocuk haline gelmiştir onun GameObject istance

Bu mümkün mü? denir EditorApplication.hierarchyWindowChanged

Buna göre dokümana: sahne hiyerarşisi değişti her Denilen


DÜZENLEME

ne endişe ebeveynlik için temsilci öğrendim.

Bu transform.parent, yeni bir oyun nesnesi yaratmak, gameObject.name değiştirilir vb

olmuştur hiyerarşide Nesne anlaşılan bir izlerden yol varsa ben hala anlamıyorum değişti.

cevap

-1

Bunu kolayca yapmanın "yerleşik" bir yolu yoktur. Ancak, bunu birkaç şekilde simüle edebilirsiniz.

  • o ana gameObject (SendMessage eserler çok temiz bunun için) var çağırmak için Bileşen Awake() işlevini kullanın [not: bu sadece çalışır bir YENİ bileşen örneğini ekliyorsanız]

VEYA

  • Ebeveynini izlemek için bir değişken oluşturun. Update() yönteminde, SendMessage'ı yeni ana öğeye tetiklemek için geçerli üst öğeyi denetleyin.

    'un durum için çalışabileceği sadece 2 örnek var - daha fazlası var. Günün sonunda, hiçbir şey yapılmamıştır (henüz olduğu gibi), ama kesinlikle bir iş çevresinde durmak mümkün.

Sen (editör okunur) seviye düzenleme sahnede bir nesneye bir bileşen ekleyebilirsiniz
1

:

#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 

Sonra callback'inde içinde geçerli seçili nesneye erişebilen (katma nesne olacak olmak aktif seçimi):

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

ve şimdi bunun ne olursa olsun diğer nesne ile eşleşen olmadığını görmek için onun ebeveyni kontrol edin ve bu aslında (rememb ilgilendiğiniz olaydır sağlamak için diğer kontrol gerçekleştirebilir, Diğer çeşitli hiyerarşi değişiklikleri için de çağrılacaktır), o zaman istediğiniz herhangi bir eylemi yapmak için başka bir işlevi çağırabilirsiniz.

Not: oyun içi sahneler için olduğu gibi sizin seviye editörü komut dosyaları ile doğrudan oyun içi sahneleri düzenlerseniz Bu o zaman #if UNITY_EDITOR daha dikkatli yerleşimi kullanmak gerekir, çalışmaz ve Gereksiz bileşeni (belki de Start ya da mümkünse yapım zamanında) nasıl kaldıracağınızı ya da bundan memnunsanız hiçbir şey yapmadan bırakınız. Benim durumumda, seviye editörüm sadece düzenleyici bir sahnedir ve editör sahnesinin belirli bir alt kümesini oyun içi kullanım için bir sahne olarak kaydeder.

İlgili konular