讲师中心 微信公众号
AI工具推荐 视频效率加速

Tampermonkey脚本在Unity Canvas上模拟按键的完整指南

秋涛小哥_2684

秋涛小哥_2684

发布时间:2025-09-27 13:19:10

|

543人浏览过

|

来源于php中文网

原创

Tampermonkey脚本在Unity Canvas上模拟按键的完整指南

本文针对Tampermonkey脚本无法在Unity Canvas上通过复选框触发按键模拟的问题,提供了详细的解决方案。内容涵盖KeyboardEvent的正确构建、事件派发目标的选择、焦点处理以及模拟按键序列的技巧,旨在帮助开发者实现稳定可靠的Web游戏交互。

引言:Tampermonkey与Web游戏交互

tampermonkey作为一款强大的浏览器扩展,允许用户通过编写javascript脚本来修改网页行为、增强功能或自动化任务。在web游戏领域,它常被用于创建自定义ui、自动化操作或改善游戏体验。其中,模拟键盘按键是实现自动化操作的关键一环,例如在unity webgl构建的游戏中,通过脚本控制角色移动或执行特定动作。然而,模拟按键并非简单地派发一个事件即可,尤其是在复杂的web应用(如unity canvas)中,需要考虑诸多细节。

问题剖析:复选框无法驱动按键模拟

用户遇到的问题是,在Tampermonkey脚本中创建了一个自定义的UI面板,包含一个“Pumping Energy”复选框。其预期是当复选框被选中时,脚本能模拟按下“A”键(keyCode 65),从而在unity-canvas元素上控制游戏角色移动。然而,尽管控制台输出了“on”信息,角色却没有实际移动。

原始脚本的关键部分如下:

// ... (panel and checkbox creation) ...

checkbox1.addEventListener('change', function() {
    if (this.checked) {
        console.log("on");
        var canvas = document.getElementById('unity-canvas');
        simulateKeyPress(canvas, 65); // Attempt to simulate 'A' key
    } else {
        console.log("off");
    }
});

function simulateKeyPress(canvas, keyCode) {
    var keyboardEvent = new KeyboardEvent('keydown', { keyCode: keyCode }); // Deprecated keyCode
    console.log(keyboardEvent)
    canvas.dispatchEvent(keyboardEvent); // Dispatch to canvas
}

从代码来看,checkbox1.addEventListener的语法是正确的,它能监听复选框的状态变化。问题更可能出在simulateKeyPress函数的实现上,或者事件派发的目标与方式上,导致Unity游戏未能正确接收和处理模拟的按键事件。

深入理解KeyboardEvent与按键模拟

要成功模拟键盘事件,我们需要全面理解KeyboardEvent的构造及其派发机制。

KeyboardEvent的完整构建

KeyboardEvent构造函数在现代浏览器中提供了丰富的选项,而不仅仅是keyCode。keyCode已被弃用,推荐使用key和code属性。游戏引擎(包括Unity)可能会依赖这些更现代的属性来识别按键。

以下是一个更健壮的KeyboardEvent构造示例,包含了常用且重要的属性:

function createKeyboardEvent(type, key, code, keyCode, options = {}) {
    const defaultOptions = {
        key: key,
        code: code,
        keyCode: keyCode, // 兼容旧系统,但已废弃
        which: keyCode,   // 兼容旧系统,但已废弃
        bubbles: true,    // 事件是否会冒泡
        cancelable: true, // 事件是否可取消
        composed: true,   // 针对Shadow DOM
        shiftKey: false,
        altKey: false,
        ctrlKey: false,
        metaKey: false,
        // 其他可选属性,如location, repeat等
    };

    const eventOptions = { ...defaultOptions, ...options };
    return new KeyboardEvent(type, eventOptions);
}

对于“A”键,其key通常是'a'或'A',code是'KeyA',keyCode是65。在模拟时,建议同时设置这些属性以确保最大兼容性。

html-to-pptx-converter
html-to-pptx-converter

使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。

下载

事件派发目标的选择

原始脚本将事件派发到canvas元素 (canvas.dispatchEvent(keyboardEvent);)。然而,许多Web游戏(尤其是基于window或document监听全局按键事件的游戏)可能不会在特定的canvas元素上直接监听KeyboardEvent。

  • canvas元素: 当按键事件需要直接作用于canvas内部的特定逻辑时使用。
  • document对象: 许多应用程序会监听document上的全局按键事件。
  • window对象: 最顶层的全局对象,通常用于捕获所有按键事件,无论焦点在哪里。

通常,将事件派发到document或window会更有效,因为它们是按键事件的常见监听者。

焦点的重要性

浏览器中的按键事件通常只在具有焦点的元素上触发。如果unity-canvas元素没有获得焦点,即使派发了事件,游戏也可能不会响应。在模拟按键之前,确保目标元素获得焦点是至关重要的一步。

canvas.focus(); // 尝试让canvas获得焦点

按键序列与时序

真实的按键操作包含“按下”(keydown)和“释放”(keyup)两个阶段。仅仅派发一个keydown事件可能不足以触发某些游戏逻辑,或者游戏可能期望在keydown和keyup之间存在一个短暂的间隔。

为了更真实地模拟按键,建议派发一个keydown事件,稍作延迟后,再派发一个keyup事件。

优化后的按键模拟方案

综合上述分析,我们可以构建一个更完善的按键模拟函数,并将其集成到Tampermonkey脚本中。

改进后的按键模拟函数

/**
 * 模拟键盘按键操作
 * @param {HTMLElement} targetElement - 派发事件的目标元素(通常是document或window)
 * @param {string} keyChar - 按键的字符表示(如 'a', 'd')
 * @param {number} duration - 按键按下的持续时间(毫秒),用于模拟按下和释放
 */
function simulateFullKeyPress(targetElement, keyChar, duration = 100) {
    let code;
    let keyCode;

    // 根据keyChar确定key, code, keyCode,确保兼容性
    switch (keyChar.toLowerCase()) {
        case 'a':
            keyChar = 'a';
            code = 'KeyA';
            keyCode = 65;
            break;
        case 'd':
            keyChar = 'd';
            code = 'KeyD';
            keyCode = 68;
            break;
        // 可根据需要添加更多按键映射
        default:
            console.warn(`未知的按键字符: ${keyChar}`);
            return;
    }

    const commonOptions = {
        key: keyChar,
        code: code,
        keyCode: keyCode,
        which: keyCode,
        bubbles: true,
        cancelable: true,
        composed: true,
    };

    // 1. 派发 keydown 事件
    const keydownEvent = new KeyboardEvent('keydown', commonOptions);
    targetElement.dispatchEvent(keydownEvent);
    console.log(`Dispatched keydown for ${keyChar} on`, targetElement);

    // 2. 延迟后派发 keyup 事件
    setTimeout(() => {
        const keyupEvent = new KeyboardEvent('keyup', commonOptions);
        targetElement.dispatchEvent(keyupEvent);
        console.log(`Dispatched keyup for ${keyChar} on`, targetElement);
    }, duration);
}

集成到Tampermonkey脚本

将上述simulateFullKeyPress函数集成到Tampermonkey脚本中,并调整事件监听器,使其在复选框选中时,首先确保Unity Canvas获得焦点,然后模拟按键。

// ==UserScript==
// @name         Erz Online Energy Pump (Optimized)
// @namespace    https://app.erz.online/
// @version      2
// @description  Adds a panel to the lower right corner of the screen on https://app.erz.online/ with a checkbox labeled 'pumping energy' that activates pressing the 'A' and 'D' keys to move in the game.
// @match        https://app.erz.online/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 创建并添加面板和复选框
    const panel = document.createElement('div');
    panel.style.position = 'fixed';
    panel.style.bottom = '100px';
    panel.style.right = '0';
    panel.style.width = '200px';
    panel.style.height = '100px';
    panel.style.backgroundColor = '#262626';
    panel.style.borderRadius = '5px';
    panel.style.padding = '10px';
    panel.style.boxShadow = '2px 2px 5px rgba(0, 0, 0, 0.3)';
    panel.style.zIndex = '10000'; // 确保在最上层

    const checkbox1 = document.createElement('input');
    checkbox1.type = 'checkbox';
    checkbox1.id = 'pumping-energy';
    checkbox1.style.marginRight = '10px';

    const label1 = document.createElement('label');
    label1.htmlFor = 'pumping-energy';
    label1.style.color = "#ffffff";
    label1.innerText = 'Pumping Energy';

    panel.appendChild(checkbox1);
    panel.appendChild(label1);

    document.body.appendChild(panel);

    // 模拟按键的核心逻辑
    let pumpingInterval = null; // 用于存储按键循环的定时器ID

    /**
     * 模拟键盘按键操作
     * @param {HTMLElement} targetElement - 派发事件的目标元素(通常是document或window)
     * @param {string} keyChar - 按键的字符表示(如 'a', 'd')
     * @param {number} duration - 按键按下的持续时间(毫秒),用于模拟按下和释放
     */
    function simulateFullKeyPress(targetElement, keyChar, duration = 100) {
        let code;
        let keyCode;

        switch (keyChar.toLowerCase()) {
            case 'a':
                keyChar = 'a';
                code = 'KeyA';
                keyCode = 65;
                break;
            case 'd':
                keyChar = 'd';
                code

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

4171

2023.10.23

canva可画使用技巧汇总
canva可画使用技巧汇总

本专题汇集了PHP中文网精心整理的Canva可画新手使用技巧大全,专为零基础用户打造。无论你是想制作精美海报、PPT还是社交媒体配图,这里都有从注册登录、模板搜索到AI辅助设计、导出分享的全流程保姆级教程。通过深入浅出的图文指南,帮助你快速跨越设计门槛,轻松掌握Canva可画的实用操作,让每个人都能成为设计达人!

264

2026.05.19

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

486

2025.12.13

Figma AI自动化智能数据填充与交互生成实战
Figma AI自动化智能数据填充与交互生成实战

告别机械重复,详细演示如何用 AI 填充业务真实数据,并自动为页面添加交互连线,将静态设计稿快速转变为动态原型。

305

2026.05.13

unity是什么软件
unity是什么软件

Unity是一款强大而易于使用的游戏开发引擎,它为开发者提供了一套完整的工具和技术,使他们能够创建各种类型的游戏和交互式内容。本专题为大家提供unity相关的各种文章、以及下载和课程。

391

2023.08.09

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

329

2026.04.13

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

20

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

20

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.2万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn