Unity自定义属性(Attribute)示例

这篇具有很好参考价值的文章主要介绍了Unity自定义属性(Attribute)示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.自定义属性,使用场景

        a.想知道当前的工程内定义过的特定的类

        b.想知道当前工程内,类中定义过的特定的成员(变量,方法)

二.自定义属性介绍

        a.需要继承自 System.Attrbute。 可以有自己的成员

        b.Attribute参数说明:

                参数一:代表该属性使用的位置。例如:field, method, class等,详细看枚举

                参数二:字面意思,是否允许多个存在

                参数三:表示派生类,是否也拥有该属性。 True:表示拥有

        c. 示例代码:field的使用自定义属性

    [AttributeUsage(AttributeTargets.Field, AllowMultiple=true, Inherited=true)]
    public class TestFieldAttribute : System.Attribute
    {
        private string _name;
        public string name => _name;
            
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="UIName">编辑器上显示的名字</param>
        public TestFieldAttribute(string UIName)
        {
            _name = UIName;
        }
    }
    
    [AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=false)]
    public class TestClassAttribute : System.Attribute
    {
        private string _name;
        public string name => _name;
            
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="UIName">编辑器上显示的名字</param>
        public TestClassAttribute(string UIName)
        {
            _name = UIName;
        }
    }
    
    [AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
    public class TestMethodAttribute : System.Attribute
    {
        private string _name;
        public string name => _name;
            
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="UIName">编辑器上显示的名字</param>
        public TestMethodAttribute(string UIName)
        {
            _name = UIName;
        }
    }

        d.使用示例:注意使用的时候可以省略掉Attribute,语言支持的

    [TestClass("测试类")]
    public class ThisIsClass
    {
        [TestField("测试属性")]
        [TestField("测试属性")]
        public string thisIsField;
        
        [TestMethod("测试方法")]
        public void TestMethod()
        {
            
        }
    }

三.如果获取加过指定自定义属性的类,成员

        思路:扫描当前工程内所有的类,所有的属性。判定其自定义属性,与自定义属性是否相等

        a. 获取工程内添加过自定义属性的类,示例

private static void GetTestAttrType()
{
    var doMain = AppDomain.CurrentDomain;
    // var assemblies = doMain.ReflectionOnlyGetAssemblies(); 也可以通过反射
    var assemblies = doMain.GetAssemblies();
    
    // 遍历,所有的程序集
    for (int i = 0; i < assemblies.Length; i++)
    {
        //TODO 此处可以过滤掉不需要的程序集,提升效率
        var assembly = assemblies[i];
        var types = assembly.GetTypes();
        // 遍历程序集内所有的类型
        for (int j = 0; j < types.Length; j++)
        {
            var typeNameSpace = types[j].Namespace;
            // 过滤命名空间,提升效率
            if (string.IsNullOrEmpty(typeNameSp!typeNameSpace.Equals("命名空间"))
                continue;
            // 过滤掉泛型, 可有可无
            if (types[j].IsGenericTypeDefinition)
                continue;
            var attr = types[j].GetCustomAttribute<TestClassAttribute>();
            if (attr == null)
                continue;
            // 此处识别到了添加了指定自定义属性的Type,以及属性中的值
            Type targetType = types[j];
            string uiName = attr.name;
        }
    }
}

        b.识别添加了自定义属性的成员,示例代码文章来源地址https://www.toymoban.com/news/detail-491704.html

private static Dictionary<string, FieldInfo> GetTestFieldAttrs(Type actionType)
{
    Dictionary<string, FieldInfo> result = new Dictionary<string, FieldInfo>();
    
    var flag = BindingFlags.Instance | BindingFlags.Public;
    var fields = actionType.GetFields(flag);
    if (fields == null || fields.Length <= 0)
    {
        return result;
    }
    for (int i = 0; i < fields.Length; i++)
    {
        var attr = fields[i].GetCustomAttribute<TestFieldAttribute>();
        if (attr != null)
        {
            // 此处识别到了添加了指定自定义属性的成员,以及属性中的值
            result.Add(attr.name, fields[i]);
        }
    }
    return result;
}

到了这里,关于Unity自定义属性(Attribute)示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【CSS 17】attribute selector 属性选择器 设置无class或id的表单样式

    attribute selector 属性选择器 可以设置带有特定属性或属性值的 HTML 元素的样式 [attribute] 选择器用于选取带有指定属性的元素 [attribute=“value”] 选择器用于选取带有指定属性和值的元素 [attribute~=“value”] 选择器选取属性值包含指定词的元素 [attribute|=“value”] 选择器用于选取

    2024年02月12日
    浏览(48)
  • Unity 编辑器扩展之 Attribute

    Unity内置属性[Attribute]是一种类似修饰功能的标签。可以对OnSceneGUI,InspectorGUI,MenuGUI,WindowGUI等实现各种各样的GUI扩展。用户只要添加上特性标签,就能够自由的使用这些扩展功能。下面列出一些常用的标签: 隐藏属性在Inspector面板上的显示。在继承了MonoBehaviour的类中,用

    2023年04月09日
    浏览(65)
  • vuex的五个属性及使用方法示例

    一,Vuex简介 Vuex是Vue.js的状态管理库,它通过中心化的状态管理使得组件间的数据共享更加容易。 Vuex包含五个核心属性:state、getters、mutations、actions和modules。 Vuex是Vue.js的状态管理库,它提供了一种集中式存储管理应用程序中所有组件的状态,并将其分离到一个可预测的状

    2024年02月03日
    浏览(47)
  • 【CSS Grid网格布局】常用属性,示例代码解读

    grid-template-columns/grid-template-rows:用于定义网格的列和行的大小和数量。可以指定具体的尺寸值(如px、em等),也可以使用fr单位表示剩余空间的比例分配。 grid-column-gap/grid-row-gap:用于定义网格的列间距和行间距。可以使用具体的尺寸值或百分比。 grid-template-areas:用于定义

    2024年02月12日
    浏览(43)
  • 智能小程序小部件(Widget)媒体组件属性说明和示例代码汇总

    基础库 2.2.0 开始支持, 低版本需做兼容处理。 系统相机。相关 API:ty.createCameraContext。这是基于异层渲染的原生组件, 请注意原生组件使用限制。 属性说明 属性名 类型 默认值 必填 说明 mode string normal 否 应用模式,只在初始化时有效,不能动态变更 resolution string medium 否 分

    2024年01月17日
    浏览(35)
  • .NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法

    前段时间有朋友问道一个这样的问题,.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类,然后通过依赖注入(DI)的方式获取对应服务的方法并通过反射动态执行类的方法,从而实现更灵活的编程

    2023年04月15日
    浏览(44)
  • 【小程序】input输入框属性及上下左右居中的示例(图文+代码)

    属性 功能 示例 placeholder 输入框空时,提示文字  placeholder=“请输入用户名” placeholder-style 输入框,提示文字的样式 placeholder-style= \\\"color:rgb(170,170,170); margin-left: 20px;\\\" placeholder-class placeholder 的样式类 用class样式修改 cursor-spacing 指定的光标与弹出键盘的距离 cursor-spacing=\\\"50\\\" t

    2024年02月15日
    浏览(45)
  • 【移动端网页布局】flex 弹性布局子项目属性 ① ( flex 属性用法说明 | 代码示例 : 占有剩余布局 / 平均分成若干等份 )

    flex 子项目 的常用属性 : flex 属性 : flex 子项目 在 flex 父容器 中 占有的 份数比例 , 如果都设置 1 , 那么将对应尺寸平分即可 ; align-self 属性 : 控制 flex 子项目 在 侧轴 的排列方式 ; order 属性 : 控制 flex 子项目 的排列顺序 ; 主要是修改前后顺序 , 原来是 1 - 2 - 3 排列顺序 , 可以

    2024年02月09日
    浏览(54)
  • dede中调用文章属性的名称(调用自定义属性名称)

    接下来我们给大家分享一下如何在文章页内调用相关的属性名称: 我们可以看到,这个标题后面就是我们需要的属性名字,通过代码分析我们可以看到调用的代码为 我们能够看出来,这个调用需要函数:IsCommendArchives(@me) 这个函数就是把文章内获取的flag的内容,转化对应的

    2024年02月02日
    浏览(39)
  • dbc的属性定义

    在前一章新建完Signals后会出现两个配置项GenSigSendType、GenSigInactiveValue,这是dbc模板自带的两个属性,当我们打开Attribute Definition会展示出当前已定义的属性。本章将详细展开属性定义的奥秘。

    2023年04月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包