游戏开发中经常会有作弊器的需求,比如快速增加金币、切换到特定场景等,一般会选择在屏幕中添加按钮,代码会比较杂乱。
运行时日志窗和命令入口 点击命令可以查看当前所有命令列表利用C#语言特性Attribute,实现自定义的MethodEntryAttribute作为方法入口标记。
MethodEntry的使用,注意参数列表要一致 反射调用代码using System;
using System.Collections.Generic;
using System.Reflection;
namespace Babybus.Framework
{
[AttributeUsage(AttributeTargets.Method, Inherited = false)]
public class MethodEntryAttribute : Attribute
{
public string Description { private set; get; }
public object[] Args { private set; get; }
public static List<KeyValuePair<MethodEntryAttribute, MethodInfo>> MethodEntrys { private set; get; }
static MethodEntryAttribute()
{
MethodEntrys = GetMethodEntrys();
}
public MethodEntryAttribute(string description, params object[] args)
{
Description = description;
Args = args;
}
public override string ToString()
{
var toString = Description;
foreach(var arg in Args)
{
toString += ", " + arg;
}
return toString;
}
private static List<KeyValuePair<MethodEntryAttribute, MethodInfo>> GetMethodEntrys()
{
var methodEntrys = new List<KeyValuePair<MethodEntryAttribute, MethodInfo>>();
var assembly = Assembly.GetExecutingAssembly();
var types = assembly.GetTypes();
foreach (var type in types)
{
var methods = type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
foreach (var method in methods)
{
var attributes = method.GetCustomAttributes(typeof(MethodEntryAttribute), false);
foreach (var attribute in attributes)
{
var methodEntryAttribute = attribute as MethodEntryAttribute;
methodEntrys.Add(new KeyValuePair<MethodEntryAttribute, MethodInfo>(methodEntryAttribute, method));
}
}
}
return methodEntrys;
}
}
}
网友评论