Unity: проблема управления через джойстик

198
03 сентября 2018, 11:50

Уже третий день мучаюсь с управлением для мобильной игры. Я хочу реализовать управление через джойстик.

Я хочу такое управление в игре как в Color Road - https://vk.com/video174341022_456239047
А у меня получилось вот такое (через джойстик) - https://vk.com/video174341022_456239048

Разница в том, что в игре Color Road гамбургер можно держать по центру вообще не напрягаясь, очень удобно из края экрана перейти в центр. В моем управлении чтобы держаться в центе экрана нужно приложить немалые усилия, потому что если чуть сильнее влево отодвинешь джойстик - то треугольник отлетает в край экрана, а если недожмешь налево джойстик, то он будет перемещаться со скоростью черепахи.

Код джойстика:

public class VirtualJoystick : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler {
    private Image backgroundImage;
    private Image joystickImage;
    private Vector3 inputVector;
    private void Start()
    {
        backgroundImage = GetComponent<Image>();
        joystickImage = transform.GetChild(0).GetComponent<Image>();
    }
    public virtual void OnDrag(PointerEventData eventData)
    {
        Vector2 pos;
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(backgroundImage.rectTransform, eventData.position,
            eventData.pressEventCamera, out pos))
        {
            pos.x = (pos.x / (backgroundImage.rectTransform.sizeDelta.x));
            //pos.y = (pos.y / backgroundImage.rectTransform.sizeDelta.y);
            inputVector = new Vector3(pos.x * 2f, 0, 0);
            inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;
            joystickImage.rectTransform.anchoredPosition = new Vector3(inputVector.x * (backgroundImage.rectTransform.sizeDelta.x / 2),
                inputVector.z * inputVector.y);
        }
    }
    public virtual void OnPointerDown(PointerEventData eventData)
    {
        OnDrag(eventData);
    }
    public virtual void OnPointerUp(PointerEventData eventData)
    {
        inputVector = Vector3.zero;
        joystickImage.rectTransform.anchoredPosition = Vector3.zero;
    }
    public float Horizontal()
    {
        if (inputVector.x != 0)
        {
            return inputVector.x;
        }
        else
        {
            return Input.GetAxis("Horizontal");
        }
    }
}

Код управления треугольника:

public class PlayerMover : MonoBehaviour {
    public VirtualJoystick joystick;
    private Vector3 MoveVector;
    private Rigidbody2D rigidbody;
    public float moveSpeed = 10;
    void Start()
    {
        rigidbody = gameObject.GetComponent<Rigidbody2D>();
    }
    void Update()
    {
        MoveVector = PoolInput();
        Move();
    }
    private void Move()
    {
        rigidbody.velocity = Vector2.zero;
        rigidbody.velocity = ((MoveVector * moveSpeed));
    }
    private Vector3 PoolInput()
    {
        Vector3 dir = Vector3.zero;
        dir.x = joystick.Horizontal();
        dir.y = 0;
        dir.z = 0;
        if (dir.magnitude > 1)
            dir.Normalize();
        Debug.Log("Dir = " + dir);
        return dir;
    }
}

Не могу найти никакой инфы чтобы это пофиксить. Везде одинаковые туториалы. Может это как-то по другому нужно реализовывать? Не через джойстик? В чем проблема такого деревянного управления у меня?

READ ALSO
Передача объекта в метод

Передача объекта в метод

Вопрос из серии "данет" и "дубликат, гуглить не умеешь"

175
Подскажите из за чего может быть подобное?

Подскажите из за чего может быть подобное?

Пишу код с использованием Дженериков на C#Возник вопрос из за чего Visual Studio ругается на подобное выражение:

179
Запрет подключения библиотеки

Запрет подключения библиотеки

Работаю над проектом, в нем используется GuardantSDK

207
C# WPF ComboBox ToggleButton BorderThickness

C# WPF ComboBox ToggleButton BorderThickness

Как изменить BorderThickness для ComboBox ToggleButton?

179