res-avatar-unity/Assets/_PoiyomiShaders/Scripts/poi-tools/Editor/ThirdPartyIncluder.cs

213 lines
9.2 KiB
C#
Raw Normal View History

2023-07-16 02:51:23 +00:00
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.Linq;
using System.IO;
namespace Poi.Tools
{
public class ThirdPartyIncluder : UnityEditor.Editor
{
private static List<ThirdPartyIncluderAsset> i_thirdPartyIncluders = new List<ThirdPartyIncluderAsset>();
public static List<ThirdPartyIncluderAsset> thirdPartyIncluders
{
get
{
if (i_thirdPartyIncluders.Count == 0)
{
i_thirdPartyIncluders = GetAllThirdPartyIncluders();
}
return i_thirdPartyIncluders;
}
}
private static string i_projectPath;
public static string projectPath
{
get
{
if (string.IsNullOrEmpty(i_projectPath))
{
i_projectPath = Path.GetDirectoryName(Application.dataPath);
}
return i_projectPath;
}
}
private static List<ThirdPartyIncluderAsset> GetAllThirdPartyIncluders()
{
return AssetDatabase.FindAssets($"t: {typeof(ThirdPartyIncluderAsset).Name}")
.Select(AssetDatabase.GUIDToAssetPath)
.Select(AssetDatabase.LoadAssetAtPath<ThirdPartyIncluderAsset>)
.ToList();
}
public static string GetPathFromGUIDIfNoSource(string sourcePath, string sourceGUID)
{
if (!File.Exists(sourcePath))
{
if (!string.IsNullOrEmpty(sourceGUID))
{
return AssetDatabase.GUIDToAssetPath(sourceGUID);
}
else
{
return string.Empty;
}
}
return sourcePath;
}
public static bool CopyIfGood(string sourcePath, string sourceGUID, string destinationPath)
{
try
{
sourcePath = GetPathFromGUIDIfNoSource(sourcePath, sourceGUID);
if (!File.Exists(sourcePath)) return false;
if (!File.Exists(destinationPath)) return false;
if (new System.IO.FileInfo(sourcePath).Length == new System.IO.FileInfo(destinationPath).Length) return false;
File.Copy(sourcePath, destinationPath, true);
return true;
}
catch (System.Exception e)
{
Debug.LogError($"{sourcePath}, {sourceGUID} or {destinationPath} are broken and threw exception: {e}");
}
return false;
}
public static bool WriteDefineIfExists(string sourcePath, string sourceGUID, string destinationPath, string defineName)
{
try
{
sourcePath = GetPathFromGUIDIfNoSource(sourcePath, sourceGUID);
if (!File.Exists(sourcePath)) return false;
if (!File.Exists(destinationPath)) return false;
if (new System.IO.FileInfo(destinationPath).Length > 4) return false;
File.WriteAllText(destinationPath, $"#define {defineName}");
return true;
}
catch (System.Exception e)
{
Debug.LogError($"{sourcePath}, {sourceGUID} or {destinationPath} are broken and threw exception: {e}");
}
return false;
}
private static void DoAllThirdPartyIncluders()
{
try
{
AssetDatabase.StartAssetEditing();
foreach (var thirdPartyIncluder in thirdPartyIncluders)
{
int i = 0;
foreach (var thirdPartyInclude in thirdPartyIncluder.ThirdPartyIncludes)
{
string sourcePath = Path.Combine(projectPath, thirdPartyInclude.sourcePath);
string destinationPath = Path.Combine(projectPath, thirdPartyInclude.destinationPath);
if (thirdPartyInclude.type == ThirdPartyIncluderAsset.ThirdPartyIncludeType.FileCopy)
{
if (CopyIfGood(sourcePath, thirdPartyInclude.sourceGUID, destinationPath))
{
i++;
}
}
else if (thirdPartyInclude.type == ThirdPartyIncluderAsset.ThirdPartyIncludeType.DefineIfExists)
{
if (WriteDefineIfExists(sourcePath, thirdPartyInclude.sourceGUID, destinationPath, thirdPartyInclude.defineName))
{
i++;
}
}
}
if (i > 0) Debug.Log($"[ThirdPartyIncluder] Found {thirdPartyIncluder.name} and did {i}/{thirdPartyIncluder.ThirdPartyIncludes.Length} actions", thirdPartyIncluder);
}
}
finally
{
AssetDatabase.StopAssetEditing();
AssetDatabase.Refresh();
}
}
[InitializeOnLoadMethod]
private static void OnProjectLoadedInEditor()
{
EditorApplication.delayCall += DoAllThirdPartyIncluders;
}
[UnityEditor.Callbacks.DidReloadScripts]
private static void DidReloadScripts()
{
EditorApplication.delayCall += DoAllThirdPartyIncluders;
}
[MenuItem("Poi/Tools/ThirdPartyIncluder/Refresh")]
private static void mi_ThirdPartyIncluderRefresh()
{
DoAllThirdPartyIncluders();
}
[MenuItem("Poi/Tools/ThirdPartyIncluder/Clean Destination Assets")]
public static void mi_ThirdPartyIncluderCleanDestAssets()
{
try
{
AssetDatabase.StartAssetEditing();
foreach (var thirdPartyIncluder in thirdPartyIncluders)
{
foreach (var thirdPartyInclude in thirdPartyIncluder.ThirdPartyIncludes)
{
string destinationPath = Path.Combine(projectPath, thirdPartyInclude.destinationPath);
File.WriteAllText(destinationPath, "");
}
}
}
finally
{
AssetDatabase.StopAssetEditing();
AssetDatabase.Refresh();
}
}
}
public class ThirdPartyIncluderAssetPostProcessor : AssetPostprocessor
{
#if UNITY_2021_2_OR_NEWER
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths, bool didDomainReload)
#else
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
#endif
{
try
{
AssetDatabase.StartAssetEditing();
foreach (var thirdPartyIncluder in ThirdPartyIncluder.thirdPartyIncluders)
{
int i = 0;
foreach (var thirdPartyInclude in thirdPartyIncluder.ThirdPartyIncludes)
{
foreach (string importedAsset in importedAssets)
{
if (thirdPartyInclude.sourcePath.Replace("\\", "/") == importedAsset)
{
string sourcePath = Path.Combine(ThirdPartyIncluder.projectPath, importedAsset);
string destinationPath = Path.Combine(ThirdPartyIncluder.projectPath, thirdPartyInclude.destinationPath);
if (thirdPartyInclude.type == ThirdPartyIncluderAsset.ThirdPartyIncludeType.FileCopy)
{
if (ThirdPartyIncluder.CopyIfGood(sourcePath, thirdPartyInclude.sourceGUID, destinationPath))
{
i++;
}
}
else if (thirdPartyInclude.type == ThirdPartyIncluderAsset.ThirdPartyIncludeType.DefineIfExists)
{
if (ThirdPartyIncluder.WriteDefineIfExists(sourcePath, thirdPartyInclude.sourceGUID, destinationPath, thirdPartyInclude.defineName))
{
i++;
}
}
}
}
}
if (i > 0) Debug.Log($"[ThirdPartyIncluder] Found {thirdPartyIncluder.name} and did {i}/{thirdPartyIncluder.ThirdPartyIncludes.Length} actions", thirdPartyIncluder);
}
}
finally
{
AssetDatabase.StopAssetEditing();
AssetDatabase.Refresh();
}
}
}
}