抖音开放平台Logo
控制台

键盘输入法适配

更新时间 2024-07-24 02:58:49
收藏
我的收藏
此文档描述小游戏开发时输入法适配问题。​

自动适配​

在 Unity 小游戏环境的 WebGL 方案中,支持 Unity 2022 及以上版本 Input Field 组件自动适配键盘输入法,无需手动调用。低版本或其他组件暂不支持。​

低版本兼容​

WebGL 方案中 Unity 2021 及以下版本无法正常唤起输入法。我们提供了 StarkKeyboard 模块以及onKeyboardInputEventonKeyboardConfirmEventonKeyboardCompleteEvent等事件,开发者可以通过ShowKeyboardHideKeyboard等方法来显示键盘输入法。​

接口介绍

C#
复制
/// <summary>
/// 键盘输入事件
/// <param name="value">键盘输入的当前值</param>
/// </summary>
public delegate void OnKeyboardInputEvent(string value);
/// <summary>
/// 用户点击键盘确定按钮时的事件
/// <param name="value">键盘输入的当前值</param>
/// </summary>
public delegate void OnKeyboardConfirmEvent(string value);
/// <summary>
/// 键盘收起事件
/// <param name="value">键盘输入的当前值</param>
/// </summary>
public delegate void OnKeyboardCompleteEvent(string value);
/// <summary>
/// 监听键盘输入事件
/// </summary>
public OnKeyboardInputEvent onKeyboardInputEvent;
/// <summary>
/// 监听用户点击键盘确定按钮时的事件
/// </summary>
public OnKeyboardConfirmEvent onKeyboardConfirmEvent;
/// <summary>
/// 监听键盘收起事件
/// </summary>
public OnKeyboardCompleteEvent onKeyboardCompleteEvent;
[StarkVersion(MinSCAndroidVersion = "9999.9999", WebGLMethod = "showKeyboard")]
public abstract void ShowKeyboard([CanBeNull] ShowKeyboardOptions options = null,
[CanBeNull] Action onSuccess = null, [CanBeNull] Action<string> onError = null);
/// <summary>
/// 收起软键盘(仅WebGL平台下支持)
/// 参考: https://microapp.bytedance.com/docs/zh-CN/mini-game/develop/api/interface/keyboard/tt-hide-keyboard/
/// </summary>
/// <param name="onSuccess">隐藏软键盘成功回调: () => {}</param>
/// <param name="onError">隐藏软键盘失败回调,(errMsg) => {}</param>
[StarkVersion(MinSCAndroidVersion = "9999.9999", WebGLMethod = "hideKeyboard")]
public abstract void HideKeyboard([CanBeNull] Action onSuccess = null,
[CanBeNull] Action<string> onError = null);

使用示例

C#
复制
using StarkSDKSpace;
using UnityEngine;
using UnityEngine.UI;
public class KeyboardTest : MonoBehaviour
{
public InputField input;
private void Start()
{
SetInputTexts();
RegisterKeyboardEvents();
}
private void SetInputTexts()
{
input.text = "done";
var comp = input.GetComponent<ClickableInputField>();
if (comp == null)
{
comp = input.gameObject.AddComponent<ClickableInputField>();
}
comp.multiple = false;
comp.confirmType = input.text;
}
private void OnDestroy()
{
UnregisterKeyboardEvents();
}
private void RegisterKeyboardEvents()
{
StarkSDK.API.GetStarkKeyboard().onKeyboardInputEvent += OnKeyboardInput;
StarkSDK.API.GetStarkKeyboard().onKeyboardConfirmEvent += OnKeyboardConfirm;
StarkSDK.API.GetStarkKeyboard().onKeyboardCompleteEvent += OnKeyboardComplete;
}
private void UnregisterKeyboardEvents()
{
StarkSDK.API.GetStarkKeyboard().onKeyboardInputEvent -= OnKeyboardInput;
StarkSDK.API.GetStarkKeyboard().onKeyboardConfirmEvent -= OnKeyboardConfirm;
StarkSDK.API.GetStarkKeyboard().onKeyboardCompleteEvent -= OnKeyboardComplete;
}
private void OnKeyboardInput(string value)
{
Debug.Log($"OnKeyboardInput: {value}");
if (input.isFocused)
{
input.text = value;
}
}
private void OnKeyboardConfirm(string value)
{
Debug.Log($"OnKeyboardConfirm: {value}");
}
private void OnKeyboardComplete(string value)
{
Debug.Log($"OnKeyboardComplete: {value}");
}
}
public class ClickableInputField : EventTrigger
{
public string confirmType = "done"; // 可选值有: "done", "next", "search", "go", "send"
public int maxInputLength = 100; // 最大输入长度
public bool multiple = false; // 是否多行输入
private InputField _inputField;
private void Start()
{
_inputField = GetComponent<InputField>();
}
public override void OnPointerClick(PointerEventData eventData)
{
if (_inputField != null)
{
if (_inputField.isFocused)
{
StarkSDK.API.GetStarkKeyboard().ShowKeyboard(new StarkKeyboard.ShowKeyboardOptions()
{
maxLength = maxInputLength,
multiple = multiple,
defaultValue = _inputField.text,
confirmType = confirmType
});
}
}
}
}