You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Lua中发送键盘按下与抬起事件?

自动触发E键操作的整蛊脚本实现

下面分不同场景给出具体实现方案,直接模拟E键的按下/抬起事件,或者直接调用交互逻辑来达到整蛊效果:

Unity 平台实现

方式1:直接调用交互逻辑(更稳定,无需模拟系统按键)

如果你的玩家交互逻辑已经封装成方法(比如开门、上车的统一触发方法),可以直接循环调用该方法:

using UnityEngine;
using System.Threading;

public class TrollInteraction : MonoBehaviour
{
    public float toggleDelay = 1f; // 两次操作的间隔时间
    private bool isRunning = true;

    void Start()
    {
        // 开启后台线程循环触发
        new Thread(() =>
        {
            while (isRunning)
            {
                // 调用玩家的交互方法(替换成你项目里的实际方法)
                PlayerController.Instance.TriggerInteraction();
                Thread.Sleep((int)(toggleDelay * 1000));
            }
        }).Start();
    }

    void OnDestroy()
    {
        isRunning = false;
    }
}

注:假设玩家交互逻辑在PlayerController单例类的TriggerInteraction()方法中

方式2:模拟系统级E键输入(适用于需要真实按键事件的场景)

通过Windows API直接模拟E键的按下和抬起动作:

using UnityEngine;
using System.Runtime.InteropServices;
using System.Threading;

public class TrollKeySimulator : MonoBehaviour
{
    public float interval = 0.8f;
    private bool running = true;

    [DllImport("user32.dll")]
    private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

    private const byte VK_E = 0x45;
    private const uint KEY_DOWN = 0x0000;
    private const uint KEY_UP = 0x0002;

    void Start()
    {
        new Thread(() =>
        {
            while (running)
            {
                // 按下E键
                keybd_event(VK_E, 0, KEY_DOWN, 0);
                Thread.Sleep(100); // 保持按键按下100毫秒
                // 抬起E键
                keybd_event(VK_E, 0, KEY_UP, 0);
                Thread.Sleep((int)(interval * 1000));
            }
        }).Start();
    }

    void OnDestroy()
    {
        running = false;
    }
}

Unreal Engine 平台实现

方式1:直接调用交互函数

在C++中通过定时器循环触发玩家交互逻辑:

#include "TrollActor.h"
#include "Kismet/GameplayStatics.h"
#include "PlayerCharacter.h"

ATrollActor::ATrollActor()
{
    PrimaryActorTick.bCanEverTick = false;
}

void ATrollActor::BeginPlay()
{
    Super::BeginPlay();
    // 设置定时器,每1秒触发一次交互
    GetWorld()->GetTimerManager().SetTimer(TrollTimer, this, &ATrollActor::TriggerPlayerInteraction, 1.0f, true);
}

void ATrollActor::TriggerPlayerInteraction()
{
    APlayerCharacter* Player = Cast<APlayerCharacter>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
    if (Player)
    {
        Player->PerformInteraction(); // 调用玩家的交互方法
    }
}

void ATrollActor::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    GetWorld()->GetTimerManager().ClearTimer(TrollTimer);
    Super::EndPlay(EndPlayReason);
}

方式2:模拟系统按键

通过Windows API在UE中模拟E键输入:

#include "TrollKeySender.h"
#include "Windows/WindowsHWrapper.h"

ATrollKeySender::ATrollKeySender()
{
    PrimaryActorTick.bCanEverTick = false;
}

void ATrollKeySender::BeginPlay()
{
    Super::BeginPlay();
    GetWorld()->GetTimerManager().SetTimer(KeyTimer, this, &ATrollKeySender::SimulateEKey, 0.8f, true);
}

void ATrollKeySender::SimulateEKey()
{
    // 按下E键
    keybd_event(0x45, 0, 0, 0);
    FPlatformProcess::Sleep(0.1f);
    // 抬起E键
    keybd_event(0x45, 0, KEYEVENTF_KEYUP, 0);
}

void ATrollKeySender::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    GetWorld()->GetTimerManager().ClearTimer(KeyTimer);
    Super::EndPlay(EndPlayReason);
}

外部脚本方案(AutoHotkey,适用所有PC游戏)

无需修改游戏代码,用AutoHotkey编写脚本直接模拟按键:

SetTimer, TriggerE, 800 ; 每800毫秒触发一次E键操作
return

TriggerE:
    Send {E down}
    Sleep 100
    Send {E up}
return

Esc::ExitApp ; 按ESC键停止脚本

将代码保存为.ahk格式文件,安装AutoHotkey后运行即可

内容的提问来源于stack exchange,提问作者Leo Cheng SC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:10:32