232 lines
7.4 KiB
C#
232 lines
7.4 KiB
C#
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
using UnityEditor;
|
|||
|
using System.IO;
|
|||
|
using System;
|
|||
|
|
|||
|
// 选择单选或多选Project下素材,寻找在配置表中出现的位置
|
|||
|
// 寻找位置为表中类型为 STRING 的列
|
|||
|
// 结果存放位置:Application.streamingAssetsPath/FindTableByRes_Result.text
|
|||
|
// Todo: 使用文件夹寻找/递归文件夹寻找
|
|||
|
public class FindTableByRes
|
|||
|
{
|
|||
|
private static List<string> targets = new List<string>(); // 待找的素材名称(无后缀)
|
|||
|
private static List<int> keyWordIndexs = new List<int>(); // 每个.tex文档的 string 列索引
|
|||
|
private static Dictionary<int, List<string>> totalResult = new Dictionary<int, List<string>>(); // 总的结果
|
|||
|
private static string tablePaht = Application.dataPath + "/Project3D/BundleData/Tables3D"; // 表的路径
|
|||
|
private static string resultPath = Application.streamingAssetsPath + "/FindTableByRes_Result.txt";
|
|||
|
private static string[] searchPatterns = new string[] { "*.png" };
|
|||
|
|
|||
|
private static int MaxTargetCount = 300; // 最高允许的查询数目,数目过多会使等待时间增加。
|
|||
|
private static bool isNew = false;
|
|||
|
|
|||
|
[MenuItem("ProTool/ResTool/UnUseRes", true)]
|
|||
|
private static bool Check()
|
|||
|
{
|
|||
|
if(Selection.objects.Length == 0)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
[MenuItem("ProTool/ResTool/UnUseRes")]
|
|||
|
static private void BeginTask()
|
|||
|
{
|
|||
|
isNew = true;
|
|||
|
Init();
|
|||
|
|
|||
|
if(targets.Count > MaxTargetCount)
|
|||
|
{
|
|||
|
Debug.Log("Too much target , " + targets.Count);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (targets.Count == 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
string[] files = Directory.GetFiles(tablePaht, "*.txt");
|
|||
|
|
|||
|
for (int t = 0; t < targets.Count; ++t)
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(targets[t]))
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
List<string> results = new List<string>();
|
|||
|
for (int i = 0; i < files.Length; ++i)
|
|||
|
{
|
|||
|
//Debug.Log("ProTool: working!");
|
|||
|
string[] lines = File.ReadAllLines(files[i]);
|
|||
|
if (lines.Length == 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
keyWordIndexs.Clear();
|
|||
|
// 寻找关键列index
|
|||
|
string[] curColNames = lines[1].Split('\t');
|
|||
|
for (int j = 0; j < curColNames.Length; ++j)
|
|||
|
{
|
|||
|
if (string.Compare(curColNames[j], "string", true) == 0)
|
|||
|
{
|
|||
|
keyWordIndexs.Add(j);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 更具index查找相应名称
|
|||
|
if (keyWordIndexs.Count > 0)
|
|||
|
{
|
|||
|
for (int j = 1; j < lines.Length; ++j)
|
|||
|
{
|
|||
|
|
|||
|
if (lines[j][0] == '#')
|
|||
|
continue;
|
|||
|
|
|||
|
string[] lineWords = lines[j].Split('\t');
|
|||
|
for (int k = 0; k < keyWordIndexs.Count; ++k)
|
|||
|
{
|
|||
|
int index = keyWordIndexs[k];
|
|||
|
if (string.Compare(lineWords[index], targets[t], true) == 0)
|
|||
|
{
|
|||
|
results.Add(files[i] + "\t" + "at line " + j.ToString());
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (results.Count > 0)
|
|||
|
{
|
|||
|
totalResult.Add(t, results);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
results.Add("None");
|
|||
|
totalResult.Add(t, results);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
OutputResult();
|
|||
|
}
|
|||
|
|
|||
|
private static void Init()
|
|||
|
{
|
|||
|
targets.Clear();
|
|||
|
keyWordIndexs.Clear();
|
|||
|
totalResult.Clear();
|
|||
|
|
|||
|
//for(int i = 0; i < Selection.assetGUIDs.Length; ++i)
|
|||
|
//{
|
|||
|
// Debug.Log(AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[i]));
|
|||
|
//}
|
|||
|
|
|||
|
foreach (UnityEngine.Object t in Selection.objects)
|
|||
|
{
|
|||
|
string path = AssetDatabase.GetAssetPath(t.GetInstanceID());
|
|||
|
string absolutePath = Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')) + "/" + path + "/";
|
|||
|
if (Directory.Exists(absolutePath) == true)
|
|||
|
{
|
|||
|
for (int i = 0; i < searchPatterns.Length; ++i)
|
|||
|
{
|
|||
|
string[] temp = Directory.GetFiles(absolutePath, searchPatterns[i], SearchOption.AllDirectories);
|
|||
|
for(int j = 0; j < temp.Length; ++j)
|
|||
|
{
|
|||
|
targets.Add(GetName(temp[j]));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
targets.Add(t.name);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static private string GetName(string path)
|
|||
|
{
|
|||
|
string result;
|
|||
|
if (path.LastIndexOf('\\') != -1)
|
|||
|
{
|
|||
|
result = path.Substring(path.LastIndexOf('\\') + 1, path.LastIndexOf('.') - path.LastIndexOf('\\') - 1);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
result = path.Substring(path.LastIndexOf('/') + 1, path.LastIndexOf('.') - path.LastIndexOf('/') - 1);
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
static private void OutputResult()
|
|||
|
{
|
|||
|
int resultCount = 0;
|
|||
|
foreach(KeyValuePair<int, List<string>> kv in totalResult)
|
|||
|
{
|
|||
|
resultCount += kv.Value.Count;
|
|||
|
}
|
|||
|
|
|||
|
if(resultCount <= 5)
|
|||
|
{
|
|||
|
Debug.Log("ProTool: Done!");
|
|||
|
foreach (KeyValuePair<int, List<string>> kv in totalResult)
|
|||
|
{
|
|||
|
foreach (string s in kv.Value)
|
|||
|
{
|
|||
|
Debug.Log(targets[kv.Key] + " : " + s);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
FileStream fs = new FileStream(resultPath, FileMode.Create);
|
|||
|
StreamWriter sw = new StreamWriter(fs);
|
|||
|
|
|||
|
// 优先输出为结果为空的素材
|
|||
|
foreach (KeyValuePair<int, List<string>> kv in totalResult)
|
|||
|
{
|
|||
|
if(kv.Value[0] == "None")
|
|||
|
{
|
|||
|
sw.WriteLine(targets[kv.Key]);
|
|||
|
sw.WriteLine("\t" + kv.Value[0]);
|
|||
|
sw.Write("\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 再输出结果不为空的素材
|
|||
|
foreach (KeyValuePair<int, List<string>> kv in totalResult)
|
|||
|
{
|
|||
|
if (kv.Value[0] != "None")
|
|||
|
{
|
|||
|
sw.WriteLine(targets[kv.Key]);
|
|||
|
foreach (string s in kv.Value)
|
|||
|
{
|
|||
|
sw.WriteLine("\t" + s);
|
|||
|
}
|
|||
|
|
|||
|
sw.Write("\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
sw.Close();
|
|||
|
fs.Close();
|
|||
|
Debug.Log("ProTool: Done!");
|
|||
|
Debug.Log("ProTool: Too much result, check at " + resultPath);
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
Debug.Log(e.ToString());
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|