Unity Joystick Bug, он идет в то же место на первом касании - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь сделать простую игру, в которой движется мяч, но есть проблема. Когда я нажимаю джойстик, плеер движется правильно, но каждый раз, когда я касаюсь джойстика, он сначала go в левом нижнем положении, а не там, где я только что нажал. Положение на экране - то, куда оно идет, даже если я касаюсь другого места enter image description here

Вот сценарий джойстика:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;

public class VirtualJoystick : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler
{

private Image bgImg;
private Image joystickImg;
private Vector3 inputVector;

private void Start()
{
    bgImg = GetComponent<Image>();
    joystickImg = transform.GetChild(0).GetComponent<Image>();
}

public virtual void OnDrag(PointerEventData ped)
{
    Vector2 pos;
    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.x);

        inputVector = new Vector3(pos.x * 2 + 1, 0, pos.y * 2 - 1);
        inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;

        // Move joystickImg
        joystickImg.rectTransform.anchoredPosition =
            new Vector3(inputVector.x * bgImg.rectTransform.sizeDelta.x / 3
                , inputVector.z * (bgImg.rectTransform.sizeDelta.y / 3));

    }
}

public virtual void OnPointerDown(PointerEventData ped)
{
    OnDrag(ped);
}

public virtual void OnPointerUp(PointerEventData ped)
{
    inputVector = Vector3.zero;
    joystickImg.rectTransform.anchoredPosition = Vector3.zero;
}

public float Horizontal()
{
    if (inputVector.x != 0)
        return inputVector.x;
    else
        return Input.GetAxis("Horizontal");
}

public float Vertical()
{
    if (inputVector.x != 0)
        return inputVector.z;
    else
        return Input.GetAxis("Vertical");
}
}

1 Ответ

0 голосов
/ 25 февраля 2020

Я замечаю, что в OnDrag() вы устанавливаете pos.y, используя bgImg.rectTransform.sizeDelta.x вместо bgImg.rectTransform.sizeDelta.y.

И в Vertical() вы также проверяете inputVector.x вместо inputVector.z.

Скорее всего, это не исправит ошибку, но это хорошие исправления.

Будет работать удаление смещения в

inputVector = new Vector3(pos.x * 2 + 1, 0, pos.y * 2 - 1);

Измените это на

inputVector = new Vector3(pos.x * 2, 0, pos.y * 2);

убрав +1 и -1, и это должно это исправить!

...