Обнаружение столкновений в Unity 3D

Я генерирую массив сфер Gameobjct и пытаюсь применить к ним коллайдер, чтобы обнаружить столкновение с контроллером моего персонажа.

Я пробовал методы serverel, ничего не работало. Почему Unity обнаруживает столкновение?

Скрипт для генерации массива:

 public GameObject[] Chunkzufall(float l, float b, int n)
{
    GameObject chunk = new GameObject();
    GameObject[] chunks = new GameObject[n];

    chunkSpeed = new float[n];
    chunkMaxH = new float[n];
    chunkMinH = new float[n];

    for (int j = 0; j < n; j++)
    {
        float h = 1;
        float posX = Random.Range(0.0f, b);
        float posZ = Random.Range(0.0f, l);

        GameObject group = Chunk(h);
        group.transform.Translate(posX, 0.0f, posZ);

        group.transform.parent = chunk.transform;
        chunk.tag = "reset";
        chunk.name = "chunk";

        chunkSpeed[j] = (float) Random.Range(-0.04f, 0.04f);
        chunkMaxH[j] = (float) Random.Range(2.0f, 10.0f);
        chunkMinH[j] = (float) Random.Range(-2.0f, -10.0f);

        chunk.AddComponent<SphereCollider>();
        chunk.GetComponent<SphereCollider>().isTrigger = true;
        chunk.GetComponent<SphereCollider>().radius = 5.0f;

        chunks[j] = chunk;

    }
    return chunks;
}

public void MoveChunks(GameObject[] chunks)
{
    int i = 0;
    foreach(GameObject chunk in chunks)
    {
        Vector3 position = chunk.transform.GetChild(i).position;

        if (position.y >= chunkMaxH[i] || position.y <= chunkMinH[i])
        {
            chunkSpeed[i] = chunkSpeed[i] * -1;
        }

        position.y = position.y - chunkSpeed[i];
        chunk.transform.GetChild(i).position = position;
        chunk.GetComponent<SphereCollider>().center = position;

        i++;
    }
    i = 0;
}

функция триггера столкновения:

    private void OnTriggerEnter(Collider col) {
    if (col.gameObject.tag == "reset") {
        transform.position = new Vector3(startX, startY, startZ);
        Debug.Log("chunk");
    }
}

Привет, @Lazy Male Я считаю, что эта почта объясняет, с чем вы сталкиваетесь, и предостережения относительно «телепортации» объекта, обновляя преобразовать. Надеюсь, установка скорость поможет :)

diogoslima 21.09.2018 02:03

вам действительно стоит создать сборный объект и сэкономить немного кода ... но в любом случае. добавить жесткое тело к вашему chunks, я полагаю, к вашему плееру прикреплено жесткое тело? это должно устранить проблемы столкновения. если нет, я действительно не вижу никаких дочерних элементов, прикрепленных к чанку: * Vector3 position = chunk.transform.GetChild (i) .position; *

Technivorous 21.09.2018 03:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
81
3

Ответы 3

Для обнаружения триггера на динамически созданном объекте необходимо включить флаг IsTrigger, добавить к объекту коллайдер. К объекту также должен быть прикреплен Rigidbody. Похоже, у вас уже есть флаг IsTrigger и коллайдер, но вам не хватает Rigidbody.

Замените это:

chunk.AddComponent<SphereCollider>();
chunk.GetComponent<SphereCollider>().isTrigger = true;
chunk.GetComponent<SphereCollider>().radius = 5.0f;

с участием

chunk.AddComponent<SphereCollider>();
chunk.AddComponent<Rigidbody>(); //ADDS RIGIDBODY COMPONENT
chunk.GetComponent<SphereCollider>().isTrigger = true;
chunk.GetComponent<SphereCollider>().radius = 5.0f;

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

Вы можете добавить RigidBody ко всем сферам, но это будет очень неэффективно, если вы хотите, чтобы их было много. Достаточно иметь 1 RigidBody на каждые 2 объекта, с которыми вы хотите проверить коллизию.

Так что в вашем случае было бы достаточно поместить компонент RigidBody в объект контроллера персонажа.

Также убедитесь, что RigidBody не установлен на кинематику.

Другие вопросы по теме