美文网首页Unity技术分享征服Unity3dunity3D技术分享
MethodEntryAttribute 游戏作弊器的通用实现

MethodEntryAttribute 游戏作弊器的通用实现

作者: 2b75747cf703 | 来源:发表于2016-12-24 13:55 被阅读299次

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

    运行时日志窗和命令入口 点击命令可以查看当前所有命令列表

    利用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;
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:MethodEntryAttribute 游戏作弊器的通用实现

        本文链接:https://www.haomeiwen.com/subject/xrwlvttx.html