Разработка виртуальных джойстиков управления передвижением объектов и камерой для мобильного приложения на ОС Android
Автор: Вахрушев В.И., Виноградова А.С., Самойлова С.С.
Журнал: Экономика и социум @ekonomika-socium
Рубрика: Основной раздел
Статья в выпуске: 1-1 (32), 2017 года.
Бесплатный доступ
И КАМЕРОЙ ДЛЯ МОБИЛЬНОГО ПРИЛОЖЕНИЯ НА ОС ANDROID В данной работе рассматривается процесс разработки джойстиков управления передвижением объектов и камерой для мобильного приложения на ОС Android.
Джойстик
Короткий адрес: https://sciup.org/140121610
IDR: 140121610
Текст научной статьи Разработка виртуальных джойстиков управления передвижением объектов и камерой для мобильного приложения на ОС Android
Первым делом следует добавить на сцену объект Plane и растянуть его размеры как X=5, Y=1, Z=5. Данный компонент будет играть роль пола. После того как пол успешно поставлен, необходимо создать и разместить сферу по центру. Сфера – это наш персонаж, управление которого будет осуществляться с помощью виртуальных джойстиков. Нужно обязательно проверить наличие у сферы Sphere Collider и Rigidbody.
Теперь можно приступить к разработке самих джойстиков. Для этого на панели Hierarchy создайте объект Image, назвав его VirtualJoystickContainer и в позиции Source Image задайте вид круга (Knob), Width и Height по 200, цвет серый. Как дочерний по отношению к VirtualJoystickContainer создайте ещё один объект Image с именем Joystick (рис. 1), Source Image также Knob, но Width и Height должны быть равны 100, а цвет белый. Значение Anchor у VirtualJoystickContainer задать как left-bottom.
▼ Canvas
VirtualJoystickContainer
Joystick
Рисунок 1 – VirtualJoystickContainer
Проделав всё вышеперечисленное создайте ещё один джойстик, но с тем отличием что называться он будет CameraJoystick и значение Anchor right-bottom.
Далее напишем скрипт управления джойстиком. В разделе Assets создайте скрипт и назовите его VirtualJoystick. Необходимые классы и поля, которые нужно задать показаны в листинге 1.
Листинг 1 –Классы и поля public class VirtualJoystick : MonoBehaviour,IDragHandler,IPointerUpHandler, IPointerDownHandler { private Image bgImg; //Изображение основного Image private Image joystickImg; //Изображение дочернего Image public Vector3 InputDirection{ set; get;}
В методе Start() пропишите следующее:
Листинг 2 – Start()
void Start () { bgImg = GetComponent
}
Всё что делает этот метод – инициализирует переменные. Основные действия будут происходить в OnDrag(), листинг которого приведён в листинге 3.
Листинг 3 – OnDrag()
public virtual void OnDrag(PointerEventData ped)
{
if (RectTransformUtility.ScreenPointToLocalPointInRectangle (bgImg.rectTransform, ped.position, ped.pressEventCamera, out pos)) { pos.x = (pos.x / bgImg.rectTransform.sizeDelta.x); pos.y = (pos.y / bgImg.rectTransform.sizeDelta.y);
* 2 -1;
* 2 -1;
InputDirection = new Vector3 (x, 0,y);
InputDirection = (InputDirection.magnitude > 1)?
InputDirection.normalized : InputDirection;
joystickImg.rectTransform.anchoredPosition = new Vector3 (InputDirection.x * (bgImg.rectTransform.sizeDelta.x / 3)
, InputDirection.z * (bgImg.rectTransform.sizeDelta.y /3));
}
}
Этот метод будет срабатывать при движении джойстика. И завершающими методами будут OnPointerDown() и OnPointerUp(), их код приведён в 4 и 5 листингах соответственно.
Листинг 4 – OnPointerDown()
public virtual void OnPointerDown(PointerEventData ped)
{
OnDrag (ped);
}
Листинг 5 – OnPointerUp()
public virtual void OnPointerUp(PointerEventData ped) {
Далее этот скрипт необходимо сохранить и прикрепить к джойстикам
VirtualJoystickContainer и CameraJoystick.
Можно приступать к написанию скрипта, который будет отвечать непосредственно за движение самой сферы, который будет называться Motor. Поля, объявленные в классе Motor представлены в листинге 6.
Листинг 6 – Поля класса Motor public float moveSpeed = 5.0f;
//Скорость
//Сопротивление
//Скорость вращения
//Сам джойстик
//компонент управляемого объекта
//Для управления камерой
public float drag = 0.5f;
public float terminalRotationSpeed = 25.0f;
public VirtualJoystick moveJoystick;
private Rigidbody controller;
Transform camTransform;
Код метода Start() представлен в листинге 7, код метода Update() в листинге 8.
Листинг 7 – Start()
void Start () { controller = GetComponent
}
Листинг 8 – Update()
private void Update () {
-
Vector3 dir = Vector3.zero;
dir.x = Input.GetAxis("Horizontal");
dir.z = Input.GetAxis("Vertical");
if (dir.magnitude > 1)
dir.Normalize();
}
Vector3 rotateDir = camTransform.TransformDirection (dir); rotateDir = new Vector3 (rotateDir.x, 0, rotateDir.z); rotateDir = rotateDir.normalized * dir.magnitude;
controller.AddForce(rotateDir * moveSpeed);
}
//Скорость
//Сопростивление
//Скорость вращения
//Сам джойстик
//компонент управляемого объекта
//Для управления камерой
public float drag = 0.5f;
public float terminalRotationSpeed = 25.0f;
public VirtualJoystick moveJoystick;
private Rigidbody controller;
Transform camTransform;
void Start () { controller = GetComponent
} private void Update () {
-
Vector3 dir = Vector3.zero;
dir.x = Input.GetAxis("Horizontal");
dir.z = Input.GetAxis("Vertical");
if (dir.magnitude > 1) dir.Normalize();
}
Vector3 rotateDir = camTransform.TransformDirection (dir); rotateDir = new Vector3 (rotateDir.x, 0, rotateDir.z);
rotateDir = rotateDir.normalized * dir.magnitude;
controller.AddForce(rotateDir * moveSpeed); }
Как итог, мы можем наблюдать шар, управляемый при помощи двух джойстиков (рис. 2).

Рисунок 2 – Скриншот итогового приложения
Список литературы Разработка виртуальных джойстиков управления передвижением объектов и камерой для мобильного приложения на ОС Android
- Курзаева Л.В. Введение в теорию систем и системный анализ: учеб. пособие/Л.В. Курзаева. -Магнитогорск: МаГУ, 2015. -211 с.
- Попова И.В. Разработка приложений: учебное пособие/И.В. Попова -Магнитогорск, 2005. -184 с.