C# 统一三维碰撞检测

C# 统一三维碰撞检测,c#,visual-studio,unity3d,game-engine,game-physics,C#,Visual Studio,Unity3d,Game Engine,Game Physics,我生成一个Gameobjct speheres数组,并尝试对它们应用碰撞器来检测与我的角色控制器的碰撞 我试过几种方法,但都不管用。为什么Unity没有检测到碰撞 用于生成数组的脚本: public GameObject[] Chunkzufall(float l, float b, int n) { GameObject chunk = new GameObject(); GameObject[] chunks = new GameObject[n]; chunkS

我生成一个Gameobjct speheres数组,并尝试对它们应用碰撞器来检测与我的角色控制器的碰撞

我试过几种方法,但都不管用。为什么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;
}

要在动态创建的对象上检测触发器,必须启用
IsTrigger
标志,将碰撞器添加到对象。对象还必须附加有
刚体
。看起来您已经有了
IsTrigger
标志和碰撞器,但缺少
Rigidbody

替换此项:

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

chunk.AddComponent();
chunk.AddComponent()//添加刚体组件
chunk.GetComponent().isTrigger=true;
chunk.GetComponent().radius=5.0f;

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

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

因此,在您的情况下,在角色控制器对象上放置一个
刚体组件就足够了


另外,确保
刚体
未设置为运动学。

Hi@Lazy Male我相信可以通过更新变换解释您面临的问题以及“传送”对象的注意事项。希望设置速度有帮助:)你真的应该建立一个预制和保存你一些代码。。。但无论如何。将刚体添加到你的
块中
,我假设你的玩家有一个刚体?这应该可以解决碰撞问题。如果没有,我真的看不到任何子元素附加到chunk:*Vector3 position=chunk.transform.GetChild(i.position)*
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;