使用反射功能在Unity運行狀態經過Inspector面板修改字段和調用方法
效果展現
一個很簡單的組件腳本git
運行狀態在Inspector面板能夠隨便修改字段和調用方法github
方法調用日誌工具
設計由來
- 最近在學習反射
- 結合遊戲開發過程遇到比較難受的事情
應用場景
-
遊戲特別龐大、電腦特別垃圾、從新運行一次Unity須要等待幾十秒的狀況下學習
-
你須要修改一個組件字段或者調用一個方法展現一個動畫等等動畫
-
這個時候你確定渴望能夠直接修改字段或者直接調用某個方法spa
-
反射就能夠實現設計
-
修改實例對象全部的字段包括私有字段日誌
-
調用實例對象全部的方法包括私有方法code
-
總結一下:就是能夠瞎幾把修改組件字段和調用組件方法對象
反射能夠作哪些事
-
獲取類的全部字段屬性方法包括私有的
-
修改類的全部字段包括私有的
-
修改類的全部屬性包括私有的
-
調用類的全部方法包括私有的
-
實例化一個類(這個工具用不到)
製做流程
-
新建一個繼承MonoBehaviour的類 ReflectionMonoBehaviour
-
在類的Start方法獲取掛在遊戲對象上的其餘組件實例
-
新建一個的Editor類 ReflectionMonoBehaviourEditor
-
自定義編輯腳本Inspector面板
-
經過上面獲取的組件實例
-
反射出全部的字段、屬性、方法
-
而後在Inspector面板顯示出來
-
經過在Inspector面板修改、點擊按鈕
-
使用反射修改、調用組件實例
使用到的反射方法
using System.Reflection; //獲取實例組件的Type Type type = 實例對象.GetType(); //獲取實例組件的全部字段(BindingFlags限制枚舉) FieldInfo[] allFieldInfo = type.GetFields(BindingFlags.NonPublic | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static); //獲取實例組件的全部方法(BindingFlags限制枚舉) MethodInfo[] allMemberInfo = type.GetMethods(BindingFlags.NonPublic | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static); //獲取字段的類型(int string float 等等) FieldInfo.FieldType //獲取方法的全部參數 MethodInfo.GetParameters() //獲取參數的類型 ParameterInfo.ParameterType //修改實例組件的字段 Field.fsieldInfo.SetValue(實例對象, 值) //方法實例組件的方法 Method.methodInfo.Invoke(實例對象, 全部參數);
工具待完善
目前只支持一些類型的字段修改和調用方法 若是有須要能夠本身修改 很簡單的
源碼例子地址
源碼:https://github.com/QiangZou/ZouQiang/tree/master/Assets/ZouQiang/Tool/ReflectionMonoBehaviour 例子:https://github.com/QiangZou/ZouQiang/tree/master/Assets/ZouQiangExample/ReflectionMonoBehaviour