1. 程式人生 > >【Unity3D5.6版本使用(1)】自定義編輯器獲取場景所有物件Tag生成Json

【Unity3D5.6版本使用(1)】自定義編輯器獲取場景所有物件Tag生成Json

在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;
    }
`