利用反射获取UnityEvent注册的方法数量

知识

反射

准备

  1. UnityEven是一个类,继承UnityEventBase
  2. UnityEventBase有一个私有字段m_Calls,该字段是一个类InvokableCallList,用于记录注册的方法,
  3. InvokableCallList有一个公有属性Count,该属性返回运行时注册的方法数量

使用反射

  1. 使用typeof获取UnityEventBase的类型
  2. 使用Type的GetField方法获取实例的成员,参数一 成员名,参数二搜素该成员的条件,不是公共成员且对象需实例化
  3. InvokableCallList只能在同一个程序集中使用,该类和UnityEventBase属于同一个程序集,使用程序集的GetType方法获取 InvokableCallList的类型
  4. 使用Type的GetProperty方法获取实例的属性
  5. 使用字段的GetValue和属性的GetVlaue方法获取Count的值

示例

using System;
using System.Reflection;
using UnityEngine;
using UnityEngine.Events;
public class GetUnityEventMethodCount : MonoBehaviour
{
    public UnityEvent OnClick = new UnityEvent();
   
    Type typeEventBase;
    FieldInfo calls;
    PropertyInfo methodCount;
    Type typeInvokableCallList;

    private void Awake()
    {
        typeEventBase = typeof(UnityEventBase);//获取类型 UnityEventBase
        calls = typeEventBase.GetField("m_Calls", BindingFlags.NonPublic | BindingFlags.Instance);//获取字段m_Calls
        typeInvokableCallList = typeEventBase.Assembly.GetType("UnityEngine.Events.InvokableCallList");//获取类型 InvokableCallList
        methodCount = typeInvokableCallList.GetProperty("Count");//获取属性Count
    }

    public int MethodCount()
    {
        //calls.GetValue(OnClick) 获取InvokableCallList的实例
        //methodCount.GetValue(calls.GetValue(OnClick)) 使用InvokableCallList实例的Count属性
        return (int)methodCount.GetValue(calls.GetValue(OnClick));//得到Count值
    }

    private void OnGUI()
    {
        GUILayout.Label("事件注册的方法数量:" + MethodCount());
      
        if (GUILayout.Button("运行时注册方法"))
        {
            OnClick.AddListener(TestMethod);
        }

        if (GUILayout.Button("运行时移除方法"))
        {
            OnClick.RemoveListener(TestMethod);
        }
    }

    void TestMethod()
    {

    }
}

你可能感兴趣的:(Unity经验,游戏引擎,unity)