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;
}