Как узнать сколько объектов столкнулось?

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Как узнать сколько объектов столкнулось?

Сообщение bigtony 13 июл 2018, 12:38

Друзья, нужна ваша помощь!

Учусь и путь мой тернист. Есть стена, она состоит из кирпичей:
Wall
--brick_0
--brick_1
--brick_2
--brick_3

Есть снаряд (пуля). Если пуля попадает в кирпич, он уничтожается. Это работает. Но нужно сделать так, чтобы уничтожалась стена, если не осталось ни одного потомка (кирпича).
По логике хотел сделать проверку: если пуля уничтожила последний кирпич - удалить стену. Пуля может одновременно задеть 2 кирпича, а может 1. Возможно как то узнать в OnTriggerEnter2D сколько объектов задела пуля?

Вот код который уничтожает кирпичи и пулю
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Bullet : MonoBehaviour
{
        void OnTriggerEnter2D(Collider2D coll)
        {
                if (coll.transform.CompareTag("brick"))
                {
                        Destroy(coll.transform.gameObject);                                
                        Destroy(gameObject);
                }
        }
}
 
bigtony
UNец
 
Сообщения: 4
Зарегистрирован: 13 июл 2018, 11:26

Re: Как узнать сколько объектов столкнулось?

Сообщение 1max1 13 июл 2018, 14:14

Синтаксис:
Используется csharp
if (transform.childCount == 0)
    Destroy(gameObject);
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как узнать сколько объектов столкнулось?

Сообщение waruiyume 13 июл 2018, 14:19

int collisionsCount

OnTriggerEnter
{
++collisionsCount
}

Start
{
StartCoroutine(ResolveCollisions)
}

ResolveCollisions
{
while(true)
{
yeld return new WaitForFixedUpdate
DoStuff(collisionsCount)
collisionsCount=0
}
}
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Как узнать сколько объектов столкнулось?

Сообщение bigtony 13 июл 2018, 14:46

1max1
Похожий способ я пробовал, проблема в том что на момент срабатывания триггера в родительском объекте присутствую кирпичи. Поэтому проверка на 0 не пройдет, хотя по завершению кадра (если я правильно понимаю) в родительском объекте может ничего не остаться.

waruiyume
До конца не понял как это прикрутить к моему случаю. Пойду разбирать...

Друзья, спасибо вам за столь скорый ответ.
bigtony
UNец
 
Сообщения: 4
Зарегистрирован: 13 июл 2018, 11:26

Re: Как узнать сколько объектов столкнулось?

Сообщение 1max1 13 июл 2018, 14:55

Причем тут триггер вообще? Вешаешь скрипт на свою стену, проверка в апдейте, когда кирпичи все задестроятся и дочерних объектов не останется стена сама себя удалит.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как узнать сколько объектов столкнулось?

Сообщение bigtony 13 июл 2018, 15:03

1max1
Так я делал
Синтаксис:
Используется csharp
public class Wall : MonoBehaviour {
        void Update () {
          if (transform.childCount == 0) Destroy(gameObject);
        }
}


Это работает, но это ж расточительство. В каждом кадре будет происходить лишняя проверка. Должен быть механизм, который позволит сделать это более правильно. Потому я и хотел в момент сработки триггера это сделать. Но сходу не получилось. Возможно это не так просто. Сейчас пробую сделать через сопрограмму, буду запускать в триггере.
bigtony
UNец
 
Сообщения: 4
Зарегистрирован: 13 июл 2018, 11:26

Re: Как узнать сколько объектов столкнулось?

Сообщение 1max1 13 июл 2018, 15:25

Да-а-а, очень расточительно)) Аж целый if в каждом фрейме.
Раз уж ты настроен на перфекционизм можно вообще обойтись без корутин:

Синтаксис:
Используется csharp
class Wall : MonoBehaviour // Это вешается на стену (родителя кирпичей:)
{
    public int brickCount { get; set; }

    void Start()
    {
        brickCount = transform.childCount; // Устанавливаем кол-во кирпичей
    }
}

class Bullet : MonoBehaviour // Это на пульку
{
    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Brick") // Если попали в кирпич какой либо стены
        {
            Wall wall = other.transform.parent.GetComponent<Wall>(); // Берем компонент стены у родителя

            Destroy(other.gameObject); // Убиваем кирпич
           
            --wall.brickCount; // Отнимаем кол-во кирпичей у стены

            if (wall.brickCount <= 0) // Если кирпичей не осталось вовсе, то удаляем стену
                Destroy(wall.gameObject);
        }
    }
}


P.S. Если со стеной ничего больше делать не нужно (типа двигать и т.д.), можно при старте тупо выкинуть все кирпичи из дочерних и сразу удалить стену, объект стена исчезнет а кирпичи останутся (popcorn1)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как узнать сколько объектов столкнулось?

Сообщение bigtony 16 июл 2018, 07:31

1max1

Спасибо! Всех вам благ! Ваше решение подошло, работает как часы. У меня что-то мозг даже не поворачивался, что достаточно ввести вспомогательную переменную и хранить в ней количество кирпичей. Значение переменной можно менять в момент попадания пули, а значит и следить за тем, сколько кирпичей вообще в стене осталось.

:)
bigtony
UNец
 
Сообщения: 4
Зарегистрирован: 13 июл 2018, 11:26

Re: Как узнать сколько объектов столкнулось?

Сообщение Nubila 16 июл 2018, 11:51

Почему все сравнивают по тэгу? Ведь если ваш тэг состоит из 10+ символов, то каждый символ будет сравниваться... Слои зачем придуманы то? 32 штук предостаточно.
Аватара пользователя
Nubila
UNITрон
 
Сообщения: 160
Зарегистрирован: 12 июл 2017, 15:59
Откуда: Запорожье


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31