У вас есть скорость x в y вектора 3
if (Direction == "U")
{
rb.velocity = new Vector3(rb.velocity.x, DragonSpeed * MoveUp);
}
if (Direction == "D")
{
rb.velocity = new Vector3(rb.velocity.x, DragonSpeed * MoveDown);
}
Это работает в вашем скрипте игрока, когда вы переопределяете значения в последующем утверждении.
float MoveSide = Input.GetAxis("Horizontal"); //eg 1
float MoveVert = Input.GetAxis("Vertical"); // eg 1
// setting your x velocity incorrectly to the y (vert) velocity speed and keeping y the same velocity as start of frame
rb.velocity = new Vector3(Speed * MoveVert, rb.velocity.y);
// Set the y to the x value of the statement above so it is now in the correct vector and set the x to the correct hoz velocity
rb.velocity = new Vector3(Speed * MoveSide, rb.velocity.x);
// effectively doing
rb.velocity = new Vector3(Speed * MoveSide, Speed * MoveVert);
Вы также должны использовать MovePosition, поскольку он не влияет напрямую на физический движок (использование скорости может повлиять на столкновения и триггеры и создать неожиданную физику).Ваши игровые объекты должны быть помечены как кинематические, иначе нижеприведенное заставит их мгновенно телепортироваться на новую позицию.
var movementDirection = new Vector3(Speed * MoveSide, Speed * MoveVert);
rb.MovePosition(transform.position + movementDirection * Time.deltaTime);
А * Time.deltaTime гарантирует, что движение согласованно для разных частот кадров.Если вы запустите игру на машине со скоростью 30 кадров в секунду, игровые объекты будут двигаться медленнее, чем со скоростью 60 кадров в секунду.Time.deltaTime вычисляет физическое время, прошедшее с предыдущего кадра, и обеспечивает одинаковое пройденное расстояние независимо от частоты кадров.
например, скажем, gameObject перемещается 1 за обновление кадра.Через секунду на машине со скоростью 30 кадров в секунду объект переместился бы на 30. Через секунду на машине со скоростью 60 кадров в секунду объект переместился бы на 60.
Time.deltaTime=.2s on 30 fps so 1 movement * .2 = move .2 per frame * 30 frames in the second = 60 moved
Time.deltaTime=.1s on 60 fps so 1 movement * .1 = move .1 per frame * 60 frames in the second = 60 moved