首页 > 其他分享 >Unity 编辑拓展使用Attribute 实现面板按钮

Unity 编辑拓展使用Attribute 实现面板按钮

时间:2024-06-22 23:42:38浏览次数:12  
标签:ButtonAttribute Attribute System Unity 按钮 using public buttonName

unity面板按钮工具

(1) 完成效果原效果

代码部分

namespace ColorzoreTools
{
    using System;
    using UnityEngine;
    public class TestAttribute : MonoBehaviour
    {
        [Button("测试")]
        public void TestBtn()
        {
            //这个方法会被注册到ui上
            Debug.Log("执行方法");
        }
    }
}

效果(多了个按钮)
img

(2) 原本的效果
img
代码:

using UnityEngine;
namespace ColorzoreTools
{
    using System;
    using UnityEngine;
    public class TestAttribute : MonoBehaviour
    {
        public void TestBtn()
        {
            //这个方法会被注册到ui上
            Debug.Log("执行方法");
        }
    }
}

使用的知识点

特性Attribute 和反射Reflection

特性Attribute : 标记按钮对应的方法

反射Reflection :找到指定类上被标记方法,进行调用

源码


using System;
using System.Linq;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;

namespace ColorzoreTools
{
    /// <summary>
    /// 自定义按钮属性
    /// 只能在方法上运行
    /// [Buttom("方法名称")]
    /// </summary>
    [AttributeUsage(AttributeTargets.Method ,AllowMultiple = false)]
    public class ButtonAttribute:Attribute
    {
        public string buttonName;

        public ButtonAttribute(string buttonName)
        {
            this.buttonName = buttonName;
        }
    }


#if UNITY_EDITOR

    [CustomEditor(typeof(MonoBehaviour),true)]
    public class CustomAttributeDrawer : Editor 
    {
        public override void OnInspectorGUI() 
        {
            base.OnInspectorGUI();

            //获取目标对象
            var mono = target as MonoBehaviour;
            
            if(mono == null)
            {
                return;
            }

            //获取所有的方法
            var methods = mono.GetType()
                .GetMethods(System.Reflection.BindingFlags.Instance | 
                System.Reflection.BindingFlags.Public |
                System.Reflection.BindingFlags.NonPublic);
            
            //遍历方法
            foreach(var method in methods)
            {
                //查找带有ButtonAttribute的方法
                var buttonAttribute = 
                    method.GetCustomAttributes(typeof(ButtonAttribute),true)
                    .FirstOrDefault() as ButtonAttribute;
                
                if(buttonAttribute != null)
                {
                    //绘制按钮
                    if(GUILayout.Button(buttonAttribute.buttonName))
                    {
                        //执行方法
                        method.Invoke(mono,null);
                    }
                }
            }
            
        }
    }
#endif
}


结束

标签:ButtonAttribute,Attribute,System,Unity,按钮,using,public,buttonName
From: https://www.cnblogs.com/colorzore/p/18262871

相关文章

  • Unity 面试题(后续或许会更新)
    C#相关请简述拆箱和装箱装箱操作:值类型隐式转换为object类型或由此值类型实现的任何接口类型的过程。1.在堆中开辟内存空间。2.将值类型的数据复制到堆中。3.返回堆中新分配对象的地址。拆箱操作:object类型显示转换为值类型或从接口类型到实现该接口值类型的过程。1.判断......
  • 【unity开发】 C#接口使用小结(持续更新)
    C#的接口(interface)早些时候我认识的接口仅仅只是作为一个方法签名来使用但是随着学习的深入,就我感觉而言,我所认识的接口又越来越像一个抽象类了1.最基本的使用作为一个接口提供公共方法用玩家的交互判断来举一个例子吧!接口也支持使用泛型再举一个手动实现拷贝方法的接口......
  • Unity 编辑器中获取选中的文件夹、文件路径
    编辑器中获取选中的文件夹、文件路径usingUnityEditor;usingUnityEngine;usingObject=UnityEngine.Object;publicclassMyEditorScript{[MenuItem("Assets/PrintSelectedFolderPath")]staticvoidPrintSelectedFolderPath(){//第一种方式......
  • Unity手写模拟DoTween中的To功能
    usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassDT:MonoBehaviour{publicfloatbeginValue,endValue;publicfloatbeginTime,times;publicAction<float>action;publicAct......
  • Unity3D轮转图(有回正效果)
    注意:MainCamera需要挂载PhysicsRayCaster      Hierarchy中添加UI里面的EventSystem对象(用来相应拖拽事件)usingDG.Tweening;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.EventSystems;usingSystem.Linq;publicclassRotat......
  • Unity初始位置初始化设置
    一、Transform面板介绍参数说明:        Position:位置;        Rotation:角度;        Scale:   比例。二、在Transform面板填写参数,如图所示:三、编写代码转换物体位置、角度、比例   1、位置转换:代码说明:        将目前游戏......
  • Unity相机及物体的移动步骤
    一、在Scenes场景文件夹建立游戏场景 二、在游戏场景里面建立游戏对象并且初始化位置1、建立游戏对象  2、初始化位置 3、把相机拉到游戏对象上(Reset一下位置)【注:这一步是操作相机的移动,物品的操作不用此步骤。】  三、建立CharacterController组件1、有Ca......
  • 【Unity动画系统】Amimator Controller的概念及其使用示例
    Unity的AnimatorController是动画系统中的一个核心组件,它负责管理和控制动画状态机(AnimationStateMachine)的行为。AnimatorController包含了动画状态、转换规则、以及用于控制动画流程的参数。AnimatorController的概念:动画状态(AnimationStates):代表单个动画剪辑(Animati......
  • 【名词解释】Unity中的3D物理系统:触发器
    在Unity的3D物理系统中,触发器(Trigger)是一种特殊的碰撞体,用于检测物体进入或离开一个特定区域的事件,但它不会像普通碰撞体那样产生物理碰撞反应。触发器通常用于实现非物理交互,如检测玩家进入特定区域、开启门、触发事件等。名词解释:Trigger:一种特殊的碰撞体,用于检测物体的进......
  • Unity3D 八叉树划分空间和可视化
    也许更好的阅读体验成果展示代码OctreeNodeusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassOctreeNode{//空间内包含的物体publicList<GameObject>areaObjects;//空间中心publicVector3center;......