反射可以動態獲取數據的類型,Type 類可以獲取其中的 字段、方法、屬性等。
尤其是將字段與屬性做區分可以讓我們可以獲取,自己想獲得的。廢話不多說上代碼。
先將數據導入的類,寫下:
1 using System;
2 using UnityEngine;
3
4 namespace ARPGSimpleDemo.Skill
5 {
6 /// <summary>
7 /// 技能數據
8 /// </summary>
9 [Serializable]
10 public class SkillData
11 {
12 /// <summary>技能擁有者</summary>
13 [HideInInspector]
14 public GameObject Owner;
15 /// <summary>技能編號</summary>
16 public int skillID{set;get;}
17 /// <summary>技能圖標</summary>
18 public string skillIcon { set;get;}
19 /// <summary>描述</summary>
20 public string description{set;get;}
21 /// <summary>技能名稱</summary>
22 public string name{set;get;}
23 /// <summary>持續時間</summary>
24 public float durationTime{set;get;}
25 /// <summary>在持續時間內,兩次傷害之間的間隔時間</summary>
26 public float damageInterval{set;get;}
27 /// <summary>傷害比</summary>
28 public float damage {set;get;}
29 /// <summary>冷卻時間</summary>
30 public int coolTime{set;get;}
31 /// <summary>冷卻剩余</summary>
32 public int coolRemain;
33 /// <summary>魔法消耗</summary>
34 public int costSP{set;get;}
35 /// <summary>攻擊距離</summary>
36 public float attackDisntance{set;get;}
37 /// <summary>攻擊目標</summary>
38 [HideInInspector]
39 public GameObject[] attackTargets;
40 /// <summary>攻擊目標的TAG</summary>
41 public string[] attckTargetTags{set;get;}
42 /// <summary>技能等級</summary>
43 public int level{set;get;}
44 /// <summary>技能預制對象</summary>
45 public GameObject skillPrefab;
46 /// <summary>預制文件名</summary>
47 public string prefabName{set;get;}
48 /// <summary>攻擊范圍 線形,矩形,扇形,圓形</summary>
49 public DamageMode damageMode{set;get;}
50 /// <summary>攻擊類型,單攻,群攻</summary>
51 public SkillAttackType attackType{set;get;}
52 /// <summary>是否激活</summary>
53 public bool Activated;
54 /// <summary>技能對應的動畫名稱 </summary>
55 public string animtionName{set;get;}
56 /// <summary> 攻擊范圍角度</summary>
57 public int attackAngle{set;get;}
58 /// <summary>目標受擊特效</summary>
59 public string hitFxName{set;get;}
60 public GameObject hitFxPrefab;
61 /// <summary>下一個連擊技能編號</summary>
62 public int nextBatterId{set;get;}
63
64 }
65 }
下面是獲取數據 並放入
1 /// <summary>
2 /// 將數據庫數據放入技能管理類中
3 /// </summary>
4 /// <param name="jobId">職業ID</param>
5 void InitSkill(int jobId)
6 {
7 //先將數據庫打開
8 OperatingDB.Instance.CreateDataBase();
9 //遍歷表中所有行
10 SqliteDataReader skill = OperatingDB.Instance.db.ReadFullTable("T_Skill" + jobId);
11 while (skill.Read())
12 {
13 SkillData sd = new SkillData();
14 //反射獲取
15 Type t = typeof(SkillData);
16 int i = 0;
17 //遍歷SkillData所有屬性 t.GetProperties
18 foreach (var item in t.GetProperties())
19 {
20 i++;
21 //獲取屬性 判斷 是否為 string
22 if (item.PropertyType.Equals(typeof(string)))
23 item.SetValue(sd, skill[i].ToString(), null); //賦值
24 //獲取屬性 判斷 是否為 float
25 else if (item.PropertyType.Equals(typeof(float)))
26 item.SetValue(sd, float.Parse(skill[i].ToString()), null);
27 //獲取屬性 判斷 是否為 string[]
28 else if (item.PropertyType.Equals(typeof(string[])))
29 {
30 string[] str = skill[i].ToString().Split(',');
31 item.SetValue(sd, str, null);
32 }
33 //獲取屬性 其余 其中枚舉可以與int做轉換
34 else
35 item.SetValue(sd, int.Parse(skill[i].ToString()), null);
36 }
37 //獲取物體本身的技能管理類 將得到的類傳入
38 GetComponent<CharacterSkillManager>().skills.Add(sd);
39 }
40 //關閉數據庫
41 OperatingDB.Instance.db.CloseSqlConnection();
42 }