uGUI Joystick (Unity 4.6.1f1)

Лучший способ помочь другим, поделиться своими находками.

uGUI Joystick (Unity 4.6.1f1)

Сообщение Ert Donuell 18 окт 2014, 05:11

Надеюсь, кому-нибудь пригодится. Писал сам.

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System;

[RequireComponent(typeof(RectTransform))]
public class Joystick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler
{
        public RectTransform handle;
        public Vector2 autoReturnSpeed = new Vector2(4.0f, 4.0f);
        public float radius = 40.0f;

        public event Action<Joystick, Vector2> OnStartJoystickMovement;
        public event Action<Joystick, Vector2> OnJoystickMovement;
        public event Action<Joystick> OnEndJoystickMovement;

        private bool _returnHandle;
        private RectTransform _canvas;

        public Vector2 Coordinates
        {
                get
                {
                        if (handle.anchoredPosition.magnitude < radius)
                                return handle.anchoredPosition / radius;
                        return handle.anchoredPosition.normalized;
                }
        }

        void IPointerDownHandler.OnPointerDown(PointerEventData eventData)
        {
                _returnHandle = false;
                var handleOffset = GetJoystickOffset(eventData);
                handle.anchoredPosition = handleOffset;
                if (OnStartJoystickMovement != null)
                        OnStartJoystickMovement(this, Coordinates);
        }

        void IDragHandler.OnDrag(PointerEventData eventData)
        {
                var handleOffset = GetJoystickOffset(eventData);
                handle.anchoredPosition = handleOffset;
                if (OnJoystickMovement != null)
                        OnJoystickMovement(this, Coordinates);
        }

        void IPointerUpHandler.OnPointerUp(PointerEventData eventData)
        {
                _returnHandle = true;
                if (OnEndJoystickMovement != null)
                        OnEndJoystickMovement(this);
        }

        private Vector2 GetJoystickOffset(PointerEventData eventData)
        {
                Vector3 globalHandle;
                if (RectTransformUtility.ScreenPointToWorldPointInRectangle(_canvas, eventData.position, eventData.pressEventCamera, out globalHandle))
                        handle.position = globalHandle;
                var handleOffset = handle.anchoredPosition;
                if (handleOffset.magnitude > radius)
                {
                        handleOffset = handleOffset.normalized * radius;
                        handle.anchoredPosition = handleOffset;
                }
                return handleOffset;
        }

        private void Start()
        {
                _returnHandle = true;
                var touchZone = GetComponent<RectTransform>();
                touchZone.pivot = Vector2.one * 0.5f;
                handle.transform.SetParent(transform);
                var curTransform = transform;
                do
                {
                        if (curTransform.GetComponent<Canvas>() != null)
                        {
                                _canvas = curTransform.GetComponent<RectTransform>();
                                break;
                        }
                        curTransform = transform.parent;
                }
                while (curTransform != null);
        }

        private void Update()
        {
                if (_returnHandle)
                        if (handle.anchoredPosition.magnitude > Mathf.Epsilon)
                                handle.anchoredPosition -= new Vector2(handle.anchoredPosition.x * autoReturnSpeed.x, handle.anchoredPosition.y * autoReturnSpeed.y) * Time.deltaTime;
                        else
                                _returnHandle = false;
        }
}
Последний раз редактировалось Ert Donuell 08 фев 2015, 16:11, всего редактировалось 3 раз(а).
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: uGUI Joystick (Unity 4.6.0b20)

Сообщение romeo98 22 дек 2014, 16:39

У меня ругается на класс ReferenceResolution. Какое пространство имен оно использует? Или этот код уже устарел и не работает на 4.6.0f3?
Я помог? Ты Unity разработчик? ПОМОГИ МНЕ! Поставь лайк за проект Mission: Defender на Unity Connect ЗДЕСЬ !
romeo98
UNITрон
 
Сообщения: 312
Зарегистрирован: 03 янв 2014, 15:54
Skype: romeotallinn
  • Сайт

Re: uGUI Joystick (Unity 4.6.0b20)

Сообщение Ert Donuell 09 янв 2015, 06:09

Да, этот компонент уже пропал. Нужно будет поправить.
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: uGUI Joystick (Unity 4.6.1f1)

Сообщение Ert Donuell 09 янв 2015, 16:20

Отредактировал под новую версию. Теперь работает.
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: uGUI Joystick (Unity 4.6.1f1)

Сообщение ReinDeer 29 янв 2015, 19:16

Очень дерганно как-то получается. При особой активности аж двоиться0_0
ReinDeer
UNец
 
Сообщения: 21
Зарегистрирован: 25 янв 2015, 15:11
Откуда: Ульяновск
Skype: nya.rein.deer

Re: uGUI Joystick (Unity 4.6.1f1)

Сообщение Ert Donuell 29 янв 2015, 19:24

Он возвращает текущее положение ручки. Подпилю малость, добавлю плавное изменение выходной величины.
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: uGUI Joystick (Unity 4.6.1f1)

Сообщение ReinDeer 31 янв 2015, 13:23

Отбой, это я неправильно скрипт использовал. Я доволен :D .
ReinDeer
UNец
 
Сообщения: 21
Зарегистрирован: 25 янв 2015, 15:11
Откуда: Ульяновск
Skype: nya.rein.deer

Re: uGUI Joystick (Unity 4.6.1f1)

Сообщение ReinDeer 31 янв 2015, 20:17

Есть такая проблема. Используя Canvas Scaler - Scale with screen size, джойтики увеличиваются, но ведут себя странно. Кликаешь по джойстику в правом углу, а крутишь в середине центра, будто бы и не увеличивал экран.
P.S надеюсь понятно разъяснил.
ReinDeer
UNец
 
Сообщения: 21
Зарегистрирован: 25 янв 2015, 15:11
Откуда: Ульяновск
Skype: nya.rein.deer

Re: uGUI Joystick (Unity 4.6.1f1)

Сообщение Ert Donuell 08 фев 2015, 16:13

Обновил скрипт.
Исправил указанные баги.
Также теперь джойстик работает корректно даже будучи повёрнутым на любой угол и масштабированным вдоль любой оси.
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: uGUI Joystick (Unity 4.6.1f1)

Сообщение Homer 02 мар 2015, 19:18

Что за Handle что туда кидать ? ( Новичек в Unity)
Homer
UNец
 
Сообщения: 36
Зарегистрирован: 02 мар 2015, 19:10

uGUI Joystick (Unity 5.2.0f1)

Сообщение Ert Donuell 04 сен 2015, 16:06

Решил срубить профит со своих стараний. Добавил новые фичи) Наслаждайтесь!
http://unity3d.ru/distribution/viewtopic.php?f=12&t=34554
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: uGUI Joystick (Unity 4.6.1f1)

Сообщение ReinDeer 01 янв 2016, 01:14

Аж год прошел)
Код в определенное иерархии ГО может не работать и ломать циклом.
Синтаксис:
Используется csharp
               do{
                        if (curTransform.GetComponent<Canvas>() != null)
                        {
                                _canvas = curTransform.GetComponent<RectTransform>();
                                break;
                        }
                        curTransform = curTransform.parent;//Вроде идея такая была.
                }
                while (curTransform != null);
ReinDeer
UNец
 
Сообщения: 21
Зарегистрирован: 25 янв 2015, 15:11
Откуда: Ульяновск
Skype: nya.rein.deer

Re: uGUI Joystick (Unity 4.6.1f1)

Сообщение Ert Donuell 11 фев 2016, 15:14

Ого, здоровенный косяк! Спасибо большое!
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ


Вернуться в Исходники (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1