Страница 1 из 1

Столкновение с дочерним объектом

СообщениеДобавлено: 12 июл 2018, 17:24
hellinsider
Добрый день, Подскажите пожалуйста, почему не работает код
есть 2 объекта: игрок и кусок дороги, на куске дороги 2 дочерних объекта с которыми должно просчитываться столкновение. На игроке и этих дочерних объектах висят коллайдеры и Rigidbody. При столкновении эти 2 объекта должны запустить функцию главного скрипта, которая уничтожит игрока. Но простейшая проверка на столкновение не работает ( status_collapse не меняется ). Тоже самое применительно НЕ к дочерним а основным объектам работает.
Синтаксис:
Используется csharp
public class StolknovenieDetected : MonoBehaviour
{
    public int status_collapse = 0;
    public void OnCollisionEnter(Collision myCollision)
    {
        if (myCollision.gameObject.tag == "Collapse")
        {
            GameObject.Find("TestRun").GetComponent<csTestRun>().GlobalDeath();
            status_collapse = 1;
        }
    }
}
 

Re: Столкновение с дочерним объектом

СообщениеДобавлено: 12 июл 2018, 17:40
1max1
Эх, щас бы на кофейной гуще гадать, откуда нам знать что там у тебя не так? есть много причин по которым скрипт не работает, перечислять их думаю глупо, хоть бы скрины показал что да как.

Re: Столкновение с дочерним объектом

СообщениеДобавлено: 13 июл 2018, 21:35
Fox_game
hellinsider писал(а):Добрый день, Подскажите пожалуйста, почему не работает код
есть 2 объекта: игрок и кусок дороги, на куске дороги 2 дочерних объекта с которыми должно просчитываться столкновение. На игроке и этих дочерних объектах висят коллайдеры и Rigidbody. При столкновении эти 2 объекта должны запустить функцию главного скрипта, которая уничтожит игрока. Но простейшая проверка на столкновение не работает ( status_collapse не меняется ). Тоже самое применительно НЕ к дочерним а основным объектам работает.
Синтаксис:
Используется csharp
public class StolknovenieDetected : MonoBehaviour
{
    public int status_collapse = 0;
    public void OnCollisionEnter(Collision myCollision)
    {
        if (myCollision.gameObject.tag == "Collapse")
        {
            GameObject.Find("TestRun").GetComponent<csTestRun>().GlobalDeath();
            status_collapse = 1;
        }
    }
}
 

Поставь дочерним объектам галку на Киниматике

Re: Столкновение с дочерним объектом

СообщениеДобавлено: 14 июл 2018, 07:04
Nubila
hellinsider писал(а):Добрый день, Подскажите пожалуйста, почему не работает код
есть 2 объекта: игрок и кусок дороги, на куске дороги 2 дочерних объекта с которыми должно просчитываться столкновение. На игроке и этих дочерних объектах висят коллайдеры и Rigidbody. При столкновении эти 2 объекта должны запустить функцию главного скрипта, которая уничтожит игрока. Но простейшая проверка на столкновение не работает ( status_collapse не меняется ). Тоже самое применительно НЕ к дочерним а основным объектам работает.
Синтаксис:
Используется csharp
public class StolknovenieDetected : MonoBehaviour
{
    public int status_collapse = 0;
    public void OnCollisionEnter(Collision myCollision)
    {
        if (myCollision.gameObject.tag == "Collapse")
        {
            GameObject.Find("TestRun").GetComponent<csTestRun>().GlobalDeath();
            status_collapse = 1;
        }
    }
}
 

А я вот погадаю чуток)
1) Если лез в Physics вкладку, то возможно там ты убрал столкновения у слоёв.
2) Если повесил риги на чайлдов, а скрипт с проверкой коллизии у тебя в паренте, то они не связаны больше этим событием. Убери им риджиды, и оставь только на паренте, но в таком случае если скрипт весит на паренте, а чайлд прикоснётся к игроку, то ты не сможешь понять что это сделали именно чайлды, а не парент. Либо вешай на игрока, с проверкой на то, с кем столкнулся.

ЗЫ: воть этьо калль, так как дорого стоит:
GameObject.Find("TestRun").GetComponent<csTestRun>().GlobalDeath();
вместо этого сделай так:
myCollision.gameObject.SetActive(false);
либо если игрок точно будет один и дорога больше никого не уничтожает, то в старте найди скрипт и кешируй его, а в событии столкновения вызывай на нём функцию в которой отключается игрок.
Это гораздо дешевле по производительности(не обязательно уничтожать объект в прямом смысле этого слова).