Вторник, 28 марта 2017, 14:54

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [298]
Статьи об общих понятиях связанных с созданием игр.
Программирование [66]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [120]
Статьи о программах для создания игр, уроки и описания.
Софт [27]
Различные программы, в том числе в помощь игроделам.
2D-графика [7]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [8]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [4]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [65]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [53]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Как вы относитесь к созданию игр без программирования?
Всего ответов: 9957
Главная » Статьи » Создание игр

Реализуем штурвал (руль) В 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_obj Component - 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 следующая логика: проверяем, если количество нажатий на экран равно еденице, сохраняем нажатие в нашей переменной.

Код

void Update () {
  if(Input.touchCount == 1) {  
  myTouch = Input.GetTouch(0);  


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

Код

if(myTouch.phase == TouchPhase.Began) {  
  ray = Camera.mainCamera.ScreenPointToRay(myTouch.position);
}  


Далее проверка - если имя объекта, с которым столкнулся луч равно имени нашего штурвала, и при этом палец двигается, поворачиваем штурвал в соответствии с позицией нажатия по оси x. Так как Unity использует левостороннюю систему координат, для корректного отображения направления поворота значение myTouch.deltaPosition.x нужно взять со знаком минус. Затем просим GUIText показать угол поворота.

Код

  if(Physics.Raycast (ray, out hit)){
  if((hit.collider.name == "wheel_obj") & (myTouch.phase == TouchPhase.Moved)){
  myTransform.Rotate(0,0,-myTouch.deltaPosition.x,Space.World);  
  textRotate.text = (myTransform.rotation.z).ToString();
  }  
}


Все, скрипт готов. Так он выглядит целиком:

Код

using UnityEngine;
using System.Collections;

public class wheel_Manager : MonoBehaviour {
   
private Ray ray;
private RaycastHit hit;  
private Transform myTransform;
private Touch myTouch;
public GUIText textRotate;
   
void Start () {
  myTransform = transform;
}
   
void Update () {
  if(Input.touchCount == 1) {  
  myTouch = Input.GetTouch(0);  
  if(myTouch.phase == TouchPhase.Began) {  
  ray = Camera.mainCamera.ScreenPointToRay(myTouch.position);
  }  
  if(Physics.Raycast (ray, out hit)){
  if((hit.collider.name == "wheel_obj") & (myTouch.phase == TouchPhase.Moved)){
  myTransform.Rotate(0,0,-myTouch.deltaPosition.x,Space.World);  
  textRotate.text = (myTransform.rotation.z).ToString();
  }  
  }
  }
  }
}


Скрипт назначим объекту wheel_obj. В его соответствующую переменную перетягиванием перенесем объект GUIText.
Чтобы проверить работоспособность я использую UnityRemote на своем андроид девайсе.



Конечно, нужно еще связать получившийся угол с поворотом вашего катера или машины, но это выходит за рамки данной статьи.
Категория: Создание игр | Добавил: NEBR (10 декабря 2013) | Автор: Дмитрий NEBR Кичеев
Просмотров: 4231 | Комментарии: 12 | Рейтинг: 5.0/6 |
Теги: Unity, урок, Мобильные платформы, штурвал, Android, iOS, руль, юнити, Wheel, андроид
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Реализуем штурвал (руль) В Unity под мобильные платформы», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 12
+0-
11 beril   (13 декабря 2013 19:08)
berilТы прям Бог, классные статьи

+0-
12 NEBR   (13 декабря 2013 22:39)
NEBRОоо, спасибо, для вас стараюсь! smile Но можно и лучше, нет предела совершенству ) Щас готовлю перевод о создании ранера
Думаю интересная будет статейка - там генерация уровня, менеджер событий и другие интересные вещи )))

+0-
2 buftler   (10 декабря 2013 15:45)
buftlerвсе понятно, я тупанул но урок в любом случае хороший.

+3-
4 NEBR   (10 декабря 2013 15:50)
NEBRспасибо!

+0-
1 buftler   (10 декабря 2013 15:43)
buftlerХаха, прям под заказ, видел вчера в разделе unity вопрос как сделать штурвал на мобилках с touch wink

+0-
3 NEBR   (10 декабря 2013 15:49)
NEBRтак я и сделал этот тутор после общения с тем пареньком в его теме )

+0-
5 kvestpro   (10 декабря 2013 16:12)
kvestproВсе-таки лучом сделал...

+0-
6 kvestpro   (10 декабря 2013 17:10)
kvestproAndroid 4.1 не реагирует на нажатие.

+0-
7 NEBR   (10 декабря 2013 17:52)
NEBRверсия андроида не важна. ты через Remote пробовал?

+0-
8 kvestpro   (10 декабря 2013 17:55)
kvestproRemote вообще не работает. Я делаю билд и устанавливаю.

+0-
9 kvestpro   (10 декабря 2013 18:20)
kvestproСработало, но это не то, что я ожидал.
В твоем примере человек просто тапает по экрану и водит по горизонтали, а надо, чтобы водил по окружности. Без арккосинусов не обойтись все-таки smile

+0-
10 NEBR   (10 декабря 2013 18:33)
NEBRну не знаю. Если это так принципиально, то можно помимо myTouch.deltaPosition.x использовать еще myTouch.deltaPosition.y - задействовать две оси, а не только горизонтальную

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
10 случайных движков
  • DGLEngine
  • Crystal Space
  • OpenSpace3D
  • Ardor3D
  • Sylphis 3D
  • SimpleJ
  • Jet3D
  • GLHexen
  • Ludiloom
  • K5Engine
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    GameDev, Уроки OpenGL, Программирование, Создать Minecraft
    Все права сохранены. GcUp.ru © 2008-2017 | Free GIF Animator Рейтинг