空物体下很多子物体的体积判断并附加对应的碰撞器

需求:在空物体下计算对应的空间体积并附加对应的碰撞器,这个其实是可以手动处理的,代码处理有些不严谨,有些误差挺大的要特殊处理

思路:由于我做的是多个同样物体的空间分布,所以可以直接取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:当物体体积太小或距离太近的时候容易出错-暂时没找到对应的原因。-怀疑是浮点数的影响,可特殊处理

posted @ 2017-05-31 13:57  carsonche  阅读(359)  评论(0编辑  收藏  举报