1. 程式人生 > >轉載unity編輯器xml資料庫外掛

轉載unity編輯器xml資料庫外掛

unity編輯器xml資料庫外掛

注:9月9日更新,其中MyXML.cs中有一句程式碼寫錯,查詢功能失誤,文中已經修改!

注:9月1日更新說明:xml儲存結構,因為在用xml之前不知道正規的xml資料結構,所以是自創的結構。雖然也能完成功能,但是據說策劃配置時不方便,所以為了統一,不使用節點的方式儲存資料,

而是通過新增屬性,設定屬性的方式來存取資料。

直接上圖看的清楚些:

我之前設計的格式:

現在的格式:

關於這部分的程式碼我會貼在最後。

程式和資料分離的意義我就不多說了,大家自己腦補或者百度。在使用unity開發時,資料的除錯是非常頻繁和重要的。我們可以製作一個簡單的編輯器外掛,將資料顯示在Inspector面板上,並進行編輯操作。這樣測試人員就可以非常方便的管理測試資料了。

需求很簡單,具體的效果是,能讀取資源內的類,將其屬性顯示在面板上,可以對此進行增刪改查的操作。如下圖所示(物件組,相當於資料庫所有的表。物件,相當於表的所有記錄)。

 

 

 

 

當需要建立一條新記錄的時候,先填上主鍵,然後點選建立按鈕。編輯完成後點選插入即可。

 

 

 

 

 

xml資料庫檔案如下圖

 

要實現這個功能,需要的知識是,C#的反射類,unity的編輯器類,資料庫。通過反射,自動解析物件,獲取物件的成員變數名和值。Unity編輯器類沒什麼好說的,就是一些元件方法的使用。考慮到跨平臺等問題,我選擇xml作為儲存資料庫。編輯器內執行,儲存量不大,所以效能方面的問題也就不說了。

好,接下來說一說設計的事。首先是物件的反射。基本型別的儲存沒有問題,難點是陣列的存取有點變態。我找了很多資料也不能自動建立某一型別的陣列。既然不能自動,然後就使用半自動判斷了,無非是if else之類的,看看這個屬性是不是某一型別的陣列。

下面是程式碼。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 using  System; using  System.Reflection; using  UnityEngine; using  System.Collections.Generic; using  System.Runtime.InteropServices; public  class  ClassAnalyze<T> {      private  string [] cols;        public  string [] Cols      {          get  return  cols; }          set  { cols = value; }      }      private  string [] values;        public  string [] Values      {          get  return  values; }          set  { values = value; }      }        public  string  ClazzName      {          get  return  tempClazz.GetType().Name; }        }      private  PropertyInfo[] property;      private  T tempClazz;        public  static  System.Object CreateObject( string  objName) {          return  Assembly.GetExecutingAssembly().CreateInstance(objName);      }      public  T GetClazz( string [] values)      { //將數值賦給物件,然後再獲取            SetClazz(values);          this .Values = values;          if  (tempClazz ==  null )          {              return  default (T);          }          return  tempClazz;      }      public  void  SetClazz( string [] values)      { //將數值賦給物件,然後再獲取            if  (tempClazz !=  null  &&  this .Values.Length == values.Length)          {              this .Values = values;              for  ( int  i = 0; i < property.Length; i++)              {                  if  (tempClazz.GetType().GetProperty(Cols[i]).PropertyType.IsArray)                  {                        var  tempArr = StringToArr(tempClazz.GetType().GetProperty(Cols [i]).GetValue(tempClazz,  null ), values[i].Split( new  char [] {  '|'  }));                        property[i].SetValue(tempClazz, tempArr,  null );                  }                  else                  {                      property[i].SetValue(tempClazz, Convert.ChangeType(values[i], property[i].PropertyType),  null );                  }              }          }      }      private  System.Object StringToArr(System.Object arr,  string [] values)      {          if  (arr  is  string [])          {              arr =  new  string [values.Length];              for  ( int  i = 0; i < values.Length; i++)              {                  (arr  as  string [])[i] = values[i];              }              return  ( string [])arr;          }          else  if  (arr  is  int [])          {              arr =  new  int [values.Length];              for  ( int  i = 0; i < values.Length; i++)              {                  (arr  as  int [])[i] =  int .Parse(values[i]);              }              return  ( int [])arr;          }          else  if  (arr  is  Single[])          {              arr =  new  Single[values.Length];              for  ( int  i = 0; i < values.Length; i++)              {                  (arr  as  Single[])[i] = Single.Parse(values[i]);              }              return  (Single[])arr;          }          else  if  (arr  is  float [])          {              arr =  new  float [values.Length];              for  ( int  i = 0; i < values.Length; i++)              {                  (arr  as  float [])[i] =  float .Parse(values[i]);              }              return  ( float [])arr;          }          else  if  (arr  is  double [])          {              arr =  new  double [values.Length];              for  ( int  i = 0; i < values.Length; i++)              {                  (arr  as  double [])[i] =  double .Parse(values[i]);              }              return  ( double [])arr;          }          else  if  (arr  is  long [])          {              arr =  new  long [values.Length];              for  ( int  i = 0; i < values.Length; i++)              {                  (arr  as  long [])[i] =  long .Parse(values[i]);              }              return  ( long [])arr;          }          else  if  (arr  is  System.Object[])          {              arr =  new  System.Object[values.Length];                for  ( int  i = 0; i < values.Length; i++)              {                    (arr  as  System.Object[])[i] = values[i];              }              return  (System.Object[])arr;          }              return  arr;      }        private  string  ArrToString(System.Object arr)      {            string  values =  "" ;              if  (arr  is  System.Object[])          {              foreach  ( var  value  in  arr