При использовании Unity и c#, как сделать движение объектов менее плавным и плавным? - PullRequest
0 голосов
/ 12 марта 2020

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

У меня есть это в классе publi c:

Vector2 dir = Vector2.right;

Моя функция запуска выглядит так:

void Start() {

    dragDistance = Screen.height * 5 / 100; //dragDistance is 5% height of the screen
    InvokeRepeating("Move", 0.3f, 0.075f);

}

Внутри моей функции обновления у меня есть это :

if (Mathf.Abs(lp.x - fp.x) > dragDistance || Mathf.Abs(lp.y - fp.y) > dragDistance)
            {//It's a drag
             //check if the drag is vertical or horizontal
                if (Mathf.Abs(lp.x - fp.x) > Mathf.Abs(lp.y - fp.y))
                {   //If the horizontal movement is greater than the vertical movement...
                    if ((lp.x > fp.x))  //If the movement was to the right)
                    {   //Right swipe
                        dir = Vector2.right;
                    }
                    else
                    {   //Left swipe
                        dir = -Vector2.right;
                    }
                }
                else
                {   //the vertical movement is greater than the horizontal movement
                    if (lp.y > fp.y)  //If the movement was up
                    {   //Up swipe
                        dir = Vector2.up;
                    }
                    else
                    {   //Down swipe
                        dir = -Vector2.up;
                    }
                }
            }

А после функции обновления у меня есть:

void Move()
{
    // Move head into new direction
    transform.Translate(dir);
}

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Проблема в том, что вы не двигаете каждый кадр. Вы можете исправить это, переместив функцию update () следующим образом:

transform.Translate(dir * speed * Time.deltaTime);

Вместо выполнения InvokeRepeating и Move ().

Но что, если вы хотите, чтобы змея остановилась на каждом квадрат, как сейчас, но плавно переходить от квадрата к квадрату? Вам нужно сохранить следующую позицию змеи в вашей функции move (), а затем плавно переместить змею туда в Update (). Это будет выглядеть примерно так:

void Move()
{
    // Move head to next position
    prevSquare = transform.position;   // keep track of the previous square
                                       // so we can use lerp() later on
    nextSquare = transform.position + dir;
    progress = 0;     // progress is the percent distance between the two squares
    isMoving = true;  //we probably need isMoving so we can decide what to do if they
                      //swipe while snake is moving, I'll leave it to you to figure 
                      //out
}


update()
{
     ...

     if(isMoving)
     {
          progress = progress + time.deltaTime;
          transform.position = Vector2.Lerp(prevSquare, nextSquare, progress);
          if(progress > 1.0f)
          {
               isMoving = false;
          }
     }
}
0 голосов
/ 12 марта 2020

Это просто из-за того, как вы в данный момент двигаетесь.
Использование InvokeRepeating для перемещения вашего персонажа будет супер изменчивым, поскольку вы просто двигаетесь «вперед» на определенную величину каждый раз, когда InvokeRepeating повторяется.

Вы действительно не должны использовать это для перемещения вашего персонажа. Обычно вы хотите, чтобы какая-то форма твердого тела и физика двигалась. Возможно, попробуйте что-то вроде этого:

public Rigidbody2D rb;

void FixedUpdate() {

  rb.MovePosition((rb.position + dir) * Time.fixedDeltaTime);

}

Это может быть очень простой ответ. Ознакомьтесь с некоторыми более подробными сведениями об этом методе здесь .
Также попробуйте поискать некоторые учебники по движению в Unity.

...