Использование клавиатуры Android в игре

Например, в игре для мобильного устройства, по ходу игрового процесса, игрок находит некое особое место или предмет, который можно подписать или оставить заметку. Или может понадобится ввести какой-нибудь код/набор слов. В общем, во всех этих случаях нам понадобится клавиатура нашего девайса. Для решения подобной задачи, нам понадобится два небольших скрипта, один отвечает за вызов и контроль клавиатуры на экран, а второй скрипт, это просто триггер, который упрощает процесс использования данной функции в игре. Допустим, если на сцену добавить UI текстовый элемент и прицепить к нему триггер. То уже в самой игре, нам достаточно просто кликнуть по UI и появится клавиатура, которая впишет текст именно в этот элемент. Удобно и просто.

Основной класс управления:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class Keyboard : MonoBehaviour {

	[Header("Настройки по умолчанию")]
	[SerializeField] private int _characterLimit = 10;
	[SerializeField] private TouchScreenKeyboardType _type;
	[SerializeField] private bool _autocorrection;
	[SerializeField] private bool _multiline;
	[SerializeField] private bool _secure;
	[SerializeField] private bool _alert = true;
	[SerializeField] private string _textPlaceholder = "Enter text...";

	private static TouchScreenKeyboard _keyboard;
	private static Keyboard _internal;
	private static int limit;
	private static Text current;
	private static string last;

	public static bool isActive
	{
		get{ return (_keyboard == null) ? false : _keyboard.active; }
	}

	public static void OpenDefault()
	{
		_internal.Open();
	}

	public static void Close()
	{
		_keyboard.active = false;
	}

	public static void OpenCustom(int characterLimit, TouchScreenKeyboardType type, bool autocorrection, bool multiline, bool secure, bool alert, string textPlaceholder)
	{
		limit = characterLimit;
		_keyboard = TouchScreenKeyboard.Open(last, type, autocorrection, multiline, secure, alert, textPlaceholder);
	}

	public static void TextField(Text value)
	{
		if(value.text == null || value.text.Trim().Length == 0) last = string.Empty; else last = value.text;
		current = value;
	}

	void Awake()
	{
		_internal = this;
	}

	void Open()
	{
		limit = _characterLimit;
		_keyboard = TouchScreenKeyboard.Open(last, _type, _autocorrection, _multiline, _secure, _alert, _textPlaceholder);
	}

	void LateUpdate()
	{
		if(_keyboard == null || current == null) return;

		if(_keyboard.done)
		{
			current.text = _keyboard.text;
			current = null;
		}

		if(_keyboard.text.Length > limit)
		{
			_keyboard.text = _keyboard.text.Substring(0, _keyboard.text.Length - 1);
		}
	}
}

Кстати, здесь можно установить лимит в символах, что крайне удобно в ряде случаев.

Теперь сам триггер:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;

public class KeyboardTrigger : MonoBehaviour, IPointerClickHandler {

	[Header("Куда выводить текст")]
	[SerializeField] private Text _Text;

	[Header("Вызов без настроек")]
	[SerializeField] private bool isDefault = true;

	[Header("Настройки триггера")]
	[SerializeField] private int characterLimit = 100;
	[SerializeField] private TouchScreenKeyboardType type;
	[SerializeField] private bool autocorrection;
	[SerializeField] private bool multiline;
	[SerializeField] private bool secure;
	[SerializeField] private bool alert = true;
	[SerializeField] private string textPlaceholder = "Введите текст...";

	void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
	{
		Keyboard.TextField(_Text);
		if(isDefault) Keyboard.OpenDefault(); else Keyboard.OpenCustom(characterLimit, type, autocorrection, multiline, secure, alert, textPlaceholder);
	}
}

Триггер можно цеплять на UI Text, Image, Button...

Еще одна особенность, если мы добавили куда-то текст, а потом еще раз кликнули по этому объекту, данный текст будет автоматически добавлен в поле клавиатуры, это для удобства редактирования.

Скачать проект:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.
Тестировалось на: Unity 5.4.2

Комментариев 2

Офлайн
Light 18 декабря 2017
mav, всё доступные опции в TouchScreenKeyboardType.
Офлайн
mav
mav 18 декабря 2017
Доброго времени суток!
Меня вот интересует, можно ли убрать лишнее из клавиатуры. Например мне не нужно поле ввода которое стандартно отображается над кнопками самой клавиатуры. весь инэт перекопал, ответа не нашел.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика