#region Copyright RenGuiYou. All rights reserved.
//=====================================================
// NeatlyFrameWork
// Author: RenGuiyou
// Feedback: mailto:750539605@qq.com
//=====================================================
#endregion
#if UNITY_EDITOR
using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;
namespace Neatly.UI
{
public class UIUtility
{
#region Image
public static bool IsEmptyImage(NImage img)
{
return img.sprite == null && string.IsNullOrEmpty(img.SpriteName) && img.GetMaterial() == null;
}
public static bool IsMissing(NImage img)
{
return img.sprite == null || string.IsNullOrEmpty(img.SpriteName) || img.GetMaterial() == null ||
img.SpriteName != img.sprite.name;
}
///
/// 设置Sprite
///
///
///
public static void SetImageSprite(NImage img, string spriteName)
{
Material mat;
Sprite sprite = FindImageSprite(spriteName, out mat);
SetImageSprite(img, sprite, mat);
}
public static void SetImageSprite(NImage img, Sprite sprite, Material material)
{
img.SetSprite(string.Empty, sprite);
img.SetMaterial(material);
if (sprite)
{
img.SpriteName = sprite.name;
}
}
///
/// 查找Sprite
///
///
///
///
public static Sprite FindImageSprite(string spriteName, out Material mat)
{
string path = "Assets/data/ui/atlas_tp";
if (Directory.Exists(path))
{
var files = Directory.GetFiles(path);
foreach (var fileName in files)
{
if (!fileName.EndsWith(".png")) continue;
var sprites = AssetDatabase.LoadAllAssetsAtPath(fileName);
foreach (var sprite in sprites)
{
if (!sprite.name.Equals(spriteName)) continue;
string textureName = fileName.Split('.')[0];
string atlasName = textureName.Substring(0, textureName.Length - 1) + "mat.mat";
mat = AssetDatabase.LoadAssetAtPath(atlasName);
return sprite as Sprite;
}
}
}
mat = null;
return null;
}
public static bool FixImageSprite(NImage img, string spriteName, string sourceName = "")
{
Material mat;
Sprite sp = FindImageSprite(spriteName, out mat);
if (sp == null)
{
Debug.LogError(string.Format("Sprite找不到:{0} Prefab:{1} Item:{2}", spriteName, sourceName, img.name));
return false;
}
SetImageSprite(img, sp, mat);
return true;
}
public static bool FixSpriteMiss(GameObject source)
{
bool isRepleace = false;
NImage[] images = source.GetComponentsInChildren(true);
foreach (var img in images)
{
if (img.UseSpritePacker) continue;
if (IsEmptyImage(img)) continue;
if (IsMissing(img))
{
string spriteName = null;
if (img.sprite != null)
{
spriteName = img.sprite.name;
}
else if (!string.IsNullOrEmpty(img.SpriteName))
{
spriteName = img.SpriteName;
}
if (string.IsNullOrEmpty(spriteName))
{
Debug.LogError(string.Format("[Error] Prefab:{0} Item:{1}", source.name, img.name));
}
FixImageSprite(img, img.SpriteName, source.name);
}
if (!string.IsNullOrEmpty(img.SpriteName) && (img.sprite == null))
{
Material mat;
Sprite sp = FindImageSprite(img.SpriteName, out mat);
if (sp == null)
{
StringBuilder sb = new StringBuilder();
sb.Append("[prefab]:")
.Append(source.name)
.Append(" [Item]:")
.Append(img.name)
.Append("[sprite]:")
.Append(img.SpriteName);
Debug.LogError(sb.ToString());
}
else
{
SetImageSprite(img, sp, mat);
isRepleace = true;
}
}
}
return isRepleace;
}
public static bool ImageToUseTexturePacker(GameObject source)
{
bool isRepleace = false;
NImage[] images = source.GetComponentsInChildren(true);
foreach (var img in images)
{
if (img.UseSpritePacker && img.sprite)
{
Material mat;
Sprite sp = FindImageSprite(img.sprite.name, out mat);
if (sp == null)
{
Debug.LogError("该Sprite可能未被打入图集请检查!!!"+img.sprite.name);
return isRepleace;
}
img.UseSpritePacker = false;
if (FixImageSprite(img, img.sprite.name, source.name))
{
isRepleace = true;
}
}
}
return isRepleace;
}
#endregion
}
}
#endif