Unity 如何在 iOS 新增键盘 KeyCode 响应事件

news2024/10/12 14:58:30

1.定位到文件UnityView+Keyboard.mm同如下路径:

2.打开该Objective-C脚本进行编辑,找到关键函数: createKeyboard:

- (void)createKeyboard
{
    // only English keyboard layout is supported
    NSString* baseLayout = @"1234567890-=qwertyuiop[]asdfghjkl;'\\`zxcvbnm,./!@#$%^&*()_+{}:\"|<>?~ \t\r\b\\";
    NSString* numpadLayout = @"1234567890-=*+/.\r";
    NSString* upperCaseLetters = @"QWERTYUIOPASDFGHJKLZXCVBNM";

    size_t sizeOfKeyboardCommands = baseLayout.length + numpadLayout.length + upperCaseLetters.length + 11;
    NSMutableArray* commands = [NSMutableArray arrayWithCapacity: sizeOfKeyboardCommands];

    void (^addKey)(NSString *keyName, UIKeyModifierFlags modifierFlags) = ^(NSString *keyName, UIKeyModifierFlags modifierFlags)
    {
        UIKeyCommand* command = [UIKeyCommand keyCommandWithInput: keyName modifierFlags: modifierFlags action: @selector(handleCommand:)];
#if UNITY_HAS_IOSSDK_15_0
        if (@available(iOS 15.0, tvOS 15.0, *))
            command.wantsPriorityOverSystemBehavior = YES;
#endif
        [commands addObject:command];
    };

    for (NSInteger i = 0; i < baseLayout.length; ++i)
    {
        NSString* input = [baseLayout substringWithRange: NSMakeRange(i, 1)];
        NSLog(@"%@ !!!",input);
        addKey(input, kNilOptions);
    }
    for (NSInteger i = 0; i < numpadLayout.length; ++i)
    {
        NSString* input = [numpadLayout substringWithRange: NSMakeRange(i, 1)];
        addKey(input, UIKeyModifierNumericPad);
    }
    for (NSInteger i = 0; i < upperCaseLetters.length; ++i)
    {
        NSString* input = [upperCaseLetters substringWithRange: NSMakeRange(i, 1)];
        addKey(input, UIKeyModifierShift);
    }

    // pageUp, pageDown
    addKey(@"UIKeyInputPageUp", kNilOptions);
    addKey(@"UIKeyInputPageDown", kNilOptions);

    // up, down, left, right, esc
    addKey(UIKeyInputUpArrow, kNilOptions);
    addKey(UIKeyInputDownArrow, kNilOptions);
    addKey(UIKeyInputLeftArrow, kNilOptions);
    addKey(UIKeyInputRightArrow, kNilOptions);
    addKey(UIKeyInputEscape, kNilOptions);

    // caps Lock, shift, control, option, command
    addKey(@"", UIKeyModifierAlphaShift);
    addKey(@"", UIKeyModifierShift);
    addKey(@"", UIKeyModifierControl);
    addKey(@"", UIKeyModifierAlternate);
    addKey(@"", UIKeyModifierCommand);

    keyboardCommands = commands.copy;
}

此函数由Unity定义,通过addKey函数负责初始化注册所有需要响应的按键.

   void (^addKey)(NSString *keyName, UIKeyModifierFlags modifierFlags) = ^(NSString *keyName, UIKeyModifierFlags modifierFlags)
    {
        UIKeyCommand* command = [UIKeyCommand keyCommandWithInput: keyName modifierFlags: modifierFlags action: @selector(handleCommand:)];
#if UNITY_HAS_IOSSDK_15_0
        if (@available(iOS 15.0, tvOS 15.0, *))
            command.wantsPriorityOverSystemBehavior = YES;
#endif
        [commands addObject:command];
    };

函数接受两个参数第一个是keyName表示接收的按键名称例如键盘上的a-z,第二个参数为UIKeyModifierFlags表示作为Modifier的按键种类如下:

  typedef   NS_OPTIONS(NSInteger, UIKeyModifierFlags) {
      UIKeyModifierAlphaShift     = 1 << 16,  // This bit indicates CapsLock
      UIKeyModifierShift          = 1 << 17,
      UIKeyModifierControl        = 1 << 18,
      UIKeyModifierAlternate      = 1 << 19,
      UIKeyModifierCommand        = 1 << 20,
      UIKeyModifierNumericPad     = 1 << 21,
  } API_AVAILABLE(ios(7.0));

使用时例如用户需要接收处理command a,需调用addKey(@"a", UIKeyModifierCommand); 针对于特殊按键对应的NSString存储于UIResponder.h中:

// These are pre-defined constants for use with the input property of UIKeyCommand objects.
UIKIT_EXTERN NSString *const UIKeyInputUpArrow         API_AVAILABLE(ios(7.0));
UIKIT_EXTERN NSString *const UIKeyInputDownArrow       API_AVAILABLE(ios(7.0));
UIKIT_EXTERN NSString *const UIKeyInputLeftArrow       API_AVAILABLE(ios(7.0));
UIKIT_EXTERN NSString *const UIKeyInputRightArrow      API_AVAILABLE(ios(7.0));
UIKIT_EXTERN NSString *const UIKeyInputEscape          API_AVAILABLE(ios(7.0));
UIKIT_EXTERN NSString *const UIKeyInputPageUp          API_AVAILABLE(ios(8.0));
UIKIT_EXTERN NSString *const UIKeyInputPageDown        API_AVAILABLE(ios(8.0));
UIKIT_EXTERN NSString *const UIKeyInputHome            API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputEnd             API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF1              API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF1              API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF2              API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF3              API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF4              API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF5              API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF6              API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF7              API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF8              API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF9              API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF10             API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF11             API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputF12             API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
UIKIT_EXTERN NSString *const UIKeyInputDelete          API_AVAILABLE(ios(15.0), tvos(15.0)) API_UNAVAILABLE(watchos);

此文档以F1-F12按键添加为例:使用addKey(UIKeyInputF4, kNilOptions);

    addKey(UIKeyInputF1, kNilOptions);
    addKey(UIKeyInputF2, kNilOptions);
    addKey(UIKeyInputF3, kNilOptions);
    addKey(UIKeyInputF4, kNilOptions);
  1. 注册好按键后还需要在handleCommand函数中进行响应处理:

- (void)handleCommand:(UIKeyCommand *)command
{
    NSString* input = command.input;
    UIKeyModifierFlags modifierFlags = command.modifierFlags;

    char inputChar = ([input length] > 0) ? [input characterAtIndex: 0] : 0;
    int code = (int)inputChar; // ASCII code
    UnitySendKeyboardCommand(command);

    if (![self isValidCodeForButton: code])
    {
        code = 0;
    }

    if ((modifierFlags & UIKeyModifierAlphaShift) != 0)
        code = UnityStringToKey("caps lock");
    if ((modifierFlags & UIKeyModifierShift) != 0)
        code = UnityStringToKey("left shift");
    if ((modifierFlags & UIKeyModifierControl) != 0)
        code = UnityStringToKey("left ctrl");
    if ((modifierFlags & UIKeyModifierAlternate) != 0)
        code = UnityStringToKey("left alt");
    if ((modifierFlags & UIKeyModifierCommand) != 0)
        code = UnityStringToKey("left cmd");

    if ((modifierFlags & UIKeyModifierNumericPad) != 0)
    {
        switch (inputChar)
        {
            case '0':
                code = UnityStringToKey("[0]");
                break;
            case '1':
                code = UnityStringToKey("[1]");
                break;
            case '2':
                code = UnityStringToKey("[2]");
                break;
            case '3':
                code = UnityStringToKey("[3]");
                break;
            case '4':
                code = UnityStringToKey("[4]");
                break;
            case '5':
                code = UnityStringToKey("[5]");
                break;
            case '6':
                code = UnityStringToKey("[6]");
                break;
            case '7':
                code = UnityStringToKey("[7]");
                break;
            case '8':
                code = UnityStringToKey("[8]");
                break;
            case '9':
                code = UnityStringToKey("[9]");
                break;
            case '-':
                code = UnityStringToKey("[-]");
                break;
            case '=':
                code = UnityStringToKey("equals");
                break;
            case '*':
                code = UnityStringToKey("[*]");
                break;
            case '+':
                code = UnityStringToKey("[+]");
                break;
            case '/':
                code = UnityStringToKey("[/]");
                break;
            case '.':
                code = UnityStringToKey("[.]");
                break;
            case '\r':
                code = UnityStringToKey("enter");
                break;
            default:
                break;
        }
    }

    if (input == UIKeyInputUpArrow)
        code = UnityStringToKey("up");
    else if (input == UIKeyInputDownArrow)
        code = UnityStringToKey("down");
    else if (input == UIKeyInputRightArrow)
        code = UnityStringToKey("right");
    else if (input == UIKeyInputLeftArrow)
        code = UnityStringToKey("left");
    else if (input == UIKeyInputEscape)
        code = UnityStringToKey("escape");
    else if ([input isEqualToString: @"UIKeyInputPageUp"])
        code = UnityStringToKey("page up");
    else if ([input isEqualToString: @"UIKeyInputPageDown"])
        code = UnityStringToKey("page down");

    KeyMap::iterator item = GetKeyMap().find(code);
    if (item == GetKeyMap().end())
    {
        // New key is down, register it and its time
        UnitySetKeyboardKeyState(code, true);
        GetKeyMap()[code] = GetTimeInSeconds();
    }
    else
    {
        // Still holding the key, update its time
        item->second = GetTimeInSeconds();
    }
}

函数中input表示createKeyboard函数注册对应的keyName,modifierFlags表示注册时传入的modifierFlags.函数中的Code对应Unity的KeyCodeEnum:

using System;

namespace UnityEngine
{
    // Key codes returned by Event.keyCode. These map directly to a physical key on the keyboard.
    public enum KeyCode
    {
        // Not assigned (never returned as the result of a keystroke)
        None = 0,
        // The backspace key
        Backspace       = 8,
        // The forward delete key
        Delete      = 127,
        // The tab key
        Tab     = 9,
        // The Clear key
        Clear       = 12,
        // Return key
        Return      = 13,
        // Pause on PC machines
        Pause       = 19,
        // Escape key
        Escape      = 27,
        // Space key
        Space       = 32,

        // Numeric keypad 0
        Keypad0     = 256,
        // Numeric keypad 1
        Keypad1     = 257,

前添加判断并给code进行赋值即可,F1-F12对应282-294以此为例代码如下:

   if (input == UIKeyInputF1)
        code = 282;
    else if (input == UIKeyInputF2)
        code = 283;
    else if (input == UIKeyInputF3)
        code = 284;
 
  1. 测试结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2208189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】深入理解指针(二)(下)

本篇博客将讲解以下知识&#xff1a; 1、二级指针 2、指针数组 3、指针数组模拟二维数组 1、二级指针 指针变量也是变量&#xff0c;是变量就有地址&#xff0c;那指针变量的地址存放在哪里&#xff1f;二级指针 如何理解二级指针&#xff1f; 以上述代码为例&#xff1a; i…

多点无人机 组网系统技术详解

多点无人机组网系统技术&#xff0c;作为一种先进的多无人机协同作业技术&#xff0c;其核心在于通过先进的通信技术将多架无人机连接成一个高度协同的空中网络&#xff0c;以实现信息共享、任务分配、协同作业等功能。以下是对该技术的详细解析&#xff1a; 一、技术概述 多…

基于SSM的朋辈帮扶系统

文未可获取一份本项目的java源码和数据库参考。 一、本课题研究意义 随着市场经济发展的不断深入&#xff0c;高校学生面临着新的问题和挑战。在全球一体化、价值观多元化、信息网络化的大背景下&#xff0c;越来越多的学生承受着来自社会、家庭与自身方方面面的压力&#xf…

在word/wps中优雅的插入代码

​​​​​​​使用的网址如下&#xff1a;在线美化代码并支持一键黏贴到文档中 使用方式&#xff1a; 1、登录到在线网页中&#xff0c;输入需要格式化的语言&#xff0c;例如JSON 2、点击高亮代码&#xff0c;即可生成格式化后的JSON代码 3、将生成的代码直接复制到wps文档…

软件功能测试重点和流程有哪些?专业软件测评服务公司推荐

软件功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。功能测试也叫黑盒测试或数据驱动测试&#xff0c;只需考虑需要测试的各个功能&#xff0c;不需要考虑整个软件的内部结构及代码.一般从软…

uniapp__微信小程序使用秋云ucharts折线图双轴

1、子组件 <template><view class"charts-box"><qiun-data-charts type"line":opts"computedOpts":chartData"chartData"/></view> </template><script> export default {props: {chartData: {t…

什么充电宝牌子质量好又靠谱?2024年热销款充电宝型号推荐

在快节奏的现代生活中&#xff0c;充电宝已成为我们随身携带的必需品&#xff0c;为智能手机、平板电脑等电子设备提供随时随地的电力支持。然而&#xff0c;面对市场上琳琅满目的充电宝品牌和型号&#xff0c;如何挑选一款既质量好又靠谱的产品&#xff0c;成为了许多消费者关…

六西格玛黑带项目:TBX-02无人机飞行稳定性提升——张驰咨询

一、项目背景与问题定义 TBX-02是该公司最新发布的消费级无人机&#xff0c;面向摄影爱好者和户外探险者。产品上市后&#xff0c;通过客户反馈和实际测试数据发现&#xff0c;该无人机在复杂飞行环境中&#xff0c;如强风或快速移动时&#xff0c;存在明显的飞行抖动和稳定性…

多线程会在一个事务里面吗?

目录 多线程会在一个事务里面吗&#xff1f; 多线程、数据库事务以及数据库连接之间的关系 Spring的事务管理​​​​​​​ 声明式事务Transactional的实现原理 声明式事务Transactional的失效场景 Transactional注解的方法不是public为什么会失效 Spring AOP的代理机制…

STM32CUBEIDE FreeRTOS操作教程(六):recursive mutexes递归互斥信号量

STM32CUBEIDE FreeRTOS操作教程&#xff08;六&#xff09;&#xff1a;recursive mutexes互斥信号量 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开…

【devops】x-ui 实现一键安装 x-ray 打造高速国际冲浪 | xray管理平台

一、部署X-UI篇 1、Github 地址&说明 github地址如下&#xff1a; https://github.com/FranzKafkaYu/x-ui?tabreadme-ov-file 2、一键部署 2.1、更新并安装curl #Ubuntu、Deibian系统 apt update && apt upgrade -y apt install curl -y #CentOS7 系统 yum…

深度解读企业数字化转型中的关键问题与解决方案

1. 数字优先的力量&#xff1a;如何通过文化变革推动企业迈向数字化未来 数字化转型的核心驱动力 数字优先策略是现代企业应对数字化转型挑战的关键&#xff0c;但其复杂性远超一般技术策略。企业通过将数字优先文化嵌入业务模型&#xff0c;可以在跨部门合作、运营优化和创新…

锐捷园区交换、无线领跑教育行业,以太彩光助力教育网络革新

IDC报告显示,2024年上半年,锐捷园区交换和无线在教育行业市场份额获双第一。 锐捷极简以太彩光:教育网络革新方案 以太彩光的技术创新,为教育数字化承载网络提供了更高效、稳定、简运维的前瞻性网络解决方案。2024年,锐捷极简以太全光3.X方案再次升级,同时支持光改、光混、彩光…

基于VHDL语言的乒乓游戏机电路的设计(毕业论文)

目录 1绪论 1 1.1课题的背景和目的意义 1 1.2国内外研究现状 2 1.3课题研究的内容和创新点 3 1.3.1 研究内容 3 1.3.2研究创新点 3 2开发工具简介 4 2.1 EDA技术概述 4 2.1.1 EDA技术及其发展 4 2.1.2 EDA技术的优势 4 2.1.3 EDA设计流程 5 2.1.4 EDA工具 5 2.1.5 EDA的发展趋势…

固体废物处理(一)——MDPI特刊推荐

特刊征稿 01 期刊名称&#xff1a; Advances in Organic Solid Waste and Wastewater Management 截止时间&#xff1a; 投稿截止日期&#xff1a;11月30日2024 目标及范围&#xff1a; 本主题旨在收集有关有机固体废物和废水管理最新进展的贡献。感兴趣的主题包括与废水…

专线监控方案:运维团队的实战指南

在当前的数字化时代&#xff0c;专线网络已成为企业连接各地分支机构、实现业务协同与数据共享的重要桥梁。然而&#xff0c;随着业务的不断扩展和网络环境的日益复杂&#xff0c;专线网络的稳定性和可靠性面临着前所未有的挑战。为了保障专线网络的顺畅运行&#xff0c;减少潜…

Ivanti Connect Secure SSRF to RCE复现(CVE-2024-21893)

0x01 产品描述&#xff1a; Ivanti Connect Secure是一款企业级远程访问解决方案&#xff0c;提供安全远程访问&#xff08;VPN&#xff09;、多因素认证等功能。Ivanti Connect Secure具备先进的零信任访问能力&#xff0c;包括验证用户、验证设备、控制访问和保护数据。它适用…

jupyterlab的安装与使用攻略/包括汉化方法

官网链接 Project Jupyter | Home 1.第一步安装 打开控制台 使用pip工具安装 pip install jupyterlab 如图 2.安装成功后启动 jupyter lab 会自动启动它的web页面 然后就可以正常使用咯&#xff01;&#xff01; 如果需要更换浏览器访问 新开控制台执行下面命令 jupy…

图论day59|并查集理论基础、107.寻找存在的路径(卡码网)

图论day59|并查集理论基础、107.寻找存在的路径&#xff08;卡码网&#xff09; 并查集理论基础107.寻找存在的路径&#xff08;卡码网&#xff09; 并查集理论基础 使用场景&#xff1a; 当需要判断两个元素是否在同一个集合里的时候&#xff0c;我们就要想到用并查集 主要功…

到 2029 年,人工智能驱动的电子商务欺诈将超过 1070 亿美元

随着人工智能生成的深度伪造产品的使用日益增多&#xff0c;电子商务欺诈行为急剧增加&#xff0c;给在线商家带来了前所未有的安全挑战。 研究公司 Juniper 的一份报告预测&#xff0c;全球损失将增加 141%&#xff0c;从 2024 年的 440 亿美元增至 2029 年的惊人的 1070 亿美…