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
相关产品推荐
相关产品推荐

