Пример #1
0
        public static void SwapRendererSpriteToMeshInHierarchy(Object target, bool isRoot = false)
        {
            if (PrefabUtil.TryGetMutableInstanceInHierarchy(target, out GameObject gameObject) &&
                PrefabUtil.TryGetSpriteRendererWithSprite(gameObject, out SpriteRenderer spriteRenderer) &&
                PrefabUtil.TryGetInternalAssetPath(spriteRenderer.sprite.texture, out string texturePath))
            {
                SpriteImportData import = new SpriteImportData(spriteRenderer.sprite, texturePath);
                if (import.HasMeshPrefab)
                {
                    GameObject meshPrefabInstance = (GameObject)PrefabUtility.InstantiatePrefab(import.MeshPrefab);
                    meshPrefabInstance.name     = gameObject.name;
                    meshPrefabInstance.layer    = gameObject.layer;
                    meshPrefabInstance.tag      = gameObject.tag;
                    meshPrefabInstance.isStatic = gameObject.isStatic;
                    meshPrefabInstance.SetActive(gameObject.activeSelf);
                    meshPrefabInstance.transform.SetParent(gameObject.transform.parent);
                    meshPrefabInstance.transform.localPosition = gameObject.transform.localPosition;
                    meshPrefabInstance.transform.localRotation = gameObject.transform.localRotation;
                    meshPrefabInstance.transform.localScale    = gameObject.transform.localScale;

                    foreach (Transform t in gameObject.transform)
                    {
                        if (PrefabUtil.IsMutablePrefab(t.gameObject))
                        {
                            t.SetParent(meshPrefabInstance.transform);
                        }
                    }

                    if (PrefabUtil.IsPrefabModeRoot(gameObject) || isRoot)
                    {
                        meshPrefabInstance.transform.SetParent(gameObject.transform);
                        Object.DestroyImmediate(spriteRenderer);
                    }
                    else
                    {
                        int index = gameObject.transform.GetSiblingIndex();
                        meshPrefabInstance.transform.SetSiblingIndex(index);
                        Object.DestroyImmediate(gameObject);
                    }

                    EditorUtility.SetDirty(meshPrefabInstance);
                }
            }
        }
Пример #2
0
        public static bool HasSpriteRendererAny(Object[] targets)
        {
            foreach (var target in targets)
            {
                if (PrefabUtil.TryGetMutableInstanceInHierarchy(target, out GameObject gameObject) &&
                    PrefabUtil.TryGetSpriteRendererWithSprite(gameObject, out SpriteRenderer spriteRenderer) &&
                    PrefabUtil.TryGetInternalAssetPath(spriteRenderer.sprite.texture, out string texturePath))
                {
                    SpriteImportData import = new SpriteImportData(spriteRenderer.sprite, texturePath);

                    if (import.HasMeshPrefab)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }