#if false using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine; namespace Unity.Cinemachine.Editor { /// /// Useful class for setting script icons in one go, instead of setting them by hand one by one /// static class IconUtility { static Dictionary s_IconCache = new(); static Texture2D LoadAssetAtPathCached(string path) { if (!s_IconCache.ContainsKey(path)) s_IconCache.Add(path, AssetDatabase.LoadAssetAtPath(path)); return s_IconCache[path]; } /// Checks if CinemachineCamera script has the correct icon or not. /// True, when icons don't match. False, otherwise. public static bool DoIconsNeedToBeUpdated() { var cmCameraPath = CinemachineCore.kPackageRoot + "/Runtime/Behaviours/CinemachineCamera.cs"; var monoImporter = AssetImporter.GetAtPath(cmCameraPath) as MonoImporter; if (monoImporter == null) return false; var iconPath = GetIconPathForScript(monoImporter.GetScript()); if (iconPath != string.Empty) { var icon = LoadAssetAtPathCached(iconPath); var scriptIcon = monoImporter.GetIcon(); return icon != scriptIcon; } return false; } /// Updates all icons of cinemachine runtime scripts according to the current theme. public static void UpdateIcons() { var cmScriptPaths = GetAllCinemachineRuntimeScripts(); foreach (var cmScriptPath in cmScriptPaths) { var monoImporter = AssetImporter.GetAtPath(cmScriptPath) as MonoImporter; if (monoImporter == null) continue; var iconPath = GetIconPathForScript(monoImporter.GetScript()); if (iconPath != string.Empty) { var icon = LoadAssetAtPathCached(iconPath); monoImporter.SetIcon(icon); monoImporter.SaveAndReimport(); } } // local function static List GetAllCinemachineRuntimeScripts() { var cmRuntimeScripts = new List(); var directories = Directory.GetDirectories(CinemachineCore.kPackageRoot + "/Runtime"); foreach (var directory in directories) cmRuntimeScripts.AddRange(Directory.GetFiles(directory, "*.cs")); return cmRuntimeScripts; } } static string GetIconPathForScript(MonoScript monoScript) { var scriptClass = monoScript.GetClass(); if (scriptClass == null) return string.Empty; if (scriptClass.IsSubclassOf(typeof(CinemachineExtension))) return CinemachineCore.kPackageRoot + "/Editor/EditorResources/Icons/CmExtension@256.png"; if (scriptClass.IsSubclassOf(typeof(CinemachineComponentBase))) return CinemachineCore.kPackageRoot + "/Editor/EditorResources/Icons/CmComponent@256.png"; if (scriptClass == typeof(CinemachineSplineRoll) || scriptClass == typeof(CinemachineSplineCart)) return CinemachineCore.kPackageRoot + "/Editor/EditorResources/Icons/CmTrack@256.png"; if (scriptClass.IsSubclassOf(typeof(CinemachineVirtualCameraBase)) || scriptClass == typeof(CinemachineBrain)) return CinemachineCore.kPackageRoot + "/Editor/EditorResources/Icons/CmCamera@256.png"; return string.Empty; } [MenuItem("Cinemachine/Darken Icons")] static void DarkenIcons() { var icons = GetAllIcons(); foreach (var path in icons) { var icon = AssetDatabase.LoadAssetAtPath(path); for (int m = 0; m < icon.mipmapCount; ++m) { var pixels = icon.GetPixels(m); for (int i = 0; i < pixels.Length; ++i) { var pixel = pixels[i]; Color.RGBToHSV(pixel, out var h, out var s, out var v); if (s < 0.01f) // modify grey only pixels[i] = Color.Lerp(pixel, new Color(0, 0, 0, pixel.a), 0.2f); } icon.SetPixels(pixels, m); } var bytes = icon.EncodeToPNG(); File.WriteAllBytes(path, bytes); } // local function static string[] GetAllIcons() { return new[] { CinemachineCore.kPackageRoot + "/Editor/EditorResources/Icons/CmExtension@256.png", CinemachineCore.kPackageRoot + "/Editor/EditorResources/Icons/CmComponent@256.png", CinemachineCore.kPackageRoot + "/Editor/EditorResources/Icons/CmTrack@256.png", CinemachineCore.kPackageRoot + "/Editor/EditorResources/Icons/CmCamera@256.png" }; } } } } #endif