Как найти дочерний объект и отключить его, а через некоторое время опять включить?

119
24 июля 2019, 22:50

Есть вот такой скрипт:

public class SpwnEffect : MonoBehaviour
{
    public GameObject SpwnEff;
    void Start ()
    {
        SpwnEff.SetActive(false);
    }   
    void Update ()
    {
        if (transform.position.y < -20)
        {            
            SpwnEff.SetActive(true);
            StartCoroutine(DisableSpwnEff(2.0f));            
        }
    }
    IEnumerator DisableSpwnEff(float sec)
    {
        yield return new WaitForSeconds(sec);
        SpwnEff.SetActive(false);
    }    
}

Но условия изменились и "SpwnEff" больше не публичный объект, а назначаемый другим скриптом. И теперь их много и с разными именами. Теперь этот объект дочерний. Нужно в скрипте, который "повиснет" на "родителе" обратится к дочерним объектам - на старте - отключить их. Затем при условии transform.position.y < -20 - включить - и через секунду - опять отключить. Этот процесс должен быть повторяемым. Речь идёт о персонаже, на котором висит префаб - эффект вспышки. Когда персонаж появляется на сцене - префаб отключён - когда проваливается вниз, до отметки -20 - префаб должен включаться (другой скрипт возвращает персонажа на чек-поинт и по задумке, должна произойти вспышка), а затем, через пару секунд, префаб надо отключить - что б, при следующем падении он опять сработал.

Answer 1

Чтобы получить список "детей" данного объекта, можно использовать такой подход:

foreach(Transform child in transform) {
    // итерируемся по всем детям
    // для получения именно объекта ребенка - используем child.gameObject
}

Чтобы выключить/включить всех детей, проще написать метод, используя код выше:

void SetChildrenActiveState(bool active) {
    foreach(Transform child in transform) {
        child.gameObject.SetActive(active);
    }
}

Также надо понимать, что условие if (transform.position.y < -20) будет каждый кадр возвращать true после преодоления объектом высоты в -20f. Поэтому желательно завести какой-нибудь флаг, если же таких "состояний" больше 2, то лучше завести конечный автомат, но это уже совсем другая история.

Ну и наконец, финальный код:

public class ChildrenActivator : MonoBehaviour {   
    bool ready = true;
    void Start() {
        SetChildrenActiveState(false);
    }
    void Update() {
        if (ready && transform.position.y <= -20f) {
            StartCoroutine(DisableSpwnEff(1.0f));
        }
    }
    IEnumerator DisableSpwnEff(float sec) {
        ready = false;
        SetChildrenActiveState(true);
        yield return new WaitForSeconds(sec);
        ready = true;
        SetChildrenActiveState(false);
    }
    void SetChildrenActiveState(bool active) {
        foreach(Transform child in transform) {
            child.gameObject.SetActive(active);
        }
    }
}
READ ALSO
Отловить момент звукового сигнала

Отловить момент звукового сигнала

Есть ли возможность отловить момент воспроизведения определённого звука на компьютера?

148
Запаролить SQLite

Запаролить SQLite

Всем доброго дня! Хочу использовать SQLite в своем проекте, защитив ее паролемВ гугле нашел такие решения:

138
В чем разница между FOREACH и итератором [дубликат]

В чем разница между FOREACH и итератором [дубликат]

На данный вопрос уже ответили:

139
Синхронизация Progressbar с CMD

Синхронизация Progressbar с CMD

Мне нужно синхронизировать Progressbar в Windows Forms с командой sfc /scannowЭта команда отвечает за проверку системный файлов и идёт в процентах

141