public static ReplaceReferences ( |
||
components | ||
find | Find. | |
replaceWith | Replace with. | |
spriteRenderersOnly | bool | If set to |
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;
}
/// <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); }