Unity 3D 碰撞检测

Posted

技术标签:

【中文标题】Unity 3D 碰撞检测【英文标题】:Unity 3D Collisiondetection 【发布时间】:2018-09-20 23:15:04 【问题描述】:

我生成一个 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 我相信this post 通过更新transform 解释了您所面临的问题以及“传送”对象的注意事项。希望设置 velocity 有帮助:) 您应该真正构建一个预制件并为您节省一些代码......但无论如何。也将刚体添加到您的chunks,我假设您的播放器连接了刚体?这应该可以解决碰撞问题。如果不是,我真的看不到任何孩子附加到块:* Vector3 position = chunk.transform.GetChild(i).position;* 【参考方案1】:

要检测动态创建的对象上的触发器,您必须启用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;

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

您可以将RigidBody 添加到所有球体,但如果您想拥有许多球体,那将非常低效。对于要检查碰撞的每 2 个对象,有 1 个 RigidBody 就足够了。

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

另外,请确保 RigidBody 未设置为运动学。

【讨论】:

以上是关于Unity 3D 碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章

Unity 3D 碰撞检测

unity3d 怎么检测碰撞?比如主角碰撞到物体之后销毁被撞到的物体

Unity3d刚体Rigidbody与碰撞检测Collider

Unity:3D 运动/碰撞检测失败(AddForce、MovePosition、transform.localPosition)

Unity3d碰撞检测中碰撞器与触发器的区别

Unity3D利用物体碰撞检测键盘输入处理完成平衡球游戏