Лучший способ перемещения игрового объекта в Unity 3D

Я нашел это решение или лучше обход:

  1. отключить aapt2 на gradle.properties android.enableAapt2 = false
  2. внутри подпроектов build.gradle вставить это: afterEvaluate {project -> if (project.hasProperty ("android")) {android {compileSdkVersion 26}}}
1
задан Half_Duplex 20 January 2019 в 00:24
поделиться

2 ответа

  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;

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

0
ответ дан jbinvnt 20 January 2019 в 00:24
поделиться

RigidBodies и Velocities / Physics

Единственный раз, когда я лично использовал систему 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);

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

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

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

Плюсы :

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

Минусы:

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

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

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

    //change the characters x by + 1 every tick, 
Transform.transform.position.x += 1f;
0
ответ дан Pheonix2105 20 January 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: