MethodEntryAttribute 游戏作弊器的通用实现

游戏开发中经常会有作弊器的需求,比如快速增加金币、切换到特定场景等,一般会选择在屏幕中添加按钮,代码会比较杂乱。

MethodEntryAttribute 游戏作弊器的通用实现_第1张图片
运行时日志窗和命令入口
MethodEntryAttribute 游戏作弊器的通用实现_第2张图片
点击命令可以查看当前所有命令列表

利用C#语言特性Attribute,实现自定义的MethodEntryAttribute作为方法入口标记。

MethodEntryAttribute 游戏作弊器的通用实现_第3张图片
MethodEntry的使用,注意参数列表要一致
MethodEntryAttribute 游戏作弊器的通用实现_第4张图片
反射调用代码
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> 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> GetMethodEntrys()
        {
            var methodEntrys = new List>();

            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, method));
                    }
                }
            }

            return methodEntrys;
        }
    }
}

你可能感兴趣的:(MethodEntryAttribute 游戏作弊器的通用实现)