Как ввести данные с клавиатуры в Unity?

В небольшом приложении на Unity, на самом первом экране нужно ввести число, с которым позже будут проводиться манипуляции (делаем с сыном демонстрацию гипотезы Коллатца). Однако, найденные в интернете решения не сработали. Наши попытки представлены в примере кода, функция EnterNumber(), одно закомментировано.

Собственно, я просто помогаю разобраться сыну, у самого совсем нету опыта в этой среде. Позже данную функцию мы привязываем к кнопке.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoader : MonoBehaviour
{
    // UnityEngine.TouchScreenKeyboard keyboard;
    // public static string keyboardText = "";
    public string  gt;
    
    public void LoadNextScene()
    {
        int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
        SceneManager.LoadScene(currentSceneIndex + 1);
    }

    public void LoadStartScene()
    {
        SceneManager.LoadScene(0);
    }

    public void EnterNumber()
    {
        foreach (char c in Input.inputString)
        {
            if (c == '\b') // has backspace/delete been pressed?
            {
                if (gt.Length != 0)
                {
                    gt = gt.Substring(0, gt.Length - 1);
                }
            }
            else if ((c == '\n') || (c == '\r')) // enter/return
            {
                print("User entered their name: " + gt);
            }
            else
            {
                gt += c;
            }
        }
        Debug.Log(gt);
    }

    // public void EnterNumber()
    // {
    //     keyboard = TouchScreenKeyboard.Open("text to edit");
    //     Debug.Log(keyboard.text);
    // }
}

Спасибо. Вроде бы совсем простой вопрос, но рабочее решение найти не удалось.


Ответы (1 шт):

Автор решения: Sergey Skvortsov

Например так:

  1. Добавляем на сцену InputField

введите сюда описание изображения

  1. Меняем ContentType у InputField на IntegerNumber
  2. Добавляем элементы Button, Panel, элемент Text под панелью (можно сразу переименовать в resultText, что бы не путаться)

Будет что-то вроде этого: введите сюда описание изображения

  1. Переключаемся на вкладку Scene Размещаем элементы некоторым разумным образом (двойной щелчок по объекту на вкладке Hieararchy фокусирует вас на элементе, слева в верху (по умолчанию) есть тулл бар инструментов, используйте его для настройки размеров и перемещения элементов)

Получаем что-то похожее на: введите сюда описание изображения

  1. Дальше пишем код, в котором будем манипулировать созданными элементами:
using System;
using UnityEngine;
using UnityEngine.UI;

public class Manipulator : MonoBehaviour
{
    [SerializeField] private InputField _inputField;
    [SerializeField] private Button _button;
    [SerializeField] private Text _resultText;

    private void Awake()
    {
        Debug.Assert(_inputField != null, $"Assign {nameof(_inputField)} field in the inspector");
        Debug.Assert(_button != null, $"Assign {nameof(_button)} field in the inspector");
        Debug.Assert(_resultText != null, $"Assign {nameof(_resultText)} field in the inspector");
        Debug.Assert(_inputField.contentType == InputField.ContentType.IntegerNumber, "InputType should be IntegerNumber");
        _button.onClick.AddListener(OnClick);
    }

    private void OnClick()
    {
        int result = ActionWithNumber(Convert.ToInt32(_inputField.text));
        _resultText.text = result.ToString();
    }

    private int ActionWithNumber(int input)
    {
        //Здесь ваши действия с числом
        return input;
    }

    private void OnDestroy()
    {
        _button.onClick.RemoveAllListeners();
    }

}

Этот скрипт по нажатию на кнопку берет ввод из поля ввода, что-то с ним делаем и закидывает результат в текстовый блок. Помещаем скрипт на любой объект на сцене (лучше создать отдельный), заполняем поля в инспекторе (справа кнопочка у поля), запускаем.

→ Ссылка