Лучший способ перемещения игрового объекта в Unity 3D - PullRequest
0 голосов
/ 20 января 2019

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

Каковы плюсы / минусы каждого из этих методов и какие предпочтительны для RPG от первого лица?

// Here I use MovePosition function on the rigid body of this component
Rigidbody.MovePosition(m_Rigidbody.position + movement);

//Here I apply force to the rigid body and am able to choose force mode
Rigidbody.AddForce(15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);

// Here I directly change a transforms position value, in this case the cam
Transform.transform.position = playerTransform.position + cameraOffset;

Спасибо !!

EDIT;

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

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Твердые тела и скорости / Физика

Единственный раз, когда я лично использовал систему hardbodys, был при реализации моих собственных boids (поведение флокирования), как вам нужночтобы вычислить несколько отдельных векторов и применить их все к юниту.

   Rigidbody.MovePosition(m_Rigidbody.position + movement);

Это вычисляет вектор движения к цели, используя физическую систему, так что скорость и движение объекта все еще могут зависеть от перетаскивания., угловое сопротивление и так далее.

Эта конкретная функция является оберткой вокруг Rigidbody.AddForce Я полагаю.

Плюсы:

  • Хорошо, если вам нужны реалистичные физические реакции

Минусы:

  • Немного громоздко использовать, если все, чего вы пытаетесь достичь, это перемещение объекта из точки А в точку Б.

    • Иногда неправильная настройка, установленная где-то слишком высоко (например: Масса> 10000000), может привести к очень странным ошибкам в поведении, которые могут быть довольно трудной задачей для определения и смягчения.

Примечания: Твердые тела при столкновении с другим твердым телом будут отскакивать друг от друга в зависимости от настроек физики.

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

И Rigidbody.AddForce в основном такие же, как указано выше, за исключением того, что вы сами вычисляете вектор.

Так, например, чтобы получить вектор к цели, вы бы сделали

Vector3 target = target.position - myPosition;

Rigidbody.AddForce(target * 15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);

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

Так как гораздо проще заставить вещи вести себя так, как вы хотите, если, конечно, вы не стремитесь к физическому реализму!

Интерполяция позиции единиц

Плюсы:

  • Возможно, поначалу немного странно понять, но гораздо проще заставить объекты двигаться так, как вы хотите

Минусы:

  • Если вы хотите реалистичной реакции на объекты, влияющие на вас, вам придется выполнять большую часть работы самостоятельно.Но иногда это предпочтительнее, чем использовать физическую систему, а затем пытаться, как я уже говорил, приручить ее.

Вы могли бы использовать эту технику, скажем, в игре Pokemon, вы не останавливаетесь в Pokemon и не ждете, пока пепел прекратит скользить или ударит стену и неудержимо подпрыгнет назад.

Thisопределенная функция устанавливает положение объектов, например, телепортирование, но вы также можете использовать это для плавного перемещения персонажа в позицию.Я предлагаю поискать «анимацию» для плавной интерполяции между переменными.

    //change the characters x by + 1 every tick, 
Transform.transform.position.x += 1f;
0 голосов
/ 20 января 2019
  1. Rigidbody.MovePosition(m_Rigidbody.position + movement);

Из документов:

Если на Rigidbody включена интерполяция Rigidbody, вызов Rigidbody.MovePosition приводит к плавному переходу между двумя позициями в любых визуализированных промежуточных кадрах. Это следует использовать, если вы хотите непрерывно перемещать твердое тело в каждом FixedUpdate. https://docs.unity3d.com/ScriptReference/Rigidbody.MovePosition.html

  1. Rigidbody.AddForce(15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);

Это заставит объект ускоряться, поэтому он не будет двигаться с постоянной скоростью (это из-за второго закона Ньютона, сила = масса * ускорение). Также, если у вас есть другая сила, движущаяся в противоположном направлении, эта сила может быть отменена, и объект вообще не будет двигаться.

  1. Transform.transform.position = playerTransform.position + cameraOffset;

Это телепортирует объект. Без плавного перехода, без взаимодействия с какими-либо силами, уже находящимися в игре, просто мгновенное изменение позиции.

...