【Unity3D5.6版本使用(1)】自定義編輯器獲取場景所有物件Tag生成Json
阿新 • • 發佈:2019-02-15
在unity3D5.x版本中,一部分以前的程式碼無法正常執行,比如:載入場景時,使用Application.loadedLevel會提示“已過時”,需要使用EditorSceneManager.OpenScene(FileName[scount]);所以寫一篇記錄下在新版本環境實現一些功能的筆記(一些沒變化)。
一.獲取當前場景所有Tag
想要獲取場景(多個場景)的Tag,需要先載入場景,我是想要做一個外掛,能讓使用者一鍵獲取專案中所有的場景,並讀取場景中對應的Tag。那麼就需要遍歷專案中的場景,一般專案中都會把場景存放在Scenes資料夾下
所以讀取指定資料夾下所有檔案即可
//獲取檔案路徑
string DPath = Application.dataPath;
int num = DPath.LastIndexOf("/");
DPath = DPath.Substring(0, num);
DPath = DPath + "/Assets/Scenes";
//讀取資料夾下的所有物件存到陣列中
List<string> filename = new List<string>();
if (Directory.Exists(DPath))
{
DirectoryInfo direction = new DirectoryInfo(DPath);
FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);
for (int i = 0; i < files.Length; i++)
{
if (files[i].Name.EndsWith(".meta"))//不讀取字尾為".meta"的檔案
{
continue ;
}
filename.Add(files[i].FullName);
}
}
string[] FileName = filename.ToArray();
for(int scount=0;scount< FileName.Length;scount++)
{
EditorSceneManager.OpenScene(FileName[scount]);//載入場景
GameObject[] AllObject = Resources.FindObjectsOfTypeAll<GameObject>();
List<string> arrlist = new List<string>();
for (int i = 0; i < AllObject.Length; i++)
{
arrlist.Add(AllObject[i].tag);
}
string[] AllTag = arrlist.ToArray();
AllTag = SelectString(AllTag, "mcitagdev");
udtDeviceMap[] Devicemap = null;
for (int j = 0; j < AllTag.Length; j++)
{
if(Devicemap==null)
{
Array.Resize(ref Devicemap, 1);
}
else
{
int max = Devicemap.Length;
Array.Resize(ref Devicemap,max+1);
}
string[] arrl = AllTag[j].Split('_');
string devname = arrl[1] +"_"+ arrl[2] + "_" + arrl[3] + "_" + arrl[4];
// Devicemap[Devicemap.Length-1]=
udtDeviceMap dm = new udtDeviceMap();
dm.devname = devname;
//dm.dommap.type_g[]= AllTag[j];
dm.domh - 1] = dm;
}
二.自定義編輯器
`[MenuItem(“MyMenu/getAllTag”)]
public static void getAllTag()
{
WriteFile write = new WriteFile();
write.DeleteFile(Application.persistentDataPath, scenename + ".js");
write.CreateFile(Application.persistentDataPath, scenename+".js", sDeviceMap);
print("當前檔案路徑:" + Application.persistentDataPath);
}``
三.寫本地Json
這裡用到了一個Newtonsoft.Json的DLL來轉換Json,注意版本最好使用2.0.
- `public void CreateFile(string path, string name, string info)
{
//檔案流資訊
StreamWriter sw;
FileInfo t = new FileInfo(path + "//" + name);
if (!t.Exists)
{
//如果此檔案不存在則建立
sw = t.CreateText();
}
else
{
//如果此檔案存在則開啟
sw = t.AppendText();
}
//以行的形式寫入資訊
sw.WriteLine(info);
//關閉流
sw.Close();
//銷燬流
sw.Dispose();
}
/**
* 讀取文字檔案
* path:讀取檔案的路徑
* name:讀取檔案的名稱
*/
public ArrayList LoadFile(string path, string name)
{
//使用流的形式讀取
StreamReader sr = null;
try
{
sr = File.OpenText(path + "//" + name);
}
catch (Exception e)
{
//路徑與名稱未找到檔案則直接返回空
return null;
}
string line;
ArrayList arrlist = new ArrayList();
while ((line = sr.ReadLine()) != null)
{
//一行一行的讀取
//將每一行的內容存入陣列連結串列容器中
arrlist.Add(line);
}
//關閉流
sr.Close();
//銷燬流
sr.Dispose();
//將陣列連結串列容器返回
return arrlist;
}
`