2024-02-25 Unity 编辑器开发之编辑器拓展6 —— Event

文章目录

  • [1 Event 介绍](#1 Event 介绍)
  • [2 重要 API](#2 重要 API)
  • [3 代码示例](#3 代码示例)

1 Event 介绍

​ Event 提供许多属性和方法,允许检查和处理用户输入,主要用于 Unity 编辑器拓展开发。

​ Input 相关内容需要在运行时才能监听输入,而 Event 专门提供给编辑模式下使用,可以帮助检测鼠标键盘输入等事件相关操作,在 OnGUI 和 OnSceneView 中都能使用。

2 重要 API

API 说明
Event.current 获取当前事件。
Event.current.alt Alt 键是否按下。
Event.current.shift Shift 键是否按下 。
Event.current.control Ctrl 键是否按下。
Event.current.isMouse 是否是鼠标事件。
Event.current.button 判断鼠标左中右键,"0/1/2" 分别代表 "左/右/中"。 如果大于 2 可能是其他鼠标按键。
Event.current.mousePosition 鼠标位置。
Event.current.isKey 判断是否是键盘输入。
Event.current.character 获取键盘输入的字符。
Event.current.keyCode 获取键盘输入对应的 KeyCode。
Event.current.type 判断输入类型。EventType 中有常用的: 1. 鼠标按下抬起拖拽; 2. 键盘按下抬起 等等类型,一般进行比较判断相关的操作。
Event.current.capsLock 是否锁定大写 对应键盘上 Caps 键是否开启。
Event.current.command Windows 键或 Command 键是否按下。
Event.current.commandName 键盘事件字符串,用来判断是否触发了对应的键盘事件,返回值: Copy:拷贝; Paste:粘贴; Cut:剪切。
Event.current.delta 鼠标间隔移动距离。
Event.current.functionKey 是否是功能键输入,即小键盘中的 1. 方向键; 2. page up; 3. page down; 4. backspace 等等。
Event.current.numeric 小键盘是否开启。
Event.current.Use() 避免组合键冲突。 在处理完对应输入事件后,调用该方法,可以阻止事件继续派发,防止和 Unity 其他编辑器事件逻辑冲突。

​ 更多内容:https://docs.unity3d.com/ScriptReference/Event.html

3 代码示例

csharp 复制代码
public class Lesson21 : EditorWindow
{
    [MenuItem("Unity编辑器拓展/Lesson21/Event知识点学习")]
    private static void OpenLesson21() {
        Lesson21 win = EditorWindow.GetWindow<Lesson21>("Event知识学习");
        win.Show();
    }

    private void OnGUI() {
        //1.获取当前事件
        //  Event.current
        Event eve = Event.current;

        //2.alt键是否按下
        //  Event.current.alt
        if (eve.alt)
            Debug.Log("alt键按下了");

        //3.shift键是否按下
        //  Event.current.shift
        if (eve.shift)
            Debug.Log("shift键按下了");

        //4.ctrl键是否按下
        //  Event.current.control
        if (eve.control)
            Debug.Log("control键按下了");

        //5.是否是鼠标事件
        //  Event.current.isMouse
        if (eve.isMouse) {
            Debug.Log("鼠标相关事件");
            //6.判断鼠标左中右键
            //  Event.current.button (0,1,2 分别代表 左,右,中 如果大于2可能是其他鼠标按键)
            Debug.Log(eve.button);
            //7.鼠标位置
            //  Event.current.mousePosition
            Debug.Log("鼠标位置" + eve.mousePosition);
        }

        //8.判断是否是键盘输入
        //  Event.current.isKey
        if (eve.isKey) {
            Debug.Log("键盘相关事件");
            //9.获取键盘输入的字符
            //  Event.current.character
            Debug.Log(eve.character);
            //10.获取键盘输入对应的KeyCode
            //  Event.current.keyCode
            //Debug.Log(eve.keyCode);
            switch (eve.keyCode) {
                case KeyCode.Space:
                    Debug.Log("空格键输入");
                    break;
            }
        }

        //11.判断输入类型
        //  Event.current.type
        // EventType枚举和它比较即可
        // EventType中有常用的 鼠标按下抬起拖拽,键盘按下抬起等等类型
        // 一般会配合它 来判断 比如 键盘 鼠标的抬起按下相关的操作

        //12.是否锁定大写 对应键盘上caps键是否开启
        //  Event.current.capsLock
        if (eve.capsLock)
            Debug.Log("大小写锁定开启");
        else
            Debug.Log("大小写锁定关闭");

        //13.Windows键或Command键是否按下
        //  Event.current.command
        if (eve.command)
            Debug.Log("PC win键按下 或 Mac Command键按下");

        //14.键盘事件 字符串
        //  Event.current.commandName
        // 可以用来判断是否触发了对应的键盘事件
        // 返回值:
        // Copy:拷贝
        // Paste:粘贴
        // Cut:剪切
        if (eve.commandName == "Copy") {
            Debug.Log("按下了ctrl + c");
        }
        if (eve.commandName == "Paste") {
            Debug.Log("按下了ctrl + v");
        }
        if (eve.commandName == "Cut") {
            Debug.Log("按下了ctrl + x");
        }

        //15.鼠标间隔移动距离
        //  Event.current.delta

        //Debug.Log(eve.delta);

        //16.是否是功能键输入
        //  Event.current.functionKey
        //  功能键指小键盘中的 方向键, page up, page down, backspace等等
        if (eve.functionKey)
            Debug.Log("有功能按键输入");

        //17.小键盘是否开启
        //  Event.current.numeric
        if (eve.numeric)
            Debug.Log("小键盘是否开启");

        //18.避免组合键冲突
        //  Event.current.Use()
        //  在处理完对应输入事件后,调用该方法,可以阻止事件继续派发,放置和Unity其他编辑器事件逻辑冲突
        eve.Use();
    }
}
相关推荐
石榴树下的七彩鱼2 小时前
图片修复 API 接入实战:网站如何自动去除图片水印(Python / PHP / C# 示例)
图像处理·后端·python·c#·php·api·图片去水印
忒可君3 小时前
C# winform 自制分页功能
android·开发语言·c#
南無忘码至尊3 小时前
Unity学习90天 - 第 6天 - 学习协程 Coroutine并实现每隔 2 秒生成一波敌人
学习·unity·c#·游戏引擎
张老师带你学4 小时前
unity 老版本资源迁移,第一人称,完整城市,有出身点房内视图,有gun shop视图,urp
科技·游戏·unity·模型·游戏美术
何以解忧唯有撸码7 小时前
玩转控件:封装个带图片的Label控件
c#·winform·自定义控件·封装控件·控件扩展
xiaoshuaishuai87 小时前
C# 实现百度搜索算法逆向
开发语言·windows·c#·dubbo
深兰科技8 小时前
深兰科技与淡水河谷合作推进:矿区示范加速落地
java·人工智能·python·c#·scala·symfony·深兰科技
Webgiserin10 小时前
nvm+vscode配置安装暂记
ide·vscode·编辑器
我是唐青枫11 小时前
C#.NET ObjectPool 深入解析:对象复用、池化策略与使用边界
c#·.net
专职11 小时前
cursor中与vim插件冲突时的配置
编辑器·vim·excel