Unity 3D Collisiondedection - PullRequest
       38

Unity 3D Collisiondedection

0 голосов
/ 21 сентября 2018

Я генерирую массив сфер 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");
    }
}

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

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

0 голосов
/ 21 сентября 2018

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

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

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

0 голосов
/ 21 сентября 2018

Чтобы обнаружить триггер на динамически созданном объекте, вы должны включить флаг 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;
...