parent
4f2a1ea040
commit
68c238574e
|
|
@ -1,3 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 3b9135b66ef641b2ae8a7c85b7d1c0cb
|
||||
timeCreated: 1754625537
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: ea249a74bb424aeab5b1f13faf078ae2
|
||||
timeCreated: 1754626327
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
namespace ResCheck.MaterialCheck.Data
|
||||
{
|
||||
public class ShaderCollectInfo
|
||||
{
|
||||
public readonly string shaderName;
|
||||
public int referCount { get; private set; }
|
||||
public List<string> materialPaths = new List<string>();
|
||||
|
||||
public bool isDisplayAllMaterials = false;
|
||||
|
||||
public ShaderCollectInfo(string shaderName)
|
||||
{
|
||||
this.shaderName = shaderName;
|
||||
referCount = 0;
|
||||
}
|
||||
|
||||
public void AddMaterialPath(string materialPath)
|
||||
{
|
||||
if (materialPaths.Contains(materialPath))
|
||||
{
|
||||
Debug.LogError("材质路径已存在: " + materialPath);
|
||||
return;
|
||||
}
|
||||
materialPaths.Add(materialPath);
|
||||
referCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: df35dc8a31404016aaadaaad79c6f86c
|
||||
timeCreated: 1754626420
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
using System;
|
||||
namespace ResCheck.MaterialCheck.Data
|
||||
{
|
||||
[Serializable]
|
||||
public class ShaderRequireData
|
||||
{
|
||||
public string shaderName;
|
||||
public string note;
|
||||
public long createTime;
|
||||
|
||||
[NonSerialized]
|
||||
public bool isEditing = false;
|
||||
|
||||
public EShaderRequireType requireType = EShaderRequireType.None;
|
||||
}
|
||||
|
||||
public enum EShaderRequireType
|
||||
{
|
||||
// 无要求
|
||||
None = 0,
|
||||
// 推荐
|
||||
Recommend = 1,
|
||||
// 禁止
|
||||
Forbidden = 2,
|
||||
}
|
||||
}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: d115616046e84ae38b7f4dee785076e6
|
||||
timeCreated: 1754627758
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
namespace ResCheck.MaterialCheck.Data
|
||||
{
|
||||
[Serializable]
|
||||
public class ShaderRequireInfo
|
||||
{
|
||||
public List<ShaderRequireData> requireData = new List<ShaderRequireData>();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 805366098f3142c09076f2ebee306e37
|
||||
timeCreated: 1754629366
|
||||
|
|
@ -1,284 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Gameplay.Utils;
|
||||
using ResCheck.MaterialCheck.Data;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace ResCheck.MaterialCheck
|
||||
{
|
||||
public class MaterialCheckWindow : EditorWindow
|
||||
{
|
||||
|
||||
[MenuItem("Tools/资源检查/材质检查", false, (int)NLDMenuID.MaterialCheck)]
|
||||
public static void ShowWindow()
|
||||
{
|
||||
var window = GetWindow<MaterialCheckWindow>();
|
||||
window.titleContent = new GUIContent("材质检查");
|
||||
window.Show();
|
||||
}
|
||||
|
||||
private static string _settingsPath = "Assets/Editor/Settings/MaterialCheckSettings.json";
|
||||
|
||||
private ShaderRequireInfo _requireInfo;
|
||||
private Vector2 _scrollPosRequireData;
|
||||
private bool _displayAllRequireData = false;
|
||||
|
||||
private Dictionary<string, ShaderCollectInfo> _shaderCollect = new Dictionary<string, ShaderCollectInfo>();
|
||||
private Vector2 _scrollPosShaderCollect;
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
_shaderCollect.Clear();
|
||||
_LoadRequireData();
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
GUILayout.BeginHorizontal();
|
||||
_displayAllRequireData = EditorGUILayout.Foldout(_displayAllRequireData, "共有 " + _requireInfo.requireData.Count + " 条着色器要求", true);
|
||||
if (GUILayout.Button("新增", GUILayout.Width(80)))
|
||||
{
|
||||
_displayAllRequireData = true;
|
||||
_AddRequireData();
|
||||
}
|
||||
if (GUILayout.Button("刷新", GUILayout.Width(80)))
|
||||
{
|
||||
_LoadRequireData();
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
if (_displayAllRequireData)
|
||||
{
|
||||
_DisplayRequireData();
|
||||
}
|
||||
EditorGUILayout.Space();
|
||||
|
||||
if (GUILayout.Button("扫描所有材质", GUILayout.Height(30)))
|
||||
{
|
||||
_DoCheck();
|
||||
}
|
||||
|
||||
_DisplayShaderCollectInfo();
|
||||
}
|
||||
|
||||
private void _DisplayRequireData()
|
||||
{
|
||||
if (_requireInfo.requireData.Count == 0)
|
||||
{
|
||||
EditorGUILayout.HelpBox("没有任何着色器要求,请添加新的要求。", MessageType.Info);
|
||||
return;
|
||||
}
|
||||
for (int i = _requireInfo.requireData.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var requireData = _requireInfo.requireData[i];
|
||||
_DisplaySingleRequireData(requireData);
|
||||
}
|
||||
}
|
||||
|
||||
private void _DisplaySingleRequireData(ShaderRequireData requireData)
|
||||
{
|
||||
if (requireData == null) return;
|
||||
|
||||
GUILayout.BeginVertical("box");
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
|
||||
GUILayout.Label("着色器要求: ", GUILayout.Width(80));
|
||||
GUILayout.Label(requireData.shaderName);
|
||||
requireData.requireType = (EShaderRequireType)EditorGUILayout.EnumPopup("", requireData.requireType, GUILayout.Width(100));
|
||||
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
GUILayout.Label("备注:" , GUILayout.Width(60));
|
||||
if (requireData.isEditing)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
GUILayout.Label(requireData.note);
|
||||
}
|
||||
GUILayout.Label("创建时间: " + (requireData.createTime > 0 ? new DateTime(requireData.createTime).ToString("yyyy-MM-dd HH:mm:ss") : "未设置"), GUILayout.Width(200));
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("删除"))
|
||||
{
|
||||
if (EditorUtility.DisplayDialog("确认删除", "是否确认删除此着色器要求: " + requireData.shaderName, "确认", "取消"))
|
||||
{
|
||||
_requireInfo.requireData.Remove(requireData);
|
||||
_SaveRequireData();
|
||||
}
|
||||
}
|
||||
if (requireData.isEditing)
|
||||
{
|
||||
if (GUILayout.Button("保存"))
|
||||
{
|
||||
requireData.isEditing = false;
|
||||
_SaveRequireData();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GUILayout.Button("编辑"))
|
||||
{
|
||||
requireData.isEditing = true;
|
||||
}
|
||||
}
|
||||
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.EndVertical();
|
||||
}
|
||||
|
||||
private void _AddRequireData()
|
||||
{
|
||||
var newRequire = new ShaderRequireData();
|
||||
newRequire.createTime = DateTime.Now.Ticks;
|
||||
_requireInfo.requireData.Add(newRequire);
|
||||
_SaveRequireData();
|
||||
}
|
||||
|
||||
private void _LoadRequireData()
|
||||
{
|
||||
var realFilePath = PathEx.TransformAssetToRealPath(_settingsPath);
|
||||
if (File.Exists(realFilePath))
|
||||
{
|
||||
var json = File.ReadAllText(realFilePath);
|
||||
try
|
||||
{
|
||||
var requireInfo = JsonUtility.FromJson<ShaderRequireInfo>(json);
|
||||
if (requireInfo != null)
|
||||
{
|
||||
_requireInfo = requireInfo;
|
||||
Debug.Log("材质检查设置文件加载成功: " + realFilePath);
|
||||
}
|
||||
} catch (Exception e)
|
||||
{
|
||||
Debug.LogError("加载材质检查设置文件失败: " + realFilePath + "\n错误信息: " + e.Message);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_requireInfo = new ShaderRequireInfo();
|
||||
_SaveRequireData();
|
||||
Debug.Log("材质检查设置文件不存在,创建默认设置文件: " + realFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
private void _SaveRequireData()
|
||||
{
|
||||
var json = JsonUtility.ToJson(_requireInfo, true);
|
||||
var realFilePath = PathEx.TransformAssetToRealPath(_settingsPath);
|
||||
File.WriteAllText(realFilePath, json);
|
||||
}
|
||||
|
||||
private void _DisplayShaderCollectInfo()
|
||||
{
|
||||
if (_shaderCollect == null || _shaderCollect.Count == 0)
|
||||
{
|
||||
EditorGUILayout.HelpBox("没有找到任何材质信息,请先扫描材质。", MessageType.Info);
|
||||
return;
|
||||
}
|
||||
|
||||
_scrollPosShaderCollect = EditorGUILayout.BeginScrollView(_scrollPosShaderCollect, GUILayout.Height(400));
|
||||
GUILayout.Label("共有 " + _shaderCollect.Count + " 种着色器", EditorStyles.boldLabel);
|
||||
foreach (var kvp in _shaderCollect)
|
||||
{
|
||||
var shaderCollectInfo = kvp.Value;
|
||||
_DisplayShaderCollectInfo(shaderCollectInfo);
|
||||
}
|
||||
EditorGUILayout.EndScrollView();
|
||||
}
|
||||
|
||||
private void _DisplayShaderCollectInfo(ShaderCollectInfo shaderCollectInfo)
|
||||
{
|
||||
if (shaderCollectInfo == null) return;
|
||||
|
||||
var displayName = "着色器名称: " + shaderCollectInfo.shaderName + " (引用次数: " + shaderCollectInfo.referCount + ")";
|
||||
if (shaderCollectInfo.referCount == 0)
|
||||
{
|
||||
GUILayout.Label(displayName, EditorStyles.boldLabel);
|
||||
}
|
||||
else
|
||||
{
|
||||
shaderCollectInfo.isDisplayAllMaterials = EditorGUILayout.Foldout(shaderCollectInfo.isDisplayAllMaterials, displayName, true);
|
||||
if (shaderCollectInfo.isDisplayAllMaterials)
|
||||
{
|
||||
foreach (var materialPath in shaderCollectInfo.materialPaths)
|
||||
{
|
||||
_DisplayMaterial(materialPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void _DisplayMaterial(string materialPath)
|
||||
{
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("定位", GUILayout.Width(60)))
|
||||
{
|
||||
// 定位到材质文件
|
||||
EditorGUIUtility.PingObject(AssetDatabase.LoadAssetAtPath<Material>(materialPath));
|
||||
}
|
||||
EditorGUILayout.LabelField(materialPath);
|
||||
GUILayout.EndHorizontal();
|
||||
}
|
||||
|
||||
private void _AddMaterialToShaderCollect(string shaderName, string materialPath)
|
||||
{
|
||||
if (!_shaderCollect.TryGetValue(shaderName, out ShaderCollectInfo shaderCollectInfo))
|
||||
{
|
||||
shaderCollectInfo = new ShaderCollectInfo(shaderName);
|
||||
_shaderCollect[shaderName] = shaderCollectInfo;
|
||||
}
|
||||
shaderCollectInfo.AddMaterialPath(materialPath);
|
||||
}
|
||||
|
||||
private void _DoCheck()
|
||||
{
|
||||
_shaderCollect.Clear();
|
||||
Debug.Log("开始扫描材质...");
|
||||
var materialGuids = AssetDatabase.FindAssets("t:Material", new[] { "Assets" });
|
||||
if (materialGuids.Length == 0)
|
||||
{
|
||||
Debug.Log("没有找到任何材质");
|
||||
return;
|
||||
}
|
||||
Debug.Log($"找到 {materialGuids.Length} 个材质, 开始归类...");
|
||||
|
||||
foreach (var materialGuid in materialGuids)
|
||||
{
|
||||
var materialPath = AssetDatabase.GUIDToAssetPath(materialGuid);
|
||||
if (!materialPath.EndsWith(".mat"))
|
||||
{
|
||||
// 不是材质文件,跳过
|
||||
continue;
|
||||
}
|
||||
var material = AssetDatabase.LoadAssetAtPath<Material>(materialPath);
|
||||
if (material == null)
|
||||
{
|
||||
Debug.LogError("无法加载材质: " + materialPath);
|
||||
continue;
|
||||
}
|
||||
var shader = material.shader;
|
||||
if (shader == null)
|
||||
{
|
||||
// 添加到错误列表
|
||||
_AddMaterialToShaderCollect("--no shader--", materialPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 添加到正确的着色器收集
|
||||
_AddMaterialToShaderCollect(shader.name, materialPath);
|
||||
}
|
||||
}
|
||||
|
||||
Debug.Log("材质扫描完成,找到 " + _shaderCollect.Count + " 种着色器。");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 4c9f7338b4cc4539b8d6d17f1e654291
|
||||
timeCreated: 1754625549
|
||||
|
|
@ -1,16 +1,22 @@
|
|||
{
|
||||
"requireData": [
|
||||
{
|
||||
"shaderName": "",
|
||||
"note": "",
|
||||
"createTime": 638902560104042151,
|
||||
"requireType": 0
|
||||
"shaderName": "Standard (Specular setup)",
|
||||
"note": "自动添加的着色器要求",
|
||||
"createTime": 638902726648344973,
|
||||
"requireType": 2
|
||||
},
|
||||
{
|
||||
"shaderName": "",
|
||||
"note": "",
|
||||
"createTime": 638902562020527387,
|
||||
"requireType": 0
|
||||
"shaderName": "Universal Render Pipeline/Lit",
|
||||
"note": "自动添加的着色器要求",
|
||||
"createTime": 638902726899870468,
|
||||
"requireType": 2
|
||||
},
|
||||
{
|
||||
"shaderName": "NLD_URP/NLD_Charactor_Old",
|
||||
"note": "自动添加的着色器要求",
|
||||
"createTime": 638902727232685455,
|
||||
"requireType": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 7deab1c71b3463d76aa76db26ef1e7701048c277
|
||||
Subproject commit ab62ea8fb4a5768e408953cbac02deb36576ece4
|
||||
Loading…
Reference in New Issue