Как обрабатывать двумерные коллизии в скрипте, который не прикреплен к игровому объекту

Как правило, из того, что я узнал, столкновения обрабатываются в сценарии, который прикреплен к игровому объекту. В моей игре есть 6 игровых объектов, которые сталкиваются друг с другом, что затрудняет реализацию первой идеи. Я хочу сделать все игровые объекты префабами и создать их экземпляры в другом скрипте, прикрепленном к пустому игровому объекту. Как я могу справиться с коллизиями между всеми этими 6 игровыми объектами в новом скрипте?


person Nullititiousness    schedule 17.04.2016    source источник
comment
почему это было бы сложно реализовать? что вы хотите, чтобы произошло столкновение? подпрыгивание происходит автоматически   -  person Fattie    schedule 18.04.2016
comment
В его нынешнем виде только один объект имеет префаб, и я создаю несколько копий в пустом игровом объекте. Все игровые объекты сталкиваются друг с другом, вызывая изменения в коллайдерах боксов, средствах визуализации спрайтов, разрушении и создании объектов, а также приложенная сила - вот некоторые из вещей, которые происходят во время столкновения. Сложность в том, например, что если объект A сталкивается с объектом B, должен ли объект A иметь коллайдер, объект B или и то, и другое? Это решение было бы простым, если бы столкнулись всего несколько объектов.   -  person Nullititiousness    schedule 18.04.2016
comment
Я вообще не могу следить за тобой. Если A сталкивается с B, то оба A и B имеют коллайдеры.   -  person Fattie    schedule 18.04.2016
comment
Возможно, вы пытаетесь спросить: представьте себе типичную игру с противником и снарядом. Во время игры снаряды поражают врагов. (очевидно, что у ОБЕИХ есть коллайдеры и твердые тела - все должно иметь коллайдер и твердое тело). Когда они попадают, враг, например, взрывается. Конечно, у вас есть вопрос, используете ли вы этот код, чтобы взорвать врага на пулю! или на врага! На этот вопрос нет большого загадочного ответа, это просто повседневное решение программирования - вы можете сделать это в любом случае. Если это то, о чем вы спрашиваете, это ответ.   -  person Fattie    schedule 18.04.2016


Ответы (1)


Мне интересно то же самое, что и Джо Блоу, но все же, если вы хотите попробовать обработать столкновения вручную (что, кстати, усложнит физику, так как вам придется вычислять подпрыгивание, гравитацию и т. Д. Вручную) тогда вы можете попробовать это:

public class OtherScript : MonoBehavior
{
    public GameObject[] objects; //Your 6 GameObject

    void Update()
    {
        for (int i=0; i<objects.Length; i++)
        {
            for (int j=0; j<objects.Length; i++)
            {
                if (objects[i].GetComponent<Renderer>().bounds.Intersects(
                           objects[j].GetComponent<Renderer>().bounds))
                {
                    //Handle collision
                    break;
                }
            }
        }
    }
}

Если это не сработает, попробуйте использовать GetComponent<MeshFilter>().mesh.bounds. Обратите внимание, что если ваша игра 2D, вы должны использовать вместо нее GetComponent<SpriteRenderer>().mesh.bounds.

person Agustin0987    schedule 18.04.2016
comment
Пожалуйста, проверьте мой ответ на комментарий Джо Блоу. Я стараюсь избегать проверки коллизий в методе обновления, можно ли создать собственный метод OnCollisionEnter2D для решения моей проблемы. - person Nullititiousness; 18.04.2016
comment
Конечно, можно создать настраиваемое событие для столкновения с использованием делегатов и события, но вам все равно придется обнаруживать столкновение (либо проверяя границы, либо физический движок Unity), чтобы инициировать настраиваемое событие. Может быть, если вы еще немного объясните, чего именно вы хотите достичь, мы могли бы предложить другие идеи. - person Agustin0987; 18.04.2016
comment
меня озадачивает ваш вопрос @Nullititiousness, конечно, очевидно, есть обратные вызовы при столкновении docs.unity3d.com/ScriptReference/ и так далее. - person Fattie; 18.04.2016
comment
возможно ли, что (по какой-то причине) вы, скажем, пытаетесь передать все события столкновения, возможно, в главный скрипт или скрипт на каком-то главном объекте? если это тривиально, просто используйте unityEvent, которое вы постоянно используете в Unity по многим причинам ... stackoverflow.com/a/ 36249404/294884 - person Fattie; 18.04.2016
comment
привет, @Nullititiousness, отлично - обязательно отметьте здесь ответ, чтобы закрыть QA и поддерживать порядок на доске, спасибо - person Fattie; 18.04.2016
comment
@JoeBlow, я имел в виду ссылку из другого вопроса stackoverflow, на который вы ответили. - person Nullititiousness; 18.04.2016
comment
привет @ Nullititiousness! если есть только один ответ, и это хороший ответ, традиционно на него указывают из вежливости. В конце концов, единственная причина, по которой я обсудил этот вопрос и что один из комментариев был полезным, заключалась в том, что Агустин дал такой хороший ответ. обратите внимание, что вы сами получаете баллы за отметку, и это означает, что позже вы получите меньше модерации. ваше здоровье! - person Fattie; 19.04.2016