轉載unity編輯器xml資料庫外掛
阿新 • • 發佈:2018-12-12
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
|