【资源检查】修改材质资源检查设置

# Conflicts:
#	ProjectNLD/Assets/PhxhSDK
main
刘涛 2025-08-08 18:21:17 +08:00
parent 4f2a1ea040
commit 68c238574e
12 changed files with 15 additions and 377 deletions

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 3b9135b66ef641b2ae8a7c85b7d1c0cb
timeCreated: 1754625537

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: ea249a74bb424aeab5b1f13faf078ae2
timeCreated: 1754626327

View File

@ -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++;
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: df35dc8a31404016aaadaaad79c6f86c
timeCreated: 1754626420

View File

@ -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,
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: d115616046e84ae38b7f4dee785076e6
timeCreated: 1754627758

View File

@ -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>();
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 805366098f3142c09076f2ebee306e37
timeCreated: 1754629366

View File

@ -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 + " 种着色器。");
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 4c9f7338b4cc4539b8d6d17f1e654291
timeCreated: 1754625549

View File

@ -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