You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D中生成两两连接的弹簧关节网络时连接异常的问题求助

Unity 2D中生成两两连接的弹簧关节网络时连接异常的问题求助

嘿,我来帮你排查这个问题!你想要给列表里的每个物体两两都连上弹簧关节,但现在运行后每个物体只和最后一个物体建立了有效连接——这其实是个很容易踩的组件引用坑。

先说说你的代码问题出在哪:
每次你给softVertexList[i]添加新的SpringJoint2D组件后,立刻用GetComponent<SpringJoint2D>()去获取组件,但这个方法默认返回的是该物体上第一个匹配的组件,而不是你刚添加的那个!

举个直观的例子:当i=0,n从0到列表末尾循环时,你给物体0连续添加了n个弹簧关节,但每次获取的都是第一个关节(也就是n=1时添加的那个),然后不断把它的connectedBody改成当前n对应的物体。等循环结束,所有你添加的关节里,只有第一个被反复修改,最后指向了最后一个n的物体,剩下的关节根本没被正确设置过。

那怎么解决呢?很简单,直接保存刚添加的关节引用就好,不用每次都去调用GetComponent:

for (int i = 0; i < softVertexList.Count; i++)
{
    for (int n = 0; n < softVertexList.Count;n++)
    {
        if (i == n)
        {
            continue; // 跳过自己,这样写比空代码块更清晰
        }
        // 直接保存新添加的关节组件引用
        SpringJoint2D newSpringJoint = softVertexList[i].AddComponent<SpringJoint2D>();
        newSpringJoint.connectedBody = softVertexList[n].GetComponent<Rigidbody2D>();
    }
}

另外还有个小优化建议:你现在的循环会生成重复的关节(比如物体0连物体1,物体1又连物体0),如果你的需求不需要双向都有弹簧关节(其实单向弹簧关节也能实现连接效果),可以把内层循环改成从i+1开始,这样能减少一半的关节数量,节省性能:

for (int i = 0; i < softVertexList.Count; i++)
{
    // 只连接当前物体之后的物体,避免重复创建关节
    for (int n = i + 1; n < softVertexList.Count;n++)
    {
        // 给物体i添加关节连到物体n
        SpringJoint2D jointFromI = softVertexList[i].AddComponent<SpringJoint2D>();
        jointFromI.connectedBody = softVertexList[n].GetComponent<Rigidbody2D>();
        
        // 如果确实需要双向连接,再加上下面这段(可选)
        SpringJoint2D jointFromN = softVertexList[n].AddComponent<SpringJoint2D>();
        jointFromN.connectedBody = softVertexList[i].GetComponent<Rigidbody2D>();
    }
}

这样修改后,每个弹簧关节都会被正确设置对应的连接物体,应该就能实现你想要的两两连接效果啦!

备注:内容来源于stack exchange,提问作者Tyler Evans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:29:50