Как получить доступ к коллайдеру, прикрепленному к дочерним элементам префаба? - PullRequest
0 голосов
/ 04 августа 2020

Я прикрепил сценарий к префабу, и сценарий выглядит следующим образом:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class destroyer: MonoBehaviour {

    Circles circles;

    Collider2D collider1;
    Collider2D collider2;

    private void Start() {
        collider1 = gameObject.transform.GetChild(0).GetComponent < Collider2D > ();
        collider2 = gameObject.transform.GetChild(1).GetComponent < Collider2D > ();
        circles = FindObjectOfType < Circles > ();
    }

    private void Update() {
        if (transform.position.y < 2) {
            Destroy(gameObject);
            circles.instantiator();

        }

    }
    void OnTriggerStay2D(Collider2D other) {

        if (collider1.bounds.Contains(other.bounds.max) && collider1.bounds.Contains(other.bounds.min)) {
            print("2");
            if (other.bounds.Contains(collider2.bounds.max) && other.bounds.Contains(collider2.bounds.min)) {
                print("3");
                if (transform.position.y > 3) {
                    print("4");
                    Destroy(other.gameObject);
                    Destroy(gameObject);
                    circles.instantiator();
                }

            }

        }
    }

}

OnTriggerStay2D вызывается функция, но условие, когда GameObject полностью находится внутри коллайдера 1 и вне коллайдера 2, является никогда не истинно, даже если другой GameObject удовлетворяет условию. Раньше, когда я прикреплял оба коллайдера к префабу, это условие становилось истинным, когда игровой объект удовлетворял условию. Но после смены не работает. Я думаю, что я не обращаюсь к коллайдеру ребенка должным образом или есть другая ошибка. Пожалуйста, помогите мне решить эту проблему.

enter image description here

This is the pic of gameobject with two children each having circular collider

введите описание изображения здесь

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

Изменить: та же функция работает нормально, и я получаю то, что хочу, когда помещаю сборный элемент на сцену и затем запускаю игру. Но он не работает с тем же префабом, который создается после запуска игры.

1 Ответ

0 голосов
/ 04 августа 2020

Я думаю, вы можете улучшить свои условия, используя Collider2D.IsTouching вот так:

void OnTriggerStay2D(Collider2D other) {

    if (collider1.IsTouching(other)) {
        print("2");
        if (other.IsTouching(collider2)) {
            print("3");
            if (transform.position.y > 3) {
                print("4");
                Destroy(other.gameObject);
                Destroy(gameObject);
                circles.instantiator();
            }

        }

    }
}

Ссылка: ScriptReference / Collider2D.IsTouching

Проверьте, касается ли этот коллайдер коллайдера или нет. Важно понимать, что проверка того, касаются ли коллайдеры или нет, выполняется по последнему обновлению физической системы; это состояние касания коллайдеров в то время. Если вы только что добавили новый Collider2D или переместили Collider2D, но обновление физики еще не произошло, то коллайдеры не будут отображаться как соприкасающиеся. Эта функция возвращает те же результаты столкновения, что и обратные вызовы физического столкновения или триггера.

РЕДАКТИРОВАТЬ 1:

Вы также можете объединить предыдущий код с: Physics2D.OverlapCollider

Итак, вы можете сделать:

void OnTriggerStay2D(Collider2D other) {

    if (collider1.IsTouching(other)) {
        Collider2D[] results;
        int elements = collider2.OverlapCollider(new ContactFilter2D, results);
        if (elements > 0) {
            // do some extra work with your result Collider2D array
            // here
            //
            if (transform.position.y > 3) {
                print("4");
                Destroy(other.gameObject);
                Destroy(gameObject);
                circles.instantiator();
            }

        }

    }
}
...