反射可以動態獲取數據的類型,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 }