Немного об игре
Хотя это не имеет отношение к теме поста, расскажу немного об игре:
Принцип прост, Вы выбираете один из предложенных текстов или вводите свой и начинаете тренироваться печатать. При нажатии верной кнопки в букву летит мяч. Если вы ошибаетесь, отпускается зеленая завеса и не поднимается до тех пор, пока Вы не сотрете лишнее.
Меня попросили педагоги сделать эту игру, так как популярные тренажеры сильно заточены на скорость печати сильно заточены на скорость и правильную расстановку пальцев. Это не очень подходит для занятиями особыми людьми, так. как я могу печатать только двумя пальцами (остальные не разгибаются), а моя подруга вообще ногой. О скорости печати вообще молчу. Так что я не пытаюсь переплюнуть ребят с 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
Комментарии (11)
Leopotam
10.02.2017 18:47+3Ужасающая статья об ужасающем костыле и рекламе всего этого за 150р. Не просаживается скорость? При интеропе с внешней средой, да еще и с постоянной генерацией мусора? Это даже не смешно. Нужно было хотя бы попытаться почитать официальную документацию — там есть и про детект видимости и про область перекрытия клавиатурой: https://docs.unity3d.com/ScriptReference/TouchScreenKeyboard.html
DiegoV
10.02.2017 19:03Было бы не плохо опубликовать игру на сайте с использованием UnityWebPlayer и дать людям возможность потыркать пускай хоть в демо-версию и понять нужно это или нет.
Вы позиционируете себя как «птицу мира» помогающую людям общаться в любой жизненой ситуации, однако просите деньги за такое приложение. Я понимаю что деньги необходимы для развития ваших начинаний, но ценник в 150 рублей не соизмерим с качеством этого приложения.ibakaidov
10.02.2017 19:09-2Спасибо, выложу в веб плеер. Ценник отпустил до 30 рублей. Про позицию и птицу мира согласен, пытаюсь придумать как на это жить
Leopotam
10.02.2017 19:59+1Webplayer умер полгода назад как минимум и полностью выпилен в актуальной версии unity3d — теперь вместо него webgl.
inborn_killer
10.02.2017 19:18+1Опускать ценник нужно до нуля. Такое приложение не будут покупать, вы не сможете на этом заработать и ста рублей. Прикрутите лучше рекламу и выложите бесплатную версию с ней. А за те же 30 рублей добавьте возможность выключать рекламу. Да, это требует времени на разработку и внедрение, но тогда у вас будут хоть какие-то шансы, что это приложение увидят люди.
olegchir
11.02.2017 12:39+1Господа, это техническая статья.
Может хватит обсуждать стоимость приложения, которое здесь вообще не при чем?Leopotam
11.02.2017 14:48+1Это явно не техническая статья, потому что автор не соизволил даже погуглить — какой штатный функционал есть. Предложенное решение — неприемлемо в принципе — каждый FixedUpdate обращаться к внешней среде с локом потока и генерацией тонны мусора. Т.е. минус техническая составляющая. Остается реклама сайта и реклама приложения. На сайте написано, цитирую:
Бесплатно
Просим обратить внимание, что все наши приложения бесплатные
Не формат хабра, но пусть будет. Остается реклама приложения за 150р на google play. Даже если плюнуть на правила хабра — это противоречит тому, что было прорекламировано на сайте по ссылке выше.
BIanF
12.02.2017 15:36Вам нужно хоть немного поработать над меню и скриншотами. Например, читают слева на право и нужно слева ставить кнопку «играть».
Убрать опечатку в слове «отчистить».
Поместить текст в кнопки; возможно увеличить сами кнопки и размер шрифта.
Что такое куб? Пробел или точка?
Нужны настройки фона и шрифта.
Было бы неплохо добавить достижения и рейтинги.
batya15
150р. Вы чего!?
ibakaidov
Я плохо оценил рынок и поставил от болды. Опустил до 30 руб