示例#1
0
        public static void AttachColliderWiddestSize(string searchRootDirectory,
                                                     ThreedObjectControlEditor.FilterMeshRendererTypes filterMeshRendererTypes = ThreedObjectControlEditor.FilterMeshRendererTypes.OnlySkinnedMeshRenderer,
                                                     ThreedObjectControlEditor.AttachColliderTypes attachColliderTypes         = ThreedObjectControlEditor.AttachColliderTypes.BoxCollider)
        {
            List <string> pathes = FindAllThreedSearchDirectory(searchRootDirectory, SearchThreedObjectFileExtention.prefab);
            Dictionary <GameObject, KeyValuePair <Vector3, Vector3> > objectMinMaxPositions = new Dictionary <GameObject, KeyValuePair <Vector3, Vector3> >();

            for (int i = 0; i < pathes.Count; ++i)
            {
                string     path = pathes[i];
                GameObject go   = AssetDatabase.LoadAssetAtPath <GameObject>(path);
                if (go == null)
                {
                    continue;
                }
                List <Renderer> renderers = LoadMeshRenderers(go, filterMeshRendererTypes);
                if (renderers == null || renderers.Count <= 0)
                {
                    continue;
                }
                Vector3 minimumPosition  = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
                Vector3 maximumPosition  = new Vector3(float.MinValue, float.MinValue, float.MinValue);
                bool    isAttachCollider = false;
                for (int j = 0; j < renderers.Count; ++j)
                {
                    isAttachCollider = true;

                    Bounds bounds = renderers[j].bounds;
                    if (minimumPosition.x > bounds.center.x - bounds.extents.x)
                    {
                        minimumPosition.x = bounds.center.x - bounds.extents.x;
                    }
                    if (minimumPosition.y > bounds.center.y - bounds.extents.y)
                    {
                        minimumPosition.y = bounds.center.y - bounds.extents.y;
                    }
                    if (minimumPosition.z > bounds.center.z - bounds.extents.z)
                    {
                        minimumPosition.z = bounds.center.z - bounds.extents.z;
                    }
                    if (maximumPosition.x < bounds.center.x + bounds.extents.x)
                    {
                        maximumPosition.x = bounds.center.x + bounds.extents.x;
                    }
                    if (maximumPosition.y < bounds.center.y + bounds.extents.y)
                    {
                        maximumPosition.y = bounds.center.y + bounds.extents.y;
                    }
                    if (maximumPosition.z < bounds.center.z + bounds.extents.z)
                    {
                        maximumPosition.z = bounds.center.z + bounds.extents.z;
                    }
                }
                if (isAttachCollider)
                {
                    objectMinMaxPositions.Add(go, new KeyValuePair <Vector3, Vector3>(minimumPosition, maximumPosition));
                }
            }

            AssetDatabase.StartAssetEditing();
            foreach (KeyValuePair <GameObject, KeyValuePair <Vector3, Vector3> > objectMinMaxPosition in objectMinMaxPositions)
            {
                GameObject go = objectMinMaxPosition.Key;
                KeyValuePair <Vector3, Vector3> minmaxPosition = objectMinMaxPosition.Value;
                if (attachColliderTypes == ThreedObjectControlEditor.AttachColliderTypes.BoxCollider)
                {
                    BoxCollider boxCollider = go.GetComponent <BoxCollider>();
                    if (boxCollider.Equals(null))
                    {
                        boxCollider = go.AddComponent <BoxCollider>();
                    }
                    boxCollider.center = (minmaxPosition.Value + minmaxPosition.Key) / 2;
                    boxCollider.size   = (minmaxPosition.Value - minmaxPosition.Key);
                }
                else if (attachColliderTypes == ThreedObjectControlEditor.AttachColliderTypes.CapsuleCollider)
                {
                    CapsuleCollider capsuleCollider = go.GetComponent <CapsuleCollider>();
                    if (capsuleCollider.Equals(null))
                    {
                        capsuleCollider = go.AddComponent <CapsuleCollider>();
                    }
                    capsuleCollider.center = (minmaxPosition.Value + minmaxPosition.Key) / 2;
                    capsuleCollider.height = Mathf.Abs(minmaxPosition.Value.y - minmaxPosition.Key.y);
                    Vector3 diff = minmaxPosition.Value - minmaxPosition.Key;
                    capsuleCollider.radius = Mathf.Max(Mathf.Max(Mathf.Abs(diff.x / 2), Mathf.Abs(diff.y / 2)), Mathf.Abs(diff.z / 2));
                }
                else if (attachColliderTypes == ThreedObjectControlEditor.AttachColliderTypes.SphereCollider)
                {
                    SphereCollider sphereCollider = go.GetComponent <SphereCollider>();
                    if (sphereCollider.Equals(null))
                    {
                        sphereCollider = go.AddComponent <SphereCollider>();
                    }
                    sphereCollider.center = (minmaxPosition.Value + minmaxPosition.Key) / 2;
                    Vector3 diff = minmaxPosition.Value - minmaxPosition.Key;
                    sphereCollider.radius = Mathf.Max(Mathf.Abs(diff.x / 2), Mathf.Abs(diff.z / 2));
                }
                else if (attachColliderTypes == ThreedObjectControlEditor.AttachColliderTypes.MeshCollider)
                {
                    MeshCollider meshCollider = go.GetComponent <MeshCollider>();
                    if (meshCollider.Equals(null))
                    {
                        meshCollider = go.AddComponent <MeshCollider>();
                    }
                }
            }
            AssetDatabase.StopAssetEditing();
            foreach (KeyValuePair <GameObject, KeyValuePair <Vector3, Vector3> > objectMinMaxPosition in objectMinMaxPositions)
            {
                EditorUtility.SetDirty(objectMinMaxPosition.Key);
            }
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
            Debug.Log("Attach and edit the widdest colliders:" + objectMinMaxPositions.Count);
        }
示例#2
0
        public static void AttachColliderMaxVolumn(string searchRootDirectory,
                                                   ThreedObjectControlEditor.FilterMeshRendererTypes filterMeshRendererTypes = ThreedObjectControlEditor.FilterMeshRendererTypes.OnlySkinnedMeshRenderer,
                                                   ThreedObjectControlEditor.AttachColliderTypes attachColliderTypes         = ThreedObjectControlEditor.AttachColliderTypes.BoxCollider)
        {
            List <string> pathes = FindAllThreedSearchDirectory(searchRootDirectory, SearchThreedObjectFileExtention.prefab);
            Dictionary <GameObject, Renderer> objectRenderers = new Dictionary <GameObject, Renderer>();

            for (int i = 0; i < pathes.Count; ++i)
            {
                string     path = pathes[i];
                GameObject go   = AssetDatabase.LoadAssetAtPath <GameObject>(path);
                if (go == null)
                {
                    continue;
                }
                List <Renderer> renderers = LoadMeshRenderers(go, filterMeshRendererTypes);
                if (renderers == null || renderers.Count <= 0)
                {
                    continue;
                }
                float maxVolumn   = float.MinValue;
                int   targetIndex = -1;
                for (int j = 0; j < renderers.Count; ++j)
                {
                    Vector3 cubeSize = renderers[j].bounds.extents * 2;
                    if (maxVolumn < (cubeSize.x * cubeSize.y * cubeSize.z))
                    {
                        maxVolumn   = (cubeSize.x * cubeSize.y * cubeSize.z);
                        targetIndex = j;
                    }
                }
                if (targetIndex < 0)
                {
                    continue;
                }
                objectRenderers.Add(go, renderers[targetIndex]);
            }
            AssetDatabase.StartAssetEditing();
            foreach (KeyValuePair <GameObject, Renderer> objectRenderer in objectRenderers)
            {
                GameObject go           = objectRenderer.Key;
                Renderer   meshRenderer = objectRenderer.Value;
                Bounds     bounds       = meshRenderer.bounds;
                if (attachColliderTypes == ThreedObjectControlEditor.AttachColliderTypes.BoxCollider)
                {
                    BoxCollider boxCollider = go.GetComponent <BoxCollider>();
                    if (boxCollider.Equals(null))
                    {
                        boxCollider = go.AddComponent <BoxCollider>();
                    }
                    boxCollider.center = bounds.center;
                    boxCollider.size   = bounds.extents * 2;
                }
                else if (attachColliderTypes == ThreedObjectControlEditor.AttachColliderTypes.CapsuleCollider)
                {
                    CapsuleCollider capsuleCollider = go.GetComponent <CapsuleCollider>();
                    if (capsuleCollider.Equals(null))
                    {
                        capsuleCollider = go.AddComponent <CapsuleCollider>();
                    }
                    capsuleCollider.center = bounds.center;
                    capsuleCollider.height = Mathf.Abs(bounds.extents.y * 2);
                    capsuleCollider.radius = Mathf.Max(Mathf.Abs(bounds.extents.x), Mathf.Abs(bounds.extents.z));
                }
                else if (attachColliderTypes == ThreedObjectControlEditor.AttachColliderTypes.SphereCollider)
                {
                    SphereCollider sphereCollider = go.GetComponent <SphereCollider>();
                    if (sphereCollider.Equals(null))
                    {
                        sphereCollider = go.AddComponent <SphereCollider>();
                    }
                    sphereCollider.center = bounds.center;
                    sphereCollider.radius = Mathf.Max(Mathf.Max(Mathf.Abs(bounds.extents.x), Mathf.Abs(bounds.extents.y)), Mathf.Abs(bounds.extents.z));
                }
                else if (attachColliderTypes == ThreedObjectControlEditor.AttachColliderTypes.MeshCollider)
                {
                    MeshCollider meshCollider = go.GetComponent <MeshCollider>();
                    if (meshCollider.Equals(null))
                    {
                        meshCollider = go.AddComponent <MeshCollider>();
                    }
                }
            }

            AssetDatabase.StopAssetEditing();
            foreach (KeyValuePair <GameObject, Renderer> objectMeshRenderer in objectRenderers)
            {
                EditorUtility.SetDirty(objectMeshRenderer.Key);
            }
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
            Debug.Log("Attach and edit the max volumn colliders:" + objectRenderers.Count);
        }