baobao
8/4/2019 - 6:26 PM

SpriteMissingChecker.cs

using System.IO;
using System.Linq;
using UnityEngine;
using UnityEditor;

/// <summary>
/// SpriteRendererのSpriteがnullだったら背景を赤くするEditor拡張
/// </summary>
public class SpriteMissingChecker
{
    [InitializeOnLoadMethod]
    private static void AddHierarchyItemOnGUI()
    {
        EditorApplication.hierarchyWindowItemOnGUI -= HierarchyWindowItemOnGUI;
        EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI;

        EditorApplication.projectWindowItemOnGUI -= ProjectWindowItemOnGUI;
        EditorApplication.projectWindowItemOnGUI += ProjectWindowItemOnGUI;
    }

    /// <summary>
    /// ProjectWindow OnGUI
    /// </summary>
    private static void ProjectWindowItemOnGUI(string guid, Rect selectionRect)
    {
        var path = AssetDatabase.GUIDToAssetPath(guid);
        if (Directory.Exists(path) ||
            path.IndexOf(".prefab") < 0)
        {
            return;
        }

        // prefabのみ対象
        var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);
        if (IsValid(prefab))
        {
            Draw(selectionRect);
        }
    }

    /// <summary>
    /// HierarchyWindow OnGUI
    /// </summary>
    private static void HierarchyWindowItemOnGUI(int instanceID, Rect selectionRect)
    {
        var gameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
        if (gameObject == null)
        {
            return;
        }

        if (IsValid(gameObject))
        {
            Draw(selectionRect);
        }
    }

    /// <summary>
    /// 見た目の処理
    /// 背景を赤くする
    /// </summary>
    static void Draw(Rect rect)
    {
        var bg = GUI.backgroundColor;
        GUI.backgroundColor = Color.red;
        GUI.Box(rect, "");
        GUI.backgroundColor = bg;
    }

    /// <summary>
    /// 子階層全てのSpriteRendererのSpriteにnullが存在したらtrue
    /// </summary>
    static bool IsValid(GameObject go)
    {
        var arr = go.GetComponentsInChildren<SpriteRenderer>();
        return arr.Any(x => x.sprite == null);
    }
}