Сенсорный контроллер Unity2D и обнаружение смахивания - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь написать сценарий контроллера персонажа для моего главного героя 2D-платформы. Я хочу использовать левую сторону экрана телефона для перемещения игрока влево / вправо и правую сторону экрана для прыжков и рывков. Как в Android версии игр Limbo или oddmar . Я не хочу использовать кнопки, вместо этого я хочу использовать смахивание, например смахивание вправо для перемещения вправо, влево для перемещения влево и т. Д. c. До сих пор я написал этот сценарий:

using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;

public class TouchController : MonoBehaviour
{
    private Rigidbody2D rb;
    private Vector2 L_fingerDownPosition;
    private Vector2 L_fingerUpPosition;
    private Vector2 R_fingerDownPosition;
    private Vector2 R_fingerUpPosition;
    private float halfScreenWidth;
    private int Rtouch, Ltouch;
 
    [SerializeField] bool detectSwipeOnlyAfterRelease = false;
    [SerializeField] float PlayerSpeed = 10;
    [SerializeField] float SWIPE_THRESHOLD = 20f;
    [SerializeField] GameObject MC;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        halfScreenWidth = Screen.width / 2;
        Ltouch = -1;
        Rtouch = -1;
    }

    private void Update()
    {
        Touch();
    }

    private void Touch()
    {
        for(int i = 0; i < Input.touchCount; i++)
        {
            //for every touch 'i' input is stored in 't'
            Touch t = Input.GetTouch(i);

            //if touch is in left side of the screen
            if (t.position.x < halfScreenWidth && Ltouch==-1)
            {
                switch (t.phase)
                {
                    case TouchPhase.Began:
                        L_fingerUpPosition = t.position;
                        L_fingerDownPosition = t.position;
                        Debug.Log("Start tracking the Left finger");
                        break;
                    case TouchPhase.Moved:
                        if (!detectSwipeOnlyAfterRelease)
                        {
                            L_fingerDownPosition = t.position;
                            L_DetectSwipe();
                        }
                        break;
                    case TouchPhase.Ended:
                    case TouchPhase.Canceled:
                        L_fingerDownPosition = t.position;
                        L_DetectSwipe();
                        Ltouch = -1;
                        Debug.Log("Stopped tracking left finger");
                        break;
                }
            }
            //if touch is in right side of the screen
            else if (t.position.x > halfScreenWidth && Rtouch==-1) 
            {
                switch (t.phase)
                {
                    case TouchPhase.Began:
                        R_fingerUpPosition = t.position;
                        R_fingerDownPosition = t.position;
                        Debug.Log("Start tracking the Right finger");
                        break;
                    case TouchPhase.Moved:
                        if (!detectSwipeOnlyAfterRelease)
                        {
                            R_fingerDownPosition = t.position;
                            R_DetectSwipe();
                        }
                        break;
                    case TouchPhase.Ended:
                    case TouchPhase.Canceled:
                        R_fingerDownPosition = t.position;
                        R_DetectSwipe();
                        Rtouch = -1;
                        Debug.Log("Stopped tracking right finger");
                        break;
                }
            }
        }
    }

    //============================ LEFT TOUCH ============================//
    private void L_DetectSwipe()
    {
        if (L_horizontalValMove() > SWIPE_THRESHOLD && L_horizontalValMove() > L_verticalMove())
        {
            if (L_fingerDownPosition.x - L_fingerUpPosition.x > 0)//Right swipe
            {
                L_OnSwipeRight();
            }
            else if (L_fingerDownPosition.x - L_fingerUpPosition.x < 0)//Left swipe
            {
                L_OnSwipeLeft();
            }
            L_fingerUpPosition = L_fingerDownPosition;
        }
    }

    float L_verticalMove()
    {
        return Mathf.Abs(L_fingerDownPosition.y - L_fingerUpPosition.y);
    }

    float L_horizontalValMove()
    {
        return Mathf.Abs(L_fingerDownPosition.x - L_fingerUpPosition.x);
    }

    //============================ ON SWIPE (L) ============================//
    void L_OnSwipeLeft()
    {
        MC.transform.Translate(Vector2.left * 5 * Time.deltaTime);
        Debug.Log("Swipe Left");
    }

    void L_OnSwipeRight()
    {
        MC.transform.Translate(Vector2.right * 5 * Time.deltaTime);
        Debug.Log("Swipe Right");
    }
    //======================================================================//

    //============================ RIGHT TOUCH ============================//
    private void R_DetectSwipe()
    {
        // Check if Vertical swipe
        if (R_verticalMove() > SWIPE_THRESHOLD && R_verticalMove() > R_horizontalValMove())
        {
            if (R_fingerDownPosition.y - R_fingerUpPosition.y > 0)//up swipe
            {
                R_OnSwipeUp();
            }
            else if (R_fingerDownPosition.y - R_fingerUpPosition.y < 0)//Down swipe
            {
                R_OnSwipeDown();
            }
            R_fingerUpPosition = R_fingerDownPosition;
        }

        //Check if Horizontal swipe
        else if (R_horizontalValMove() > SWIPE_THRESHOLD && R_horizontalValMove() > R_verticalMove())
        {
            if (R_fingerDownPosition.x - R_fingerUpPosition.x > 0)//Right swipe
            {
                R_OnSwipeRight();
            }
            else if (R_fingerDownPosition.x - R_fingerUpPosition.x < 0)//Left swipe
            {
                R_OnSwipeLeft();
            }
            R_fingerUpPosition = R_fingerDownPosition;
        }
    }

    float R_verticalMove()
    {
        return Mathf.Abs(R_fingerDownPosition.y - R_fingerUpPosition.y);
    }

    float R_horizontalValMove()
    {
        return Mathf.Abs(R_fingerDownPosition.x - R_fingerUpPosition.x);
    }

    //============================ ON SWIPE (R) ============================//
    void R_OnSwipeUp()
    {
        //Jump up
        Debug.Log("Swipe UP");
    }

    void R_OnSwipeDown()
    {
        //Jump Down
        Debug.Log("Swipe Down");
    }

    void R_OnSwipeLeft()
    {
        //Dash left
        Debug.Log("Swipe Left");
    }

    void R_OnSwipeRight()
    {
        //Dash Right
        Debug.Log("Swipe Right");
    }
    //======================================================================//
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...