Страница 1 из 1

uGUI Joystick (Unity 4.6.1f1)

СообщениеДобавлено: 18 окт 2014, 05:11
Ert Donuell
Надеюсь, кому-нибудь пригодится. Писал сам.

Синтаксис:
Используется 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;
        }
}

Re: uGUI Joystick (Unity 4.6.0b20)

СообщениеДобавлено: 22 дек 2014, 16:39
romeo98
У меня ругается на класс ReferenceResolution. Какое пространство имен оно использует? Или этот код уже устарел и не работает на 4.6.0f3?

Re: uGUI Joystick (Unity 4.6.0b20)

СообщениеДобавлено: 09 янв 2015, 06:09
Ert Donuell
Да, этот компонент уже пропал. Нужно будет поправить.

Re: uGUI Joystick (Unity 4.6.1f1)

СообщениеДобавлено: 09 янв 2015, 16:20
Ert Donuell
Отредактировал под новую версию. Теперь работает.

Re: uGUI Joystick (Unity 4.6.1f1)

СообщениеДобавлено: 29 янв 2015, 19:16
ReinDeer
Очень дерганно как-то получается. При особой активности аж двоиться0_0

Re: uGUI Joystick (Unity 4.6.1f1)

СообщениеДобавлено: 29 янв 2015, 19:24
Ert Donuell
Он возвращает текущее положение ручки. Подпилю малость, добавлю плавное изменение выходной величины.

Re: uGUI Joystick (Unity 4.6.1f1)

СообщениеДобавлено: 31 янв 2015, 13:23
ReinDeer
Отбой, это я неправильно скрипт использовал. Я доволен :D .

Re: uGUI Joystick (Unity 4.6.1f1)

СообщениеДобавлено: 31 янв 2015, 20:17
ReinDeer
Есть такая проблема. Используя Canvas Scaler - Scale with screen size, джойтики увеличиваются, но ведут себя странно. Кликаешь по джойстику в правом углу, а крутишь в середине центра, будто бы и не увеличивал экран.
P.S надеюсь понятно разъяснил.

Re: uGUI Joystick (Unity 4.6.1f1)

СообщениеДобавлено: 08 фев 2015, 16:13
Ert Donuell
Обновил скрипт.
Исправил указанные баги.
Также теперь джойстик работает корректно даже будучи повёрнутым на любой угол и масштабированным вдоль любой оси.

Re: uGUI Joystick (Unity 4.6.1f1)

СообщениеДобавлено: 02 мар 2015, 19:18
Homer
Что за Handle что туда кидать ? ( Новичек в Unity)

uGUI Joystick (Unity 5.2.0f1)

СообщениеДобавлено: 04 сен 2015, 16:06
Ert Donuell
Решил срубить профит со своих стараний. Добавил новые фичи) Наслаждайтесь!
http://unity3d.ru/distribution/viewtopic.php?f=12&t=34554

Re: uGUI Joystick (Unity 4.6.1f1)

СообщениеДобавлено: 01 янв 2016, 01:14
ReinDeer
Аж год прошел)
Код в определенное иерархии ГО может не работать и ломать циклом.
Синтаксис:
Используется csharp
               do{
                        if (curTransform.GetComponent<Canvas>() != null)
                        {
                                _canvas = curTransform.GetComponent<RectTransform>();
                                break;
                        }
                        curTransform = curTransform.parent;//Вроде идея такая была.
                }
                while (curTransform != null);

Re: uGUI Joystick (Unity 4.6.1f1)

СообщениеДобавлено: 11 фев 2016, 15:14
Ert Donuell
Ого, здоровенный косяк! Спасибо большое!