当前位置: 首页 > news >正文

Babylon 编辑器快捷键小记

一、最终代码(带满屏注释)

// Babylon.js 键盘事件枚举
import { KeyboardEventTypes } from "@babylonjs/core";
// 全局事件总线(mitt)
import { emitter } from "../../utils/EventBus";
// 编辑器系统,内部有 keyboardController
import type { EditorSystem } from "../EditorSystem";/*** 快捷键管理器* 职责:* 1. 监听键盘事件* 2. 根据规则分发事件到 EventBus* 3. 支持单键 & Ctrl+? 组合键*/
export class ShortCutsManager {// 编辑器引用,主要用来拿 keyboardControllerprivate _editorSystem: EditorSystem;/*** 单键映射* key -> EventName*/private _shortcutDictionary: ShortcutDictionary = {q: "selectMode",w: "moveMode",e: "rotateMode",r: "scaleMode",delete: "openDeleteConfirm"};/*** Ctrl+? 组合键映射* 仅记录“字母部分”,判断时再加前缀 "Control"*/private _ctrlShortcutDictionary: ShortcutDictionary = {s: "saveScene", // Ctrl+So: "openScene", // Ctrl+On: "newScene",  // Ctrl+Nz: "undo",      // Ctrl+Zy: "redo"       // Ctrl+Y};constructor(editorSystem: EditorSystem) {this._editorSystem = editorSystem;this._init();}/** 初始化:注册键盘事件 */private _init(): void {const keyboardController = this._editorSystem.keyboardController;if (!keyboardController) {console.error("GlobalKeyboardController is not initialized.");return;}// 监听所有 KEYDOWN 事件keyboardController.addListener(KeyboardEventTypes.KEYDOWN, () => {// 当前按下的单个字符(已转成小写)const onlyKey = keyboardController.pressedSingleNormalKey?.trim().toLowerCase();if (!onlyKey) return; // 没按字符键直接返回// ---------- 组合键优先 ----------if (keyboardController.isModifierKeysCombined(["Control"])) {const eventName = this._ctrlShortcutDictionary[onlyKey];if (eventName) {emitter.emit(eventName);return; // 命中组合键后不再走单键}}// ---------- 单键 ----------const eventName = this._shortcutDictionary[onlyKey];if (eventName) {emitter.emit(eventName);}});}
}/** 字典类型:string -> string */
interface ShortcutDictionary {[key: string]: string;
}

二、怎么用

任意地方监听

import { emitter } from '@/utils/EventBus';emitter.on('undo', () => console.log('撤销'));
emitter.on('saveScene', () => scene.save());
http://www.dtcms.com/a/362639.html

相关文章:

  • 临时邮箱地址获取服务器邮件工作流程与实现
  • Coze源码分析-工作空间-资源查询-后端源码
  • vue2滑块验证
  • 2025年IT行业女性职业发展证书选择指南
  • 从零开始在Ubuntu上快速部署Docker和Dify:结合 Dify + 蓝耘 MaaS平台打造 AI 应用实战指南
  • 网络准入控制,阻断违规外联-企业内网安全的第一道防线
  • 2025 随身 WIFI 行业报告:从拼参数到重体验,华为 / 格行 / 中兴技术差异化路径解析
  • 华为HCIE认证:三年有效期值不值得?
  • 腾讯会议的最佳替代者:Jitsi Meet 安装指南-支持onlyoffice集成
  • 第三方软件测试机构【多语言开发(PHP/Java/Python)WEB 应用的安全专业测试流程】
  • 【图像处理基石】图像预处理方面有哪些经典的算法?
  • Leetcode_206.反转链表(递归)
  • 学习日记-SpringMVC-day48-9.2
  • JS 秒转换成 MM:SS 格式
  • leetcode算法刷题的第二十四天
  • 破解数字化困局:五层双闭环治理模型详解
  • AV1 HEADERS详解
  • Linux - 进程切换 进程调渡
  • Redis 持久化机制详解
  • GD32入门到实战27--传感器任务框架搭建
  • 域内横向移动
  • AI 生成视频入门:用 Pika Labs+Runway ML 制作短内容
  • C++ numeric库简介与使用指南
  • 【LeetCode】1792. 最大平均通过率(康复-T1)
  • 校企合作| 长春大学旅游学院副董事长张海涛率队到访卓翼智能,共绘无人机技术赋能“AI+文旅”发展新蓝图
  • DAG与云计算任务调度优化
  • 【android bluetooth 协议分析 21】【ble 介绍 3】【ble acl Supervision Timeout 介绍】
  • 无人机系统理论基础(有课件)
  • 无人机小尺寸RFSOC ZU47DR板卡
  • 无人机传感器技术要点与难点解析