166 lines
4.3 KiB
C#
166 lines
4.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Security.Cryptography;
|
|
using PhxhSDK;
|
|
using Sirenix.OdinInspector;
|
|
using UnityEngine;
|
|
using Object = UnityEngine.Object;
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
#endif
|
|
|
|
/// <summary>
|
|
/// 记录所有场景/prefab后处理的数据
|
|
/// </summary>
|
|
[CreateAssetMenu(menuName = "Object后处理数据")]
|
|
public class PostProcessData : SerializedScriptableObject
|
|
{
|
|
[Serializable]
|
|
private class PostProcessPathData
|
|
{
|
|
public string originPath;
|
|
|
|
public string postProcessPath;
|
|
|
|
//public Object asset;
|
|
|
|
public string hashCode;
|
|
}
|
|
|
|
private const string PATH = "Assets/Scenes/ObjectPostProcessData.asset";
|
|
|
|
private static PostProcessData _instance;
|
|
|
|
public static PostProcessData Instance
|
|
{
|
|
get
|
|
{
|
|
if (_instance == null)
|
|
{
|
|
// Debug.Log("load Instance");
|
|
#if UNITY_EDITOR
|
|
_instance = UnityEditor.AssetDatabase.LoadAssetAtPath<PostProcessData>(PATH);
|
|
#else
|
|
_instance = AssetManager.Instance.LoadAsset<PostProcessData>(PATH);
|
|
#endif
|
|
// Debug.Log($"load finish isnull:{_instance == null}");
|
|
}
|
|
|
|
return _instance;
|
|
}
|
|
}
|
|
|
|
[ReadOnly]
|
|
[SerializeField]
|
|
[Searchable]
|
|
private Dictionary<string, PostProcessPathData> _allPostProcessPathData = new();
|
|
|
|
#region API
|
|
|
|
public string GetPostProcessedPath(string originPath)
|
|
{
|
|
if (!_allPostProcessPathData.TryGetValue(originPath, out var data))
|
|
{
|
|
return originPath;
|
|
}
|
|
|
|
return data.postProcessPath;
|
|
}
|
|
|
|
public bool TryGetPostProcessedPath(string originPath, out string postProcessPath)
|
|
{
|
|
if (!_allPostProcessPathData.TryGetValue(originPath, out var data))
|
|
{
|
|
postProcessPath = originPath;
|
|
return false;
|
|
}
|
|
|
|
postProcessPath = data.postProcessPath;
|
|
return true;
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
public void AddPostProcessData(Object asset, string postProcessPath)
|
|
{
|
|
if (!EditorUtility.IsPersistent(asset))
|
|
{
|
|
return;
|
|
}
|
|
|
|
EditorUtility.SetDirty(this);
|
|
var originPath = AssetDatabase.GetAssetPath(asset);
|
|
if (!_allPostProcessPathData.TryGetValue(originPath, out var data))
|
|
{
|
|
data = new PostProcessPathData();
|
|
_allPostProcessPathData.Add(originPath, data);
|
|
}
|
|
|
|
data.originPath = originPath;
|
|
data.postProcessPath = postProcessPath;
|
|
//data.asset = asset;
|
|
data.hashCode = CalculateMD5Hash(originPath);
|
|
}
|
|
|
|
public bool ShouldPostProcess(string assetPath)
|
|
{
|
|
if (!_allPostProcessPathData.TryGetValue(assetPath, out var savedData))
|
|
return true;
|
|
|
|
var newHashCode = CalculateMD5Hash(assetPath);
|
|
return newHashCode != savedData.hashCode;
|
|
}
|
|
|
|
public bool ShouldPostProcess(Object asset)
|
|
{
|
|
var path = AssetDatabase.GetAssetPath(asset);
|
|
return ShouldPostProcess(path);
|
|
}
|
|
#endif
|
|
|
|
#endregion
|
|
|
|
#if UNITY_EDITOR
|
|
private string CalculateMD5Hash(string filePath)
|
|
{
|
|
if (!File.Exists(filePath))
|
|
{
|
|
DebugUtil.LogError($"filePath is null!");
|
|
return null;
|
|
}
|
|
using (var md5 = MD5.Create())
|
|
{
|
|
var allText = File.ReadAllText(filePath);
|
|
allText = allText.Replace("\r\n", "\r");
|
|
byte[] hashBytes = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(allText));
|
|
return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if UNITY_EDITOR
|
|
[Button("重新计算Hash值(点击后可以防止后处理所有场景)")]
|
|
public void ReCalculateHashCode()
|
|
{
|
|
EditorUtility.SetDirty(this);
|
|
foreach (var kv in _allPostProcessPathData)
|
|
{
|
|
kv.Value.hashCode = CalculateMD5Hash(kv.Value.originPath);
|
|
}
|
|
|
|
AssetDatabase.SaveAssets();
|
|
}
|
|
|
|
[Button("重置Hash值(点击后可以后处理所有场景)")]
|
|
public void ReSetHashCode()
|
|
{
|
|
EditorUtility.SetDirty(this);
|
|
foreach (var kv in _allPostProcessPathData)
|
|
{
|
|
kv.Value.hashCode = "";
|
|
}
|
|
|
|
AssetDatabase.SaveAssets();
|
|
}
|
|
#endif
|
|
} |