Я нашел это решение или лучше обход:
Rigidbody.MovePosition(m_Rigidbody.position + movement);
Из документов:
Если для Rigidbody включена интерполяция Rigidbody, вызов Rigidbody.MovePosition приводит к плавному переходу между две позиции в любых промежуточных кадрах. Это следует использовать, если вы хотите непрерывно перемещать твердое тело в каждом FixedUpdate. https://docs.unity3d.com/ScriptReference/Rigidbody.MovePosition.html
blockquote>
Rigidbody.AddForce(15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
Это будет заставить объект ускоряться, чтобы он не двигался с постоянной скоростью (это из-за второго закона Ньютона, сила = масса * ускорение). Также, если у вас есть другая сила, движущаяся в противоположном направлении, эта сила может быть отменена, и объект вообще не будет двигаться.
Transform.transform.position = playerTransform.position + cameraOffset;
Это телепортирует объект. Без плавного перехода, без взаимодействия с какими-либо силами, уже находящимися в игре, просто мгновенное изменение позиции.
RigidBodies и Velocities / Physics
Единственный раз, когда я лично использовал систему hardbodys, был при реализации моих собственных boids (поведение флокирования), как вам нужно вычислить несколько отдельных векторов и применить их все к единице.
Rigidbody.MovePosition(m_Rigidbody.position + movement);
Это вычисляет вектор движения к цели, используя физическую систему, поэтому скорость и движение объекта все еще могут зависеть от сопротивления, углового сопротивления и так далее.
Эта конкретная функция является оберткой вокруг Rigidbody.AddForce
Я считаю.
Плюсы:
Минусы:
Немного неудобно использовать, если все, что вы пытаетесь достичь, это перемещение объекта из точки А в точку Б.
Примечания: Твердые тела при столкновении с другим твердым телом будут отскакивать друг от друга в зависимости от настроек физики.
Они также подвержены влиянию гравитации. По сути, они пытаются имитировать объекты реальной жизни, но иногда бывает трудно приручить объекты и заставить их делать именно то, что вы хотите.
И Rigidbody.AddForce
в основном то же, что и выше, за исключением того, что вы сами вычисляете вектор.
Так, например, чтобы получить вектор к цели, вы бы сделали
Vector3 target = target.position - myPosition;
Rigidbody.AddForce(target * 15 * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
Если вы не планируете использовать какую-либо основную физическую механику в своей игре, я бы предложил двигаться, интерполируя положение объектов. . [+1122]
Поскольку гораздо проще заставить вещи вести себя так, как вы хотите, если, конечно, вы не стремитесь к физическому реализму!
Интерполяция позиции юнитов
Плюсы :
Минусы:
Вы будете использовать эту технику, скажем, в игре Pokemon, вы не останавливаетесь в Pokemon и не ждете, пока пепел прекратит скользить или ударит стену и неудержимо подпрыгнет назад.
Эта конкретная функция устанавливает положение объектов, например, телепортацию, но вы также можете использовать это для плавного перемещения персонажа в позицию. Я предлагаю поискать «подростки» для плавной интерполяции между переменными.
//change the characters x by + 1 every tick,
Transform.transform.position.x += 1f;