ChairInput. Пишем игру в Unity, управляемую с помощью виртуальной клавиатуры Android. Проблема с углом обзора камеры

    Всем привет, я написал клавиатурный тренажер под Android в Unity3D, он не сильно заточен под особых детей, а предназначен для широкого пользователя (ну я так думаю). И в этом посте я хочу рассказать о проблеме перекрывания части экрана клавиатурой и способах ее решения.



    Немного об игре


    Хотя это не имеет отношение к теме поста, расскажу немного об игре:

    Принцип прост, Вы выбираете один из предложенных текстов или вводите свой и начинаете тренироваться печатать. При нажатии верной кнопки в букву летит мяч. Если вы ошибаетесь, отпускается зеленая завеса и не поднимается до тех пор, пока Вы не сотрете лишнее.

    Меня попросили педагоги сделать эту игру, так как популярные тренажеры сильно заточены на скорость печати сильно заточены на скорость и правильную расстановку пальцев. Это не очень подходит для занятиями особыми людьми, так. как я могу печатать только двумя пальцами (остальные не разгибаются), а моя подруга вообще ногой. О скорости печати вообще молчу. Так что я не пытаюсь переплюнуть ребят с klava.org или клавагонки, а пишу свое.



    Работа с вводом


    Работу с вводом текста я решил организовать через стандартный Unity UI InputField, событие о нажатии кнопки и последний символ получается так.

    	InputField field;
    	public void Start()
    	{
    		field = GetComponent<InputField> ();
    		field.onValueChange.AddListener (delegate {ValueChangeCheck ();});
    		// focus on field on loading scene
    		field.Select ();
    		field.ActivateInputField ();
    
    	}
    
    	// Invoked when the value of the text field changes.
    	public void ValueChangeCheck()
    	{
    		string symbol = field.text.Length==0?null: field.text[field.text.Length-1]+"";
            }
    

    Дальше происходит скучная магия по бросанию мячиков в буквы, публиковать ее не буду, ибо там куча говнокода она требует рефакторинг.

    Проблема


    На компьютере всё работало прекрасно, но когда я запустил игру на Android, увидел Бескрайное небо Аустерлица, что клавиатура наехала на основное игровое пространство и перекрыло всё.



    В гугле ничего хорошего не нашел (возможно, я просто гуглить не умею) и я стал сам ковырять свойства камеры.

    Решение проблемы


    В настройках я нашел свойство Viewport Rect и выставил в нем Y на 0.5, думал, что на этом мои проблемы закончились, но нет.



    В вертикальной ориентации экрана клавиатура перестала наезжать на экран, но в горизонтальной клавиатура всё еще наезжала на картинку, тогда я поигрался с цифрами и подобрал значение для горизонтальной, 0.3. И правильно, всё уехало в вертикале.

    Подумав, я понял, что коэффициент высоты клавиатуры на высоту экрана. Решил написать скрипт, который меняет этот коэффициент, рассчитывая из текущей высоты клавиатуры. Нашел на stackoverflow скрип получения высоты и написал такой скрипт:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    
    public class CameraController : MonoBehaviour {
    	Camera cam;
    	// Use this for initialization
    	void Start () {
    		cam = GetComponent<Camera> ();
    	}
    
    	#if (UNITY_ANDROID)
    
    	Rect KeyBoardRect = new Rect(0, 0, 1,1);
    	void FixedUpdate () {
    		KeyBoardRect.y = ((float)GetKeyboardSize ()) / Screen.height;
    
    		cam.rect = KeyBoardRect;
    
    	}
    	public int GetKeyboardSize()
    	{
    		using (AndroidJavaClass UnityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
    		{
    			AndroidJavaObject View = UnityClass.GetStatic<AndroidJavaObject>("currentActivity").Get<AndroidJavaObject>("mUnityPlayer").Call<AndroidJavaObject>("getView");
    
    			using (AndroidJavaObject Rct = new AndroidJavaObject("android.graphics.Rect"))
    			{
    				View.Call("getWindowVisibleDisplayFrame", Rct);
    
    				return Screen.height - Rct.Call<int>("height");
    			}
    		}
    	}
    	#endif
    
    }
    

    Всё прекрасно заработало судя по Profiler'у без потери FPS.

    → Игру можно скачать тут
    → Мой сайт: aacidov.ru
    LINKa
    28,00
    Компания
    Поделиться публикацией

    Комментарии 12

      +2
      150р. Вы чего!?
        –1
        Я плохо оценил рынок и поставил от болды. Опустил до 30 руб
        +3
        Ужасающая статья об ужасающем костыле и рекламе всего этого за 150р. Не просаживается скорость? При интеропе с внешней средой, да еще и с постоянной генерацией мусора? Это даже не смешно. Нужно было хотя бы попытаться почитать официальную документацию — там есть и про детект видимости и про область перекрытия клавиатурой: https://docs.unity3d.com/ScriptReference/TouchScreenKeyboard.html
          –1
          Спасибо, согласен с вами, что переборщил с ценой. Ссылку почитаю
          0
          Было бы не плохо опубликовать игру на сайте с использованием UnityWebPlayer и дать людям возможность потыркать пускай хоть в демо-версию и понять нужно это или нет.

          Вы позиционируете себя как «птицу мира» помогающую людям общаться в любой жизненой ситуации, однако просите деньги за такое приложение. Я понимаю что деньги необходимы для развития ваших начинаний, но ценник в 150 рублей не соизмерим с качеством этого приложения.
            –2
            Спасибо, выложу в веб плеер. Ценник отпустил до 30 рублей. Про позицию и птицу мира согласен, пытаюсь придумать как на это жить
              +1
              Webplayer умер полгода назад как минимум и полностью выпилен в актуальной версии unity3d — теперь вместо него webgl.
              +1
              Опускать ценник нужно до нуля. Такое приложение не будут покупать, вы не сможете на этом заработать и ста рублей. Прикрутите лучше рекламу и выложите бесплатную версию с ней. А за те же 30 рублей добавьте возможность выключать рекламу. Да, это требует времени на разработку и внедрение, но тогда у вас будут хоть какие-то шансы, что это приложение увидят люди.
                +1
                Господа, это техническая статья.
                Может хватит обсуждать стоимость приложения, которое здесь вообще не при чем?
                  +1
                  Это явно не техническая статья, потому что автор не соизволил даже погуглить — какой штатный функционал есть. Предложенное решение — неприемлемо в принципе — каждый FixedUpdate обращаться к внешней среде с локом потока и генерацией тонны мусора. Т.е. минус техническая составляющая. Остается реклама сайта и реклама приложения. На сайте написано, цитирую:
                  Бесплатно
                  Просим обратить внимание, что все наши приложения бесплатные

                  Не формат хабра, но пусть будет. Остается реклама приложения за 150р на google play. Даже если плюнуть на правила хабра — это противоречит тому, что было прорекламировано на сайте по ссылке выше.
                  0
                  Вам нужно хоть немного поработать над меню и скриншотами. Например, читают слева на право и нужно слева ставить кнопку «играть».
                  Убрать опечатку в слове «отчистить».
                  Поместить текст в кнопки; возможно увеличить сами кнопки и размер шрифта.
                  Что такое куб? Пробел или точка?
                  Нужны настройки фона и шрифта.
                  Было бы неплохо добавить достижения и рейтинги.
                    0
                    Это был зашквар…

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое