Beispiel #1
0
        public static RotatableBounds GetLocalBound(GameObject gameObject, BoundsCreateOption option)
        {
            RotatableBounds rotatableBounds = new RotatableBounds();

            bool isCenterSettedByTransform = false;

            if (option == BoundsCreateOption.Transform || option == BoundsCreateOption.TransformAndMesh)
            {
                Transform[] transforms = gameObject.GetComponentsInChildren <Transform>();

                rotatableBounds           = new RotatableBounds(transforms[0].position, transforms[0].rotation);
                isCenterSettedByTransform = true;

                for (int i = 1; i < transforms.Length; i++)
                {
                    rotatableBounds.Encapsulate(transforms[i].position);
                }
            }

            if (option == BoundsCreateOption.Mesh || option == BoundsCreateOption.TransformAndMesh)
            {
                MeshFilter[] meshFilters = gameObject.GetComponentsInChildren <MeshFilter>();

                if (!isCenterSettedByTransform)
                {
                    if (meshFilters.Length == 0)
                    {
                        throw new BoundsCreationException("Object and it's childs not have MeshFilter component");
                    }
                    else
                    {
                        Vector3 boundsCenter = meshFilters[0].transform.TransformPoint(meshFilters[0].sharedMesh.bounds.center);
                        rotatableBounds = new RotatableBounds(boundsCenter, gameObject.transform.rotation);
                    }
                }

                for (int i = 0; i < meshFilters.Length; i++)
                {
                    Bounds meshBounds = meshFilters[i].sharedMesh.bounds;
                    meshBounds.center = meshFilters[i].transform.TransformPoint(meshBounds.center);
                    meshBounds.size   = Vector3.Scale(meshBounds.size, meshFilters[i].transform.lossyScale);

                    rotatableBounds.Encapsulate(new RotatableBounds(meshBounds, meshFilters[i].transform.rotation));
                }
            }

            return(rotatableBounds);
        }
Beispiel #2
0
        public static Bounds GetGlobalBounds(GameObject gameObject, BoundsCreateOption option)
        {
            Bounds bounds = new Bounds();

            bool isCenterSettedByTransform = false;

            if (option == BoundsCreateOption.Transform || option == BoundsCreateOption.TransformAndMesh)
            {
                Transform[] transforms = gameObject.GetComponentsInChildren <Transform>();

                bounds.center             = transforms[0].position;
                isCenterSettedByTransform = true;

                for (int i = 1; i < transforms.Length; i++)
                {
                    bounds.Encapsulate(transforms[i].position);
                }
            }

            if (option == BoundsCreateOption.Mesh || option == BoundsCreateOption.TransformAndMesh)
            {
                MeshRenderer[] meshRenderers = gameObject.GetComponentsInChildren <MeshRenderer>();

                if (!isCenterSettedByTransform)
                {
                    if (meshRenderers.Length == 0)
                    {
                        throw new BoundsCreationException("Object and it's childs not have MeshFilter component");
                    }
                    else
                    {
                        bounds = meshRenderers[0].bounds;
                    }
                }

                for (int i = isCenterSettedByTransform ? 0 : 1; i < meshRenderers.Length; i++)
                {
                    bounds.Encapsulate(meshRenderers[i].bounds);
                }
            }

            return(bounds);
        }