SimpleSpritePackerEditor.SPTools.ReplaceReferences C# (CSharp) Method

ReplaceReferences() public static method

Replaces all the references in the supplied array (does not work with internal properties).
public static ReplaceReferences ( Component components, Sprite find, Sprite replaceWith, bool spriteRenderersOnly ) : int
components UnityEngine.Component
find UnityEngine.Sprite Find.
replaceWith UnityEngine.Sprite Replace with.
spriteRenderersOnly bool If set to true sprite renderers only.
return int
        public static int ReplaceReferences(Component[] components, Sprite find, Sprite replaceWith, bool spriteRenderersOnly)
        {
            if (components == null || components.Length == 0)
                return 0;

            int count = 0;
            foreach (Object comp in components)
            {
                // Handle sprite renderers differently
                if (comp is SpriteRenderer)
                {
                    if ((comp as SpriteRenderer).sprite == find)
                    {
                        (comp as SpriteRenderer).sprite = replaceWith;
                        count++;
                    }
                }
                else if (comp is UnityEngine.UI.Image)
                {
                    // If this component is not a sprite renderer
                    if (spriteRenderersOnly)
                        continue;

                    if ((comp as UnityEngine.UI.Image).sprite == find)
                    {
                        (comp as UnityEngine.UI.Image).sprite = replaceWith;
                        count++;
                    }
                }
                else if (comp is UnityEngine.UI.Selectable)
                {
                    // If this component is not a sprite renderer
                    if (spriteRenderersOnly)
                        continue;

                    UnityEngine.UI.Selectable selectable = (comp as UnityEngine.UI.Selectable);
                    UnityEngine.UI.SpriteState ss = selectable.spriteState;

                    if (ss.highlightedSprite == find)
                    {
                        ss.highlightedSprite = replaceWith;
                        count++;
                    }
                    if (ss.pressedSprite == find)
                    {
                        ss.pressedSprite = replaceWith;
                        count++;
                    }
                    if (ss.disabledSprite == find)
                    {
                        ss.disabledSprite = replaceWith;
                        count++;
                    }

                    selectable.spriteState = ss;
                }
                else
                {
                    // If this component is not a sprite renderer
                    if (spriteRenderersOnly)
                        continue;

                    // Get the fileds info
                    FieldInfo[] fields = comp.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);

                    foreach (FieldInfo fieldInfo in fields)
                    {
                        if (fieldInfo == null)
                            continue;

                        object fieldValue = fieldInfo.GetValue(comp);

                        // Handle arrays
                        if (fieldInfo.FieldType.IsArray)
                        {
                            var fieldValueArray = fieldValue as System.Array;

                            if (fieldValueArray == null || fieldValueArray.GetType() != typeof(Sprite[]))
                                continue;

                            bool changed = false;
                            System.Array newArray = new System.Array[fieldValueArray.Length];
                            fieldValueArray.CopyTo(newArray, 0);

                            for (int i = 0; i < newArray.Length; i++)
                            {
                                object element = newArray.GetValue(i);

                                if (element != null && element.GetType() == typeof(Sprite))
                                {
                                    Sprite o = element as Sprite;

                                    // Check if the value is what we are looking for
                                    if (o == find)
                                    {
                                        newArray.SetValue((replaceWith as object), i);
                                        changed = true;
                                        count++;
                                    }
                                }
                            }

                            // Repalce the array
                            if (changed)
                            {
                                fieldInfo.SetValue(comp, newArray);
                            }
                        }
                        // Handle structs
                        else if (fieldInfo.FieldType.IsValueType && !fieldInfo.FieldType.IsEnum && !fieldInfo.IsLiteral)
                        {
                            FieldInfo[] structFields = fieldInfo.FieldType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

                            foreach (FieldInfo structFieldInfo in structFields)
                            {
                                if (structFieldInfo == null)
                                    continue;

                                if (structFieldInfo.FieldType == typeof(Sprite))
                                {
                                    Sprite structFieldValue = structFieldInfo.GetValue(fieldValue) as Sprite;

                                    // Check if the value is what we are looking for
                                    if (structFieldValue == find)
                                    {
                                        // Replace
                                        structFieldInfo.SetValue(fieldValue, (replaceWith as object));
                                        count++;
                                    }
                                }
                            }

                            fieldInfo.SetValue(comp, fieldValue);
                        }
                        // Handle direct sprites
                        else if (fieldInfo.FieldType == typeof(Sprite))
                        {
                            // Check if the value is what we are looking for
                            if ((fieldValue as Sprite) == find)
                            {
                                // Replace
                                fieldInfo.SetValue(comp, (replaceWith as object));
                                count++;
                            }
                        }
                    }
                }

                if (PrefabUtility.GetPrefabType((comp as Component).gameObject) != PrefabType.None)
                    EditorUtility.SetDirty((comp as Component));
            }

            return count;
        }

Usage Example

Beispiel #1
0
        /// <summary>
        /// Replaces all the references in all scenes.
        /// </summary>
        /// <param name="spriteInfoList">Sprite info list.</param>
        /// <param name="spriteRenderersOnly">If set to <c>true</c> sprite renderers only.</param>
        /// <param name="skipCurrent">If set to <c>true</c> skip current scene.</param>
        /// <returns>The replaced references count.</returns>
        public static int ReplaceReferencesInAllScenes(List <SPSpriteInfo> spriteInfoList, SPReferenceReplacerWindow.ReplaceMode replaceMode, bool spriteRenderersOnly, bool skipCurrent)
        {
            int  count        = 0;
            bool replaceAtlas = (replaceMode == SPReferenceReplacerWindow.ReplaceMode.AtlasWithSource);

            // Grab the current scene name
            //string startingScene = EditorApplication.currentScene;

            Scene  scene         = EditorSceneManager.GetActiveScene();
            string startingScene = scene.ToString();

            // Get all scene names
            string[] sceneNames = SPTools.GetAllScenesNames();

            if (sceneNames.Length == 0)
            {
                return(count);
            }

            foreach (string sceneName in sceneNames)
            {
                // Check if we should skip the scene
                if (skipCurrent && sceneName.Equals(startingScene))
                {
                    continue;
                }

                // Try opening the scene
                //if (EditorApplication.OpenScene(sceneName))
                Scene _scene = EditorSceneManager.OpenScene(sceneName);
                if (EditorSceneManager.SetActiveScene(_scene))
                {
                    Component[] comps = Object.FindObjectsOfType <Component>();

                    foreach (SPSpriteInfo spriteInfo in spriteInfoList)
                    {
                        if (spriteInfo.source == null || !(spriteInfo.source is Sprite) || spriteInfo.targetSprite == null)
                        {
                            continue;
                        }

                        count += SPTools.ReplaceReferences(comps, (replaceAtlas ? spriteInfo.targetSprite : (spriteInfo.source as Sprite)), (replaceAtlas ? (spriteInfo.source as Sprite) : spriteInfo.targetSprite), spriteRenderersOnly);
                    }

                    //EditorApplication.SaveScene();
                    Scene __scene = EditorSceneManager.GetActiveScene();
                    EditorSceneManager.SaveScene(__scene);
                }
            }

            // Load back the original scene
            //EditorApplication.OpenScene(sceneName)
            EditorSceneManager.OpenScene(startingScene);

            // Return the replaced references count
            return(count);
        }
All Usage Examples Of SimpleSpritePackerEditor.SPTools::ReplaceReferences