Unity 3D碰撞检测

时间:2018-09-20 23:15:04

标签: c# visual-studio unity3d game-engine game-physics

我生成了一个由spehere组成的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 :(得分: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;

答案 1 :(得分:1)

您是否已附加Rigidbody?这些对象需要附加Rigidbody才能检测到碰撞。并请注意,对于每对碰撞器和碰撞对象,只要附加其中一个Rigidbody,就足以捕获事件。在您的情况下,如果您不想处理球体之间的碰撞,则将Rigidbody附加到角色对象就足够了。

答案 2 :(得分:1)

您可以将RigidBody添加到所有领域,但是如果您想拥有许多领域,那将是非常低效的。您要检查冲突的每2个对象中就有1个RigidBody

因此,在您的情况下,将RigidBody组件放在字符控制器对象上就足够了。

此外,请确保未将RigidBody设置为Kinematic。