Unity3d Swipe Jump не очень отзывчив - PullRequest
2 голосов
/ 20 мая 2019

Я пытаюсь собрать игру для Android с использованием unity3D. Это мой скрипт контроллера персонажа, который я написал. Часть пролистывания ближе к концу кода, который я прокомментировал, где он находится.

float speed = 11.0f;
public float jumpForce = 0.005f;


public float FingerInitialPosition = 0f;
public float FingerMovedPosition = 0f;
public float startTouchPosition = 0f;
public float endTouchPosition = 0f;

public Rigidbody2D rb;
public Vector3 jump;
public int jumpCount;


Vector3 moveDir = Vector3.zero;

// Start is called before the first frame update
void Start()
{
    rb = GetComponent<Rigidbody2D>();
    jump = new Vector3(0.0f, 1f, 0.0f);

}


void OnCollisionEnter2D(Collision2D col)
{

    Debug.Log("Collided");
    jumpCount=0;            

}

void FixedUpdate()
{

    Debug.Log(jumpCount);
    if(transform.position.y < -14) { SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); }


    foreach (Touch FingerTouch in Input.touches)
    {
        if (FingerTouch.position.x < Screen.width / 2)
        {
            if (FingerTouch.phase == TouchPhase.Began)
            {
                FingerInitialPosition = FingerTouch.position.x;
            }
            else if (FingerTouch.phase == TouchPhase.Moved)
            {
                FingerMovedPosition = FingerTouch.position.x;

                if (FingerMovedPosition > FingerInitialPosition)
                {
                     float hval = rb.velocity.x;
                     hval += 19f;
                     hval *= Mathf.Pow(0.5f, Time.deltaTime * 10f);
                     rb.velocity = new Vector2(hval, rb.velocity.y);



                }
                else if (FingerMovedPosition < FingerInitialPosition)
                {
                    float hval = rb.velocity.x;
                    hval -= 19f;
                    hval *= Mathf.Pow(0.5f, Time.deltaTime * 10f);
                    rb.velocity = new Vector2(hval, rb.velocity.y);
                }
            }
            else if (FingerTouch.phase == TouchPhase.Ended)
            {
                FingerInitialPosition = 0f;
                FingerMovedPosition = 0f;

            }
            else //NEW PART!//
            {
                FingerMovedPosition = FingerTouch.position.x;
                if (FingerMovedPosition > FingerInitialPosition)
                {
                    float hval = rb.velocity.x;
                    hval += 19f;
                    hval *= Mathf.Pow(0.5f, Time.deltaTime * 10f);
                    rb.velocity = new Vector2(hval, rb.velocity.y);
                }
                else if (FingerMovedPosition < FingerInitialPosition)
                {
                    float hval = rb.velocity.x;
                    hval -= 19f;
                    hval *= Mathf.Pow(0.5f, Time.deltaTime * 10f);
                    rb.velocity = new Vector2(hval, rb.velocity.y);

                }
            }
        }

        // The part I think needs fixing
        // The swipe Up part where I make the player jump

        if (FingerTouch.position.x > Screen.width / 2)
        {
            for (int i = 0; i < Input.touchCount; i++)
            {
                Touch touch = Input.GetTouch(i);
                if (touch.phase == TouchPhase.Began)
                {
                    startTouchPosition = touch.position.y;
                }
                else if (touch.phase == TouchPhase.Ended)
                {
                    endTouchPosition = touch.position.y;
                    if (endTouchPosition > startTouchPosition)
                    {
                        if (jumpCount<1) {
                            rb.AddForce(jump * jumpForce, ForceMode2D.Impulse);
                            jumpCount += 1;
                        }

                    }
                }
            }
        }



    }



}

Смахивание (по горизонтали) в левой части экрана позволяет игроку перемещаться вправо и влево, а при перемещении вверх в правой части экрана позволяет игроку прыгать. Моя проблема в том, что прыжок не очень отзывчив, у меня есть сделал тест Он был отзывчивым только 3/5 раз.

Я также прилагаю скриншот моего игрока

enter image description here

1 Ответ

1 голос
/ 21 мая 2019

Вместо того, чтобы иметь вложенный цикл, продолжайте использовать элемент FingerTouch.

Кроме того, вместо того, чтобы сравнивать, когда палец убран, что может привести к задержкам, просто активируйте каждый раз, когда видно, что он движется вверх, проверяя FingerTouch.deltaPosition.y:

void FixedUpdate()
{

    Debug.Log(jumpCount);
    if(transform.position.y < -14) { SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); }


    foreach (Touch FingerTouch in Input.touches)
    {
        if (FingerTouch.position.x < Screen.width / 2)
        {
            if (FingerTouch.phase == TouchPhase.Began)
            {
                FingerInitialPosition = FingerTouch.position.x;
            }
            else if (FingerTouch.phase == TouchPhase.Moved)
            {
                FingerMovedPosition = FingerTouch.position.x;

                if (FingerMovedPosition > FingerInitialPosition)
                {
                     float hval = rb.velocity.x;
                     hval += 19f;
                     hval *= Mathf.Pow(0.5f, Time.deltaTime * 10f);
                     rb.velocity = new Vector2(hval, rb.velocity.y);



                }
                else if (FingerMovedPosition < FingerInitialPosition)
                {
                    float hval = rb.velocity.x;
                    hval -= 19f;
                    hval *= Mathf.Pow(0.5f, Time.deltaTime * 10f);
                    rb.velocity = new Vector2(hval, rb.velocity.y);
                }
            }
            else if (FingerTouch.phase == TouchPhase.Ended)
            {
                FingerInitialPosition = 0f;
                FingerMovedPosition = 0f;

            }
            else //NEW PART!//
            {
                FingerMovedPosition = FingerTouch.position.x;
                if (FingerMovedPosition > FingerInitialPosition)
                {
                    float hval = rb.velocity.x;
                    hval += 19f;
                    hval *= Mathf.Pow(0.5f, Time.deltaTime * 10f);
                    rb.velocity = new Vector2(hval, rb.velocity.y);
                }
                else if (FingerMovedPosition < FingerInitialPosition)
                {
                    float hval = rb.velocity.x;
                    hval -= 19f;
                    hval *= Mathf.Pow(0.5f, Time.deltaTime * 10f);
                    rb.velocity = new Vector2(hval, rb.velocity.y);

                }
            }
        }

        else if (FingerTouch.position.x > Screen.width / 2)
        {
            if (FingerTouch.deltaPosition.y > 0) {
                if (jumpCount<1) {
                    rb.AddForce(jump * jumpForce, ForceMode2D.Impulse);
                    jumpCount += 1;
                }
            }
        }

    }
}

Это может быть только частичное решение. Если это все еще не работает, мне любопытно, если убрать проверку if (jumpCount<1), это сработает. Если это произойдет, проблема может быть связана с тем, как вы установите его обратно на 0.

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