使用反射功能在Unity運行狀態經過Inspector面板修改字段和調用方法

使用反射功能在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

相關文章
相關標籤/搜索