需求:在空物体下计算对应的空间体积并附加对应的碰撞器,这个其实是可以手动处理的,代码处理有些不严谨,有些误差挺大的要特殊处理
思路:由于我做的是多个同样物体的空间分布,所以可以直接取X,Y,Z方向的最大距离,然后加上个对应方向的最远物体的两直径,则可获得对应的长宽高,然后赋予boxcollider对应的数值。
1.获取空间最大的距离
private float MaxDirectionDistant(List<Transform> ChildPos, DirectionEnum direction) { float maxDistant = 0; switch (direction) { case DirectionEnum.Directionx: if (ChildPos.Count > 0) { float TempDistant = 0; for (int i = 0; i < ChildPos.Count; i++) { if (ChildPos[i] != null) { float posi = ChildPos[i].localPosition.x + 0.01f; float posx = ChildPos[0].localPosition.x + 0.01f; TempDistant = Mathf.Abs(ChildPos[i].localPosition.x - ChildPos[0].localPosition.x); if (TempDistant > maxDistant) { maxDistant = TempDistant; } } } } break; case DirectionEnum.Directiony: if (ChildPos.Count > 0) { float TempDistant = 0; for (int i = 0; i < ChildPos.Count; i++) { if (ChildPos[i] != null) { float posi = ChildPos[i].localPosition.y + 0.01f; float posx = ChildPos[0].localPosition.y + 0.01f; TempDistant = Mathf.Abs(ChildPos[i].localPosition.y - ChildPos[0].localPosition.y); if (TempDistant > maxDistant) { maxDistant = TempDistant; } } } } break; case DirectionEnum.Directionz: if (ChildPos.Count > 0) { float TempDistant = 0; for (int i = 0; i < ChildPos.Count; i++) { if (ChildPos[i] != null) { float posi = ChildPos[i].localPosition.z + 0.01f; float posx = ChildPos[0].localPosition.z + 0.01f; TempDistant = Mathf.Abs(ChildPos[i].localPosition.z - ChildPos[0].localPosition.z); if (TempDistant > maxDistant) { maxDistant = TempDistant; } } } } break; } return maxDistant; }
2.加上对应的两物体的半径,我这里是同类物体,所以我只加第一个物体的直径
float colliderx = tempSameMoveChild[0].GetComponent<MeshFilter>().mesh.bounds.size.x * tempSameMoveChild[0].localScale.x + maxdistantx; collidery = tempSameMoveChild[0].GetComponent<MeshFilter>().mesh.bounds.size.y * tempSameMoveChild[0].localScale.y + maxdistanty; float colliderz = tempSameMoveChild[0].GetComponent<MeshFilter>().mesh.bounds.size.z * tempSameMoveChild[0].localScale.z + maxdistantz;
3.赋值给父物体的boxcoollider
tempTransform.gameObject.GetComponent<BoxCollider>().size = new Vector3(colliderx, collidery, colliderz);
拓展1.当物体有相应的旋转时,这个值不对,应为mesh的bound获得是物体坐标获得的xyz,而boxcollider对应的空间坐标系。此时的解决方案-成上对应的矩阵变换
拓展2:当物体体积太小或距离太近的时候容易出错-暂时没找到对应的原因。-怀疑是浮点数的影响,可特殊处理