управление свайпом для игры Unity Runner [дубликат]

117
24 января 2021, 18:00
На этот вопрос уже дан ответ здесь:
Как отловить ивент свайпа / Swipe в Unity? (1 ответ)
Закрыт 1 год назад.

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

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;
            }
        }
    }
}
Answer 1

проголосовал за закрытие как дубликат т.к. уже есть запощеное решение реализации свайпа которое значительно удобнее того кода который ты написал

пример использования

(правда, писал не проверяя так что могут затесатся ошибки мелкие)

public void Start()
{
    SwipeDetector.OnSwipe += MovementControl;
}
private void MovementControl(SwipeData data)
{
    switch(data.swipeData)
    {
        case (SwipeDirection.Up)
           //Логика движения
           break;
        case (SwipeDirection.Down)
           //Логика движения
           break;
        case (SwipeDirection.Left)
           //Логика движения
           break;
        case (SwipeDirection.Right)
           //Логика движения
           break;
    }
}
READ ALSO
Задача на построение расписания

Задача на построение расписания

Есть такая задача: 30 работников отметили дни в которые они бы хотели работать ,а в какие отдыхать

102
C# htmlAgilityPack как получить строку в теге strong

C# htmlAgilityPack как получить строку в теге strong

У меня есть такой xPath локатор

103
Не получается передать null в Expression

Не получается передать null в Expression

Есть такой рабочий код:

85
EF Core странно кешируется внутри Scope

EF Core странно кешируется внутри Scope

Поймал багу с Entity Framework Core 22 (Npgsql) и не могу понять, что происходит за кулисами, в чем и прошу помочь разобраться

107