УДК 004
Вахрушев В.И. студент, 4 курс
Институт энергетики и автоматизированных систем
МГТУ им. Г.И. Носова Россия, г. Магнитогорск Виноградова А.С. студент, 4 курс
Институт энергетики и автоматизированных систем
МГТУ им. Г.И. Носова Россия, г. Магнитогорск Самойлова С.С. студент, 4 курс
Институт энергетики и автоматизированных систем
МГТУ им. Г.И. Носова Россия, г. Магнитогорск РАЗРАБОТКА ВИРТУАЛЬНЫХ ДЖОЙСТИКОВ УПРАВЛЕНИЯ ПЕРЕДВИЖЕНИЕМ ОБЪЕКТОВ И КАМЕРОЙ ДЛЯ МОБИЛЬНОГО
ПРИЛОЖЕНИЯ НА ОС ANDROID В данной работе рассматривается процесс разработки джойстиков управления передвижением объектов и камерой для мобильного приложения на ОС Android.
Ключевые слова: Unity, C#, Android, Джойстик.
DEVELOPMENT OF VIRTUAL JOYSTICK CONTROL OBJECT MOVEMENT AND CAMERA FOR MOBILE APPLICATION ON THE
ANDROID OS.
In this paper we consider the process of developing a control joystick movement of objects and camera for mobile applications on the Android OS. Keywords: Unity, C #, Android, Joystick.
Первым делом следует добавить на сцену объект 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
яяиД
Joystick
VirtualJoystickContainer
Рисунок 1 - VirtualJoystickContainer
Проделав всё вышеперечисленное создайте ещё один джойстик, но с тем отличием что называться он будет CameraJoystick и значение Anchor right-bottom.
Далее напишем скрипт управления джойстиком. В разделе Assets создайте скрипт и назовите его VirtualJoystick. Необходимые классы и поля, которые нужно задать показаны в листинге 1. Листинг 1 -Классы и поля
public class VirtualJoystick : MonoBehaviour,IDragHandler,IPointerUpHandler, IPointerDownHandler {
private Image bglmg; //Изображение основного Image
private Image joystickImg; //Изображение дочернего Image
public Vector3 InputDirection{ set; get;}
В методе Start() пропишите следующее:
//Получаем данные компонента
Листинг 2 - Start()
void Start () {
bgImg = GetComponent<Image> (); VirtualJoystickContainer в переменную bgImg
joystickImg = transform.GetChild(0).GetComponent<Image> (); //Получаем данные компонента Joystick в переменную joystickImg
InputDirection = Vector3 .zero; }
Всё что делает этот метод - инициализирует переменные. Основные действия будут происходить в OnDrag(), листинг которого приведён в листинге 3.
Листинг 3 - OnDrag()
public virtual void OnDrag(PointerEventData ped)
{
Vector2 pos = Vector2.zero;
if (RectTransformUtility.ScreenPointToLocalPointlnRectangle (bglmg.rectTransform, ped.position, ped.pressEventCamera, out pos))
{
pos.x = (pos.x / bglmg.rectTransform.sizeDelta.x); pos.y = (pos.y / bglmg.rectTransform.sizeDelta.y);
float x = (bgImg.rectTransform.pivot.x == 1) ? pos.x * 2 + 1 : pos.x * 2 -
float y = (bgImg.rectTransform.pivot.y == 1) ? pos.y * 2 + 1 : pos.y * 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)
{
InputDirection = Vector3 .zero;
joystickImg.rectTransform.anchoredPosition = Vector3.zero;
}
Далее этот скрипт необходимо сохранить и прикрепить к джойстикам 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<Rigidbody>(); controller.maxAngularVelocity = terminalRotationSpeed;
controller.drag = drag;
camTransform = Camera.main.transform;
}
Листинг 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();
if (moveJoystick.InputDirection != Vector3.zero) { dir = moveJoystick.InputDirection;
}
Vector3 rotateDir = camTransform.TransformDirection (dir); rotateDir = new Vector3 (rotateDir.x, 0, rotateDir.z); rotateDir = rotateDir.normalized * dir.magnitude; controller.AddForce(rotateDir * moveSpeed);
}
Скрипт Motor.cs необходимо прикрепить к компоненту Sphere и после этого в поле Look At поместить VirtualJoystickContainer.
Заключающим скриптом будет скрипт, управляющий камерой FreeCamera.cs, код которого приведён в листинге 9. Листинг 9 - FreeCamera.cs public float moveSpeed = 5.0f; //Скорость public float drag = 0.5f; //Сопростивление
public float terminalRotationSpeed = 25.0f; //Скорость вращения public VirtualJoystick moveJoystick; //Сам джойстик private Rigidbody controller; //компонент управляемого объекта Transform camTransform; //Для управления камерой
void Start () {
controller = GetComponent<Rigidbody>(); controller.maxAngularVelocity = terminalRotationSpeed; controller.drag = drag;
camTransform = Camera.main.transform;
}
private void Update () { Vector3 dir = Vector3.zero; dir.x = Input.GetAxis("Horizontal"); dir.z = Input.GetAxis("Vertical"); if (dir.magnitude > 1) dir.Normalize();
if (moveJoystick.InputDirection != Vector3.zero) {
dir = moveJoystick.InputDirection;
}
Vector3 rotateDir = camTransform.TransformDirection (dir); rotateDir = new Vector3 (rotateDir.x, 0, rotateDir.z); rotateDir = rotateDir.normalized * dir.magnitude;
controller.AddForce(rotateDir * moveSpeed);
}
Как итог, мы можем наблюдать шар, управляемый при помощи двух джойстиков (рис. 2).
Рисунок 2 - Скриншот итогового приложения
Использованные источники:
1.Курзаева Л.В. Введение в теорию систем и системный анализ: учеб. пособие/Л.В. Курзаева. - Магнитогорск: МаГУ, 2015. -211 с.
2.Попова И.В. Разработка приложений: учебное пособие / И.В. Попова -Магнитогорск, 2005. - 184 с.