在网页端运行的Unity游戏,很多场景下需要通过Tampermonkey脚本实现自动化操作,其中控制玩家移动是最基础的需求。但直接在Tampermonkey中触发普通的键盘事件,往往无法被Unity游戏正确捕获,导致玩家角色没有移动反应。这是因为Unity的WebGL构建版本对输入事件的捕获有特定的要求,需要模拟符合其规范的键盘事件才能生效。

Unity游戏输入事件的基本特性
Unity WebGL版本在网页中运行时,会监听浏览器传递的原生输入事件,但会对事件的属性做严格校验。普通的KeyboardEvent如果缺少必要的属性,或者触发流程不符合预期,都会被Unity忽略。常见的校验点包括事件的isTrusted属性、事件的触发顺序以及按键对应的键值是否正确。
Tampermonkey中模拟键盘事件的核心步骤
要让Unity游戏识别到模拟的键盘事件,需要按照以下流程实现:
- 构造符合规范的
KeyboardEvent对象,设置正确的键值、键码等属性 - 按照按下、持续、抬起的正确顺序触发事件
- 将事件派发到Unity游戏所在的canvas元素或者document对象上
事件构造的关键属性
构造事件时需要设置以下核心属性,确保Unity能够识别:
| 属性名 | 说明 | 示例值 |
|---|---|---|
| key | 按键对应的键值字符串 | w |
| code | 按键的物理代码 | KeyW |
| keyCode | 按键对应的键码,部分Unity版本依赖该属性 | 87 |
| bubbles | 事件是否冒泡,需要设置为true | true |
| cancelable | 事件是否可取消,需要设置为true | true |
完整实现代码
以下是一个控制Unity游戏玩家向前移动的Tampermonkey脚本示例,模拟按下W键的操作:
// ==UserScript==
// @name Unity游戏玩家移动控制
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 模拟键盘事件控制Unity游戏玩家移动
// @author 开发者
// @match *://*/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 获取Unity游戏所在的canvas元素,若找不到则使用document
function getUnityCanvas() {
const canvasList = document.querySelectorAll('canvas');
if (canvasList.length > 0) {
return canvasList[0];
}
return document;
}
// 模拟键盘按下事件
function simulateKeyDown(key, code, keyCode) {
const event = new KeyboardEvent('keydown', {
key: key,
code: code,
keyCode: keyCode,
which: keyCode,
bubbles: true,
cancelable: true
});
// 修复部分浏览器keyCode不生效的问题
Object.defineProperty(event, 'keyCode', { value: keyCode });
Object.defineProperty(event, 'which', { value: keyCode });
const target = getUnityCanvas();
target.dispatchEvent(event);
console.log('触发按下事件:' + key);
}
// 模拟键盘抬起事件
function simulateKeyUp(key, code, keyCode) {
const event = new KeyboardEvent('keyup', {
key: key,
code: code,
keyCode: keyCode,
which: keyCode,
bubbles: true,
cancelable: true
});
Object.defineProperty(event, 'keyCode', { value: keyCode });
Object.defineProperty(event, 'which', { value: keyCode });
const target = getUnityCanvas();
target.dispatchEvent(event);
console.log('触发抬起事件:' + key);
}
// 模拟长按W键实现玩家向前移动
function moveForward() {
const key = 'w';
const code = 'KeyW';
const keyCode = 87;
// 按下W键
simulateKeyDown(key, code, keyCode);
// 持续按下状态,每隔100ms触发一次重复按下事件,模拟长按
const pressInterval = setInterval(() => {
simulateKeyDown(key, code, keyCode);
}, 100);
// 5秒后停止移动
setTimeout(() => {
clearInterval(pressInterval);
// 抬起W键
simulateKeyUp(key, code, keyCode);
console.log('停止移动');
}, 5000);
}
// 页面加载完成后执行移动操作
window.addEventListener('load', () => {
setTimeout(moveForward, 2000);
});
})();
常见问题排查
如果脚本运行后玩家仍然没有移动,可以按照以下方向排查:
- 确认事件派发的目标是否正确,部分Unity游戏需要把事件派发到特定的canvas元素上
- 检查键值、键码是否和Unity中配置的按键一致,比如部分游戏可能使用方向键而不是WASD
- 测试事件是否被浏览器或者其他插件拦截,可以尝试在事件触发前后打印日志确认执行流程
- 如果是较新的Unity版本,可能需要同时触发
input事件配合键盘事件才能生效
注意事项
模拟键盘事件仅适用于个人学习、自动化测试等合法场景,不要用于破坏游戏公平性的作弊场景。不同版本的Unity WebGL构建对输入事件的兼容可能存在差异,实际使用时需要根据具体游戏调整事件的属性和派发逻辑。
TampermonkeyUnity游戏键盘事件模拟玩家移动修改时间:2026-06-20 02:51:34