利用反射获取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()
    {

    }
}

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值