Реализуем штурвал (руль) В Unity под мобильные платформы
Реализуем штурвал (руль) В Unity под мобильные платформы.
Продемонстрирую как можно сделать 2d штурвал или руль в Unity под мобильные платформы. Задача следующая - у нас трехмерная игра и штурвал будет элементом 2d интерфейса, который можно поворачивать пальцем. Примерно как в игре Sailboat Championship . Я буду использовать двумерные возможности Unity 4.3 версии.
Создадим новый проект без дополнительных пакетов.
Сразу переключимся под мобильную платформу, я выберу android. File - Bild Settings - Android - Switch Platform. Сразу нажмем кнопочку AddCurent (добавим в билд текущую сцену), согласимся на предложение сохранить сцену, назовем ее WheelManager.
Скачаем текстурку штурвала, и перетягиванием перенесем ее в окно Project. Назовем ее wheel_texture (слово wheel имеет много значений, одно из них - штурвал). В настройках импорта текстуры укажем что это спрайт.
Теперь нужно отобразить 2d текстуру штурвала на экране. Для этого есть много способов. Можно создать трехмерную плоскость, наложить на нее материал с текстурой штурвала, воспользоватся новыми возможностями Unity - создать спрайт штурвала или использовать 2d фреймворк для интерефейса типа NGUI. Попробуем встроенные возможности unity4.3 версии, создадим спрайт (GameObject - CreateOther - Sprite). Назовем его wheel_obj. Создадим материал для этого спрайта - Project - Create - Material. Чтобы не было путаницы в проекте, переименуем его в sprite_material. Сначала наложим на материал нашу текстуру (wheel_texture), потом выберем у материала шейдер Sprites - Default.
В окне Hierarсhy выберем наш спрайт wheel_obj, в компонент SpriteRenderer перетягиванием назначим материал (sprite_material) и текстуру (wheel_texture).
Разместим texture_obj в позицию (0.5, 0.2, 0). Он будет чуть ниже середины экрана, сверху мы будем показывать угол его поворота. Предположим, в нашей игре кроме штурвала иногда нужно будет нажимать различные кнопки. В этом случае нужно определять к какому именно объекту прикоснулся палец. Реализуем это райкастами - грубо говоря, будем выпускать из пальца луч и проверять, столкнется ли он с каким нибудь физическим объектом. В случае такого столкновения проверим имя объекта, и если это наш штурвал - запустим соответствующую логику. Следовательно, на спрайт штурвала нужно повесить boxCollider (при выделенном wheel_objComponent - Physics - BoxCollider). Чтобы отобразить угол поворота на экране, добавим GUIText (GameObject - CreateOther - GUIText). Опять же, не лучший вариант для производительности, в игре предпочтительнее использовать GUI фреймворк, но для примера подойдет. Назовем его text_rotate. Можно изменить шрифт, например 20. Расположим его в (0.45, 0.9, 0).
Наконец то перейдем к самому интересному - скриптописанию. Создадим C# скрипт wheelManager. Откроем его.
Укажем переменные. Как я уже говорил, нажатия на штурвал будет определятся райкастами. Для этого создадим две переменные:
Код
private Ray ray; // луч private RaycastHit hit; // переменная для хранения объекта, с которым столкнулся луч
Для оптимизации проекта рекомендуется использовать кеширование. Так как скрипт будет висеть на объекте wheel_obj, сделаем кеширование его компонента transform
Код
private Transform myTransform;
Далее - переменная для хранения нашего нажатия на экран и публичная переменная для ссылки на GUIText.
Код
private Touch myTouch; public GUIText textRotate;
Переходим к функциям. В Start, соответственно, кеширование.
Код
void Start () { myTransform = transform; }
В Update следующая логика: проверяем, если количество нажатий на экран равно еденице, сохраняем нажатие в нашей переменной.
В момент прикосновения пальца к экрану выпускаем луч из той позиции, где произошло касание.
Код
if(myTouch.phase == TouchPhase.Began) { ray = Camera.mainCamera.ScreenPointToRay(myTouch.position); }
Далее проверка - если имя объекта, с которым столкнулся луч равно имени нашего штурвала, и при этом палец двигается, поворачиваем штурвал в соответствии с позицией нажатия по оси x. Так как Unity использует левостороннюю систему координат, для корректного отображения направления поворота значение myTouch.deltaPosition.x нужно взять со знаком минус. Затем просим GUIText показать угол поворота.
Скрипт назначим объекту wheel_obj. В его соответствующую переменную перетягиванием перенесем объект GUIText. Чтобы проверить работоспособность я использую UnityRemote на своем андроид девайсе.
Конечно, нужно еще связать получившийся угол с поворотом вашего катера или машины, но это выходит за рамки данной статьи.
Категория: Создание игр | Добавил: NEBR (10 Декабря 2013)
| Автор: Дмитрий NEBR Кичеев
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Реализуем штурвал (руль) В Unity под мобильные платформы», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Ооо, спасибо, для вас стараюсь! Но можно и лучше, нет предела совершенству ) Щас готовлю перевод о создании ранера Думаю интересная будет статейка - там генерация уровня, менеджер событий и другие интересные вещи )))
Сработало, но это не то, что я ожидал. В твоем примере человек просто тапает по экрану и водит по горизонтали, а надо, чтобы водил по окружности. Без арккосинусов не обойтись все-таки
ну не знаю. Если это так принципиально, то можно помимо myTouch.deltaPosition.x использовать еще myTouch.deltaPosition.y - задействовать две оси, а не только горизонтальную
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]