1. 为什么你的输入框总被键盘“吃掉”?聊聊移动端的痛点
做Unity移动端开发,尤其是涉及到聊天、表单填写这些功能时,有一个问题几乎每个开发者都会踩坑:用户点开输入框,虚拟键盘“唰”一下弹出来,正好把输入框挡得严严实实。用户只能盲打,或者得手动把键盘收起来才能看到自己刚才输入了什么,体验非常糟糕。这个问题在原生App开发里有比较成熟的方案,但在Unity里,特别是游戏里,情况就有点特殊了。
我刚开始做移动端项目时,也以为很简单,想着“把整个界面往上顶不就行了”?结果实测下来,在游戏里直接照搬聊天软件那种整体上移UI的做法,经常会出问题。比如,你的游戏UI可能有复杂的层级关系,背景是动态的3D场景,或者输入框只是界面的一小部分。如果粗暴地把整个Canvas都顶上去,可能会导致其他UI元素错位、背景穿帮,或者交互逻辑混乱。所以,我们需要一个更“聪明”的方案,只精准地移动需要被看见的那个输入框及其关联区域,而不是动全身。
这个问题的核心在于,Unity的UI系统(UGUI)默认并没有为移动端虚拟键盘的弹出做自动适配。虚拟键盘本质上是一个由操作系统管理的独立层,它弹起时,会占据屏幕底部的一部分空间,但Unity的UI摄像机并不知道这块区域被占用了,所以原本在那里的UI元素就被“覆盖”了。我们的任务,就是实时监测键盘的状态和高度,然后动态调整输入框的位置,让它始终“漂浮”在键盘的上方。下面,我就结合自己趟过的坑,分享一套经过实战检验的、基于Canvas和RectTransform的自适应解决方案。
2. 核心思路:如何让输入框“聪明”地避开键盘
要解决问题,我们得先理解它的原理。我们的目标不是去控制键盘,而是让我们的UI能对键盘的弹出做出反应。整个方案的核心思路可以概括为:监听、获取、计算、位移。
监听:我们需要知道用户什么时候点击了输入框(InputField获得焦点),以及什么时候输入完成(失去焦点)。这可以通过UGUI组件自带的事件,比如 onEndEdit 来轻松实现。
获取:这是最关键也是最棘手的一步——如何获取当前虚拟键盘的准确高度?这个高度值在不同平台(Android/iOS)上获取方式完全不同,而且即使是同一平台,不同机型、不同输入法,键盘高度也可能有差异。我们需要分别处理。
计算:拿到键盘的像素高度后,不能直接用来移动UI。因为UI的坐标体系是基于Canvas的缩放和渲染模式的。我们需要将键盘的屏幕像素高度,转换为我们当前UI坐标系下的偏移量。这里会涉及到屏幕分辨率、Canvas的缩放系数(Canvas Scaler)等概念。
位移:最后,将计算好的偏移量,应用到输入框(或它所在的父级面板)的RectTransform组件上,通过修改其anchoredPosition属性,实现位置的平滑上移。当键盘收起时,再将其位置复位。
听起来有点绕?别担心,我们接下来就一步步拆解,用代码和实际场景把它讲透。我会先带你搭建一个最简单的测试环境,然后深入代码,看看每个环节具体怎么实现,以及有哪些需要特别注意的“坑”。
3. 搭建测试环境与基础UI布局
在开始写代码之前,我们先在Unity里把场景搭好。这里我用的是Unity 2020.3 LTS版本,其他高版本也基本通用。
- 创建Canvas:新建一个场景,然后右键 -> UI -> Canvas。这会是所有UI元素的根容器。为了适配不同屏幕,建议给Canvas添加一个 Canvas Scaler 组件。将 UI Scale Mode 设置为 “Scale With Screen Size”,参考分辨率可以设为 1920 x 1080(根据你的设计稿来)。这样UI在不同分辨率的手机上都能等比缩放。
- 创建输入框:在Canvas下右键 -> UI -> Input Field - TextMeshPro(推荐使用TextMeshPro,显示效果更好)。如果你用的是旧版Text,选择普通的Input Field也行。我们把这个输入框放在屏幕底部区域,模拟最容易被遮挡的情况。调整它的RectTransform,比如将锚点(Anchors)设置为底部居中(Bottom, Center),然后给一个合适的Pos Y值,让它离屏幕底边有一点距离。
- 关键设置:选中这个InputField组件,在Inspector面板里,找到 “Hide Mobile Input” 这个选项。请务必勾选它! 这个选项的作用是,在移动设备上,阻止系统自带的那个输入框覆盖层弹出。如果不勾选,你会发现屏幕上会同时出现两个输入框:一个是我们Unity自己画的,一个是系统弹出来的,位置会非常混乱。勾选后,就完全由我们的UI来负责输入框的显示,系统只负责提供键盘。


1532

被折叠的 条评论
为什么被折叠?



