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

Unity开发:桌面键盘正常但Android端输入异常问题求助

解决Unity Wordle类游戏Android端键盘唤起与输入同步问题

核心问题拆解

你遇到的两个核心问题:

  • Android端TouchScreenKeyboard默认显示输入框,需要隐藏
  • 移动端软键盘输入无法通过Input.GetKeyDown捕获,需改用TouchScreenKeyboard专属API监听输入

解决方案代码实现

以下是兼顾桌面端和Android端的完整可运行代码:

using UnityEngine;

public class WordInputHandler : MonoBehaviour
{
    // 桌面端支持的字母按键列表
    private static readonly KeyCode[] SUPPORTED_KEYS = new KeyCode[] {
        KeyCode.A, KeyCode.B, KeyCode.C, KeyCode.D, KeyCode.E, KeyCode.F,
        KeyCode.G, KeyCode.H, KeyCode.I, KeyCode.J, KeyCode.K, KeyCode.L,
        KeyCode.M, KeyCode.N, KeyCode.O, KeyCode.P, KeyCode.Q, KeyCode.R,
        KeyCode.S, KeyCode.T, KeyCode.U, KeyCode.V, KeyCode.W, KeyCode.X,
        KeyCode.Y, KeyCode.Z
    };

    private TouchScreenKeyboard _mobileKeyboard;
    private string _lastKeyboardText = ""; // 记录上一次输入内容,用于对比输入变化

    void Start()
    {
        // 游戏启动时唤起Android软键盘(也可改为点击方块时触发)
        #if UNITY_ANDROID && !UNITY_EDITOR
            _mobileKeyboard = TouchScreenKeyboard.Open("", TouchScreenKeyboardType.Default);
            _mobileKeyboard.hidden = true; // 隐藏默认输入框
        #endif
    }

    void Update()
    {
        #if UNITY_STANDALONE || UNITY_EDITOR
            // 桌面端逻辑:监听硬件键盘输入
            HandleDesktopInput();
        #elif UNITY_ANDROID
            // Android端逻辑:监听软键盘输入
            HandleMobileInput();
        #endif
    }

    private void HandleDesktopInput()
    {
        foreach (var key in SUPPORTED_KEYS)
        {
            if (Input.GetKeyDown(key))
            {
                InsertLetterIntoGrid(key.ToString());
                break;
            }
        }

        // 处理退格键
        if (Input.GetKeyDown(KeyCode.Backspace))
        {
            RemoveLastLetterFromGrid();
        }
    }

    private void HandleMobileInput()
    {
        if (_mobileKeyboard == null || !_mobileKeyboard.active) return;

        // 通过对比文本变化判断输入操作
        if (_mobileKeyboard.text != _lastKeyboardText)
        {
            int lengthDiff = _mobileKeyboard.text.Length - _lastKeyboardText.Length;

            if (lengthDiff == 1)
            {
                // 提取新增的最后一个字符
                string newLetter = _mobileKeyboard.text.Substring(_lastKeyboardText.Length, 1);
                InsertLetterIntoGrid(newLetter.ToUpper());
            }
            else if (lengthDiff < 0)
            {
                // 用户执行了删除操作
                RemoveLastLetterFromGrid();
            }

            _lastKeyboardText = _mobileKeyboard.text;
        }
    }

    // ------------------- 替换为你的游戏逻辑方法 -------------------
    private void InsertLetterIntoGrid(string letter)
    {
        // 在这里实现:找到当前可输入的方块,设置显示字母
        Debug.Log($"插入字母: {letter}");
    }

    private void RemoveLastLetterFromGrid()
    {
        // 在这里实现:删除最后一个已输入方块的字母
        Debug.Log("删除最后一个字母");
    }
}

关键细节说明

  1. 隐藏Android输入框:

    • 创建TouchScreenKeyboard后,设置hidden = true即可隐藏默认输入框
    • 禁止在OnGUI中重复调用TouchScreenKeyboard.Open,否则会反复创建键盘导致异常
  2. 移动端输入同步:

    • 软键盘输入无法通过Input.GetKeyDown捕获,必须通过TouchScreenKeyboard.text属性监听文本变化
    • 对比每次Update的文本内容,区分是新增字母还是退格操作,确保和桌面端逻辑一致
  3. 平台兼容性:

    • 使用#if宏区分平台逻辑,桌面端保留原有硬件键盘监听,不影响现有功能

内容的提问来源于stack exchange,提问作者Rohit Singla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:15:23