Размах управления для игры Unity Runner - PullRequest
0 голосов
/ 29 мая 2019

Я делаю запущенную игру на Android с использованием C #. Я пытаюсь сделать управление смахиванием для бегуна Unity, но код не работает должным образом. Иногда, когда я провожу пальцем влево, игрок идет направо и прыгает ужасно. Вот мой код, я не понимаю, где моя ошибка. иногда это вообще отсутствует. Позиция игрока: (10, 1, 0) и позиция земли (плоскости): (10, 0, 0). Игрок - это простой Цилиндр с Твердым Телом.

public int leftLine = 7;
public int rightLine = 13;
public int currentLine = 10;
public int distanceBetweenLines = 3;

public float xSideMoveSpeed = 50f;
public float minSwipDelta = 10f;
public float jumpSpeed = 100f;

Vector2 swipeDelta;

bool canSwipe,
    RightSwipe,
    LeftSwipe,
    UpSwipe,
    DownSwipe;

Rigidbody rb;
public float maxDistanceForJumping = 1.05f;

void Start()
{
    rb = gameObject.GetComponent<Rigidbody>();
}

void Update()
{
    TouchDetector();
    MoveByTouch();
}

void FixedUpdate()
{
    if (IsGrounded() && UpSwipe)
    {
        rb.AddForce(Vector3.up * jumpSpeed);
        UpSwipe = false;
    }
}

public bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, maxDistanceForJumping);
}

void MoveByTouch()
{
    if (canSwipe && RightSwipe)
    {
        if (currentLine < rightLine)
            currentLine += distanceBetweenLines;

        canSwipe = false;
        swipeDelta = Vector2.zero;
    }

    if (canSwipe && LeftSwipe)
    {
        if (currentLine > leftLine)
            currentLine -= distanceBetweenLines;

        canSwipe = false;
        swipeDelta = Vector2.zero;
    }

    Vector3 newPos = new Vector3(currentLine, transform.position.y, transform.position.z);
    transform.position = Vector3.Lerp(transform.position, newPos, xSideMoveSpeed * Time.deltaTime);
}

void TouchDetector()
{
    if (Input.touchCount > 0)
    {
        // can we swipe or ont
        if (Input.touches[0].phase == TouchPhase.Began)
        {
            canSwipe = true;
        }       
        else if (Input.touches[0].phase == TouchPhase.Canceled || Input.touches[0].phase == TouchPhase.Ended)
        {
            canSwipe = false;
            swipeDelta = Vector2.zero;
        }         

        if (Input.touches[0].phase == TouchPhase.Moved)
        {
            // Calculating delta
            if (Mathf.Abs(Input.touches[0].deltaPosition.sqrMagnitude) > minSwipDelta)
                swipeDelta = Input.touches[0].deltaPosition;
            else
                swipeDelta = Vector2.zero;

            // Detecting arrows
            if (Mathf.Abs(swipeDelta.x) > Mathf.Abs(swipeDelta.y) && swipeDelta.x > 0)
            {
                RightSwipe = true;
                LeftSwipe = UpSwipe = DownSwipe = false;
            }

            if (Mathf.Abs(swipeDelta.x) > Mathf.Abs(swipeDelta.y) && swipeDelta.x < 0)
            {
                LeftSwipe = true;
                RightSwipe = UpSwipe = DownSwipe = false;
            }

            if (Mathf.Abs(swipeDelta.x) < Mathf.Abs(swipeDelta.y) && swipeDelta.y > 0)
            {
                UpSwipe = true;
                RightSwipe = LeftSwipe = DownSwipe = false;
            }

            if (Mathf.Abs(swipeDelta.x) < Mathf.Abs(swipeDelta.y) && swipeDelta.y < 0)
            {
                DownSwipe = true;
                RightSwipe = LeftSwipe = UpSwipe = false;
            }
        }
    }
}
...