首页 > 其他分享 >一篇文章搞懂unity编辑器中Event的rawType, type和GetTypeForControl

一篇文章搞懂unity编辑器中Event的rawType, type和GetTypeForControl

时间:2025-01-13 22:33:45浏览次数:1  
标签:rawType eventCache unity GetTypeForControl Debug 搞懂 type Event Log

简介

Event.rawType就是初始的type,可以通过Event.Use()将rawType修改为EventType.Used
Event.type是经过GUIClip过滤的rawType,如果事件触发时,鼠标位置位于当前GUIClip中,返回rawType,如果鼠标不在当前GUIClip中,则设置为EventType.Ignore
Event.GetTypeForControl 相对于Event.type在GUIClip过滤的基础上,增加了hotControl的判断,如果是hotControl,也直接返回rawType。

验证代码

鼠标点击浅色区域,此时鼠标位置位于GUIClip区域之外,GUICLip内的代码调用rawType会是MouseDowntype会是Ignore,由于设置了hotControl,GetTypeForControl会是MouseDown
在我们重置hotControl为0时,GetTypeForControl的值也变成Ignore.

鼠标点击深色区域,此时鼠标位置位于GUIClip之内,此时 rawType, type 以及 GetTypeForControl 的结果都是MouseDown

public class EventDemoEditorWindow : EditorWindow
{
    [MenuItem("Demos/EventDemoEditorWindow")]
    static void ShowWindow()
    {
        var window = GetWindow<EventDemoEditorWindow>();
        window.titleContent = new GUIContent("EventDemoEditorWindow");
        window.Show();
    }


    private Event eventCache;

    private int buttonControlId;


    private void OnEnable()
    {
    }

    private void OnGUI()
    {
        //Event.GetTypeForControl
        eventCache = Event.current;

        if (MGUILayout.Button($"按钮1"))
        {
            Debug.Log("点击 按钮1");
        }
        var buttonRect = GUILayoutUtility.GetLastRect();

        buttonControlId = GetLastControlId();
        GUIUtility.hotControl = buttonControlId;
        //GUIUtility.hotControl = 0;

        //鼠标需要点击 ClipRect 的上方区域
        var clipRect = Rect.MinMaxRect(0, buttonRect.yMax+100, position.width, position.height);

        //if(eventCache.type == EventType.Repaint)
            GUI.Box(clipRect, string.Empty);

        //buttonControlId = GetLastControlId();
        //GUIUtility.hotControl = buttonControlId;

        GUI.BeginClip(clipRect, default(Vector2), default(Vector2), false);
        {

            if (eventCache.rawType == EventType.MouseDown)
            {

                EventType type;

                type = eventCache.rawType;
                Debug.Log($"rawType = {type}");

                type = eventCache.GetTypeForControl(buttonControlId);
                Debug.Log($"GetTypeForControl={type}");

                type = eventCache.type;
                Debug.Log($"type={type}");


                GUIUtility.hotControl = 0;
                Debug.Log("----------------  Set HotControl=0   ----------------- ");

                type = eventCache.rawType;
                Debug.Log($"rawType = {type}");

                type = eventCache.GetTypeForControl(buttonControlId);
                Debug.Log($"GetTypeForControl={type}");

                type = eventCache.type;
                Debug.Log($"type={type}");


                eventCache.Use();
                Debug.Log("------------------  Event.Use()   ------------------- ");

                type = eventCache.rawType;
                Debug.Log($"rawType = {type}");

                type = eventCache.type;
                Debug.Log($"type={type}");

            }

        }
        GUI.EndClip();

        

        GUIUtility.hotControl = 0;
    }

    private int GetLastControlId()
    {
        var type = typeof(EditorGUIUtility);
        var field = type.GetField("s_LastControlID", BindingFlags.Static | BindingFlags.NonPublic);
        var lastControlID = (int)field.GetValue(null);
        return lastControlID;
    }


}

标签:rawType,eventCache,unity,GetTypeForControl,Debug,搞懂,type,Event,Log
From: https://www.cnblogs.com/dewxin/p/18669534

相关文章

  • 【Unity 编辑器插件】Stranger Lands - StampIT! 旨在简化和加速游戏场景构建中的地形
    StrangerLands-StampIT!是一款Unity插件,专为游戏开发者设计,旨在简化和加速游戏场景构建中的地形、地图和环境资源布局。它特别适用于需要大规模、快速生成或修改地形的项目,如开放世界、冒险类游戏、沙盒游戏等。通过该插件,开发者可以通过简单的操作快速“印刷”出各种地形......
  • #渗透测试#网络安全# 一文搞懂什么是公钥和私钥!!!
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。目录一、什么是公钥和私钥公钥和私钥的基本概念一、私钥二......
  • 【unity】学习制作2D横板冒险游戏-2-
    配置新输入系统升级输入系统打开设置更新安装新系统给PLayer添加Input组件创建一个input文件,在如图路径下里面有一些默认的功能生成代码编写人物控制代码脚本路径如下新的输入系统的启动代码如何控制呢?通过检测输入系统中的坐标来控制左右移动Fixupdate......
  • Unity TextMesh Pro入门
    概述TextMeshPro是Unity提供的一组工具,用于创建2D和3D文本。与Unity的UI文本和TextMesh系统相比,TextMeshPro提供了更好的文本格式控制和布局管理功能。本文介绍了TMP_Text组件和Tmp字体资产(如何创建字体资产和如何解决缺字问题),还有一些高级功能可能在以后的时候完善.......
  • unity assetbundle 加载图集的所有sprite图片
     在Unity中,使用AssetBundle加载图集(Atlas)并获取其中的所有Sprite图片,通常需要以下步骤:1.打包图集到AssetBundle首先,确保你的图集(Atlas)已经被打包到AssetBundle中。图集通常是一个包含多个Sprite的纹理(Texture),并且每个Sprite都有对应的元数据(如UV坐标、Pi......
  • #渗透测试#网络安全# 一文搞懂什么是杀毒!!!
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。目录一、什么是杀毒杀毒软件的定义和功能二、杀毒软件的历......
  • 偶然看到Unity引擎中托管堆的扩展策略,于是想挖掘这个策略的巨大隐患
    导语Unity引擎中托管堆的扩展策略看起来非常不错,但是深究下去存在巨大隐患,下面我们带大家通过非常简单的案例让其暴露出来。unity引擎托管堆扩展策略在Unity引擎中,托管堆的扩展策略是一个重要的主题,尤其是在开发大型游戏或应用程序时。托管堆是用于存储托管对象的内存......
  • unity下零GC反射实现思路
    C#反射GC怎么产生的?C#的反射API确实在某些情况下会导致频繁的垃圾回收(GC),尤其是在使用MethodInfo.Invoke等方法时。反射API的设计使得值类型在传递时需要进行装箱(boxing),这会导致额外的内存分配,从而增加GC的压力。反射导致GC的原因装箱和拆箱:当值类型(如int、......
  • Unity Android 调用 so 卡死问题 (so 编译踩坑)
    问题描述把Unity工程编译到Android上运行后,出现了一个必现的界面卡死bug。表现为:每次轮到自己出大招时,必现界面卡死,但程序不会crash。在Unity编辑器和iOS下都无法重现。分析日志发现,卡死前最后调用了算法库中的一个函数。算法库是c++写的,用cmake组织,编译成......
  • Windows下Dll在Unity中使用的一般方式
    Windows下Dll在Unity中使用的一般方式Unity中虽然已经有广泛的库和插件,但是相较于C++的库生态而言,还是有一定的差距;因此本篇博文记录Windows下将C++函数打包成动态链接库在Unity中使用的一般方法。环境VisualStudio2019,Unity2022,Windows11,OpenCV说明Unity中有针对Wind......