1.描述
我们在做项目的时候,美术会放很多shader在项目中,有一部分是没有用到的,想删又怕删错,会导致一些材质球丢shader,显示紫色。
今天就来想办法把多余的shader删干净。
2.分析
在写代码之前,先分析下思路。首先我们要分析shader会被哪些文件引用,我找到了下面的两种情况。
1.material 这种情况是最常规的,所有用到的材质球都会依赖自己的shader
2.scene 这种情况不多,但是也会有,一般是屏幕特效之类的东西,在相机上挂了一个脚本,然后脚本里面挂上shader,并没有产生材质球。
研究了一下发现,这种shader是依赖在scene文件中。
3.游戏的时候动态运用的shader,这种情况只要在c#文件中搜索,如果包含shader名字,说明shader是用到的。
3.思路
根据上面的分析,我们先整理出一个框架,然后再开始写代码,这是一个好的习惯,在写代码之前先用中文把思路表达清楚,写起来
就不会乱了,扯远了哈,继续说框架。
1.指定目录,一般只要在项目的某个路径里执行就可以了
1.查找出项目中所有的材质球,特点是文件名包含 “.mat”,将其文件路径加入到数组A
2.查找出项目中所有的scene,特点是文件名包含“.unity”,将其文件路径加入到数组B
3.查找出项目中所有的shader,特点是文件名包含“.shader”,将其文件路径加入到数组C
4.查找出c#文件使用的shader,将其加到数组C里面
5.通过shaderGuid将引用在mat和scene的shader找出来,将其加入数组D
6.通过数组C与D ,得出没有用到的shader路径,将其加入到数组E
7.删除E
这样我们就可以开始写代码了
4.代码
里面的代码全部是加上详细注释的,应该不难看懂
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Text.RegularExpressions;
public class DelectShader : EditorWindow
{
private static List<string> matPahtList = new List<string>(); //所有的material路径数组
private static List<string> scenePathList = new List<string>();//所有的scene路径数组
private static List<string> allshaderPahtList = new List<string>();//所有shader路径数组
private static List<string> useShaderPathList = new List<string>();//所有用到的shader路径数组
private static List<string> noUseShaderList = new List<string>();//没用到shader路径
private static List<string> allCsPathList = new List<string>(); //所有c#数组
[MenuItem("Game-X/删除多余shader")]
//菜单调用这个函数
static void GetNotQuoteShaderPath()
{
instantPathList(); //实例化三个数组:1 所有的shader 2 在材质球中用到的shader 3 在scene中用到的shader
addMat(); // 将 在材质球中用到的shader + 到用到的shader数组里
addScene();// 将 在scene中用到的shader + 到用到的shader数组里
addCs(); // 将 在 c#中用到的shader + 到用到的shader数组里
noUseShader();//通过 “所有的shader” 和 “所有用到的shader” 得出没有用到的shader
deletes();//删除没有用到的shader
}
//获取所有的shader 和 mat 和 scene的路径
static void instantPathList()
{ //Application.dataPath:Assets路径 这里相当于“Assets/resourcex” 项目里用到的shader跟mat只在这个文件夹里面
string path = Application.dataPath+ "/resourcex";
//Di