Rigidbody движется не плавно, а рывками, как делать движение
|
|
alexsilent | Дата: Пятница, 17 Августа 2018, 08:00 | Сообщение # 1 |
почти ветеран
Сейчас нет на сайте
| Rigidbody движется не плавно, а рывками, если замедлить скорость, хотя бы на 50% Timescale = .5; хоть у меня не будет замедление времени, но даже при 100% скорости эти рывки видны местами, если присмотреться, как делать плавное движение персонажа при таком раскладе?
PS Я в данный момент использую Rigidbody2D для 2д своей игры, но и 3дшная версия тоже движется рывками.
Сообщение отредактировал alexsilent - Пятница, 17 Августа 2018, 08:54 |
|
| |
djwirtuoz | Дата: Пятница, 17 Августа 2018, 21:09 | Сообщение # 2 |
почетный гость
Сейчас нет на сайте
| http://dobrijzmej.org/unity3d_mathf_lerp/ https://habr.com/post/318046/ https://poqxert.ru/blog/unity/tutorials/matematika/matematika-unity-urok-9-mathf-interpolyaczii
Мы отстроили реальный мир, превратив его в убожество, теперь отстраиваем виртуальный, надеясь на лучшее.
|
|
| |
ZFly | Дата: Суббота, 15 Сентября 2018, 00:53 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Цитата alexsilent ( ) Rigidbody движется не плавно, а рывками Наводящий вопрос, а как вы двигаете Rigidbody? Через физику с помощью AddForce в FixedUpdate?
- Дед Мороз Гонки на газировке. Новогоднее приключение. - Лабиринт призраков
|
|
| |
ArtemS | Дата: Вторник, 18 Сентября 2018, 05:59 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| Мало инфы! оч мало инфы!
хуяк, хуяк и в продакшн
|
|
| |
IlyaKos | Дата: Вторник, 18 Сентября 2018, 14:51 | Сообщение # 5 |
участник
Сейчас нет на сайте
| 1) Двигать в FixedUpdate; 2) Установить настройки Interpolate и Continuous Dynamic.
|
|
| |
alexsilent | Дата: Среда, 19 Сентября 2018, 17:43 | Сообщение # 6 |
почти ветеран
Сейчас нет на сайте
| Цитата ZFly ( ) а как вы двигаете Rigidbody? Через физику с помощью AddForce в FixedUpdate? в FixedUpdate и через rigidbody.velocity
Код rigid.velocity = new Vector3(5,0,0);
пробовал просто запустить через AddForce и только на старте, но рывки всё равно есть, как будто сам Rigidbody перемещает весь объект рывками (при замедлении времени это особенно заметно, но всё равно глаза режет, когда и работает с обычной юнити скоростью в 50 раз в секунду, FixedUpdate)
Плавные перемещения происходят только тогда, когда работаешь без rigidbody с перемещениями transform, но так нельзя расчитать коллизию со стенами.
Сообщение отредактировал alexsilent - Среда, 19 Сентября 2018, 17:55 |
|
| |
drcrack | Дата: Среда, 19 Сентября 2018, 17:56 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| Вообще FixedUpdate на самом деле может вызываться несколько раз подряд перед Update, т.е. в одном кадре Чем ниже фпс, тем сильнее это заметно Обычно это не проблема но у тебя походу еще и код кривой, поэтому дергается
Сообщение отредактировал drcrack - Среда, 19 Сентября 2018, 17:57 |
|
| |
alexsilent | Дата: Среда, 19 Сентября 2018, 17:59 | Сообщение # 8 |
почти ветеран
Сейчас нет на сайте
| Цитата drcrack ( ) Вообще FixedUpdate на самом деле может вызываться несколько раз подряд перед Update а вот это интересно, надо погуглить
|
|
| |
ArtemS | Дата: Четверг, 20 Сентября 2018, 03:51 | Сообщение # 9 |
почетный гость
Сейчас нет на сайте
| Цитата alexsilent ( ) Плавные перемещения происходят только тогда, когда работаешь без rigidbody с перемещениями transform, но так нельзя расчитать коллизию со стенами.
тебя никто не заставляет двигать RB, просто это правильнее, потому что при столкновении тело продолжит движение и будут неприятные баги. А вообще ощущение что у тебя просто слабый комп, либо где-то по проекту есть строки которые сильно его напрягают.
хуяк, хуяк и в продакшн
|
|
| |
pixeye | Дата: Четверг, 20 Сентября 2018, 09:24 | Сообщение # 10 |
Red Winter Software
Сейчас нет на сайте
| Да все у тебя нормально с компом. C кодом скорее все в пределах разумного. Раз ты сказал что плавно все когда двигал через трансформ, могу предположить что у тебя есть камера которая двигается тоже когда куда-то бежит герой. Тогда у тебя рассинхрон между камерой и героем.
У меня тоже самое бывало - это все решаемо.
1) Делай рассчет движения в Update 2) Героя двигай в FixedUpdate
Именно двигай.
Код // кусок из "Update" - считаю следующий шаг. Я это даже не каждый кадр делаю. if (UnityEngine.Time.frameCount % 2 != 0) return; for (int i = 0; i < groupMovement.length; i++) { var dataMove = groupMovement.component[i]; var spOverride = dataMove.speedOverride; var spActual = dataMove.speedActual;
Vector2 position; position.x = dataMove.direction.x * spActual * spOverride; position.y = dataMove.direction.y * spActual * 0.75f * spOverride;
dataMove.step_next = position; dataMove.speedOverride = 1; }
Код // кусок из "FixedUpdate" var entity = groupMovement.GetActor(i);
bPos += dataMove.step_next * Time.DeltaTimeFixed * entity.timeScale;
if (dataMove.conditionBounds) { bPos.x = Mathf.Clamp(bPos.x, dataMove.boundsLimit.min.x, dataMove.boundsLimit.max.x); bPos.y = Mathf.Clamp(bPos.y, dataMove.boundsLimit.min.y, dataMove.boundsLimit.max.y); }
dataPhysics.body.MovePosition(bPos);
Тебя иментересует метод MovePosition. Не переживай, он будет учитывать коллизии.
Дальше камера. Апдейт делай в LateUpdate. LateUpdate отыгрывается после всех остальных апдейтов и он идеален для камеры : все рассчеты уже завершены. Тоесть камера спокойно будет работать с уже гарантированно изменившимися значениями за кадр. Метод который тебя интересует - Vector3.SmoothDamp
Код public class ProcessingCamera : ProcessingBase, ITickLate { public Camera cam; public Transform trCam; public Transform target; public Bounds bounds; private Vector3 velocity;
private float smoothTime = .15f;
public ProcessingCamera() { cam = Camera.main; trCam = cam.transform; }
public void TickLate() { if (target == null) return; var boundsCam = cam.OrthographicBounds(); var position = target.position; position.x = Mathf.Clamp(target.position.x, bounds.min.x+boundsCam.extents.x, bounds.max.x-boundsCam.extents.x); position.y = Mathf.Clamp(target.position.y, bounds.min.y+boundsCam.extents.y, bounds.max.y-boundsCam.extents.y); position.z = trCam.position.z; trCam.position = Vector3.SmoothDamp(trCam.position, position, ref velocity, smoothTime); } }
На остальной мой код особо не смотри, это просто скинул методы из игры что делаю. API почитай на сайте юнити и пользуйся)
Как выглядит
ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
Сообщение отредактировал pixeye - Четверг, 20 Сентября 2018, 09:38 |
|
| |
alexsilent | Дата: Четверг, 20 Сентября 2018, 13:27 | Сообщение # 11 |
почти ветеран
Сейчас нет на сайте
| Цитата pixeye ( ) рассинхрон между камерой и героем pixeye, точно, это одна из самых главных причин, тряска ужасная) Спасибо большое за столь подробный ответ, очень полезная информация!
Сообщение отредактировал alexsilent - Четверг, 20 Сентября 2018, 13:28 |
|
| |
drcrack | Дата: Четверг, 20 Сентября 2018, 17:36 | Сообщение # 12 |
старожил
Сейчас нет на сайте
| Цитата LateUpdate отыгрывается после всех остальных апдейтов и он идеален для камеры : все рассчеты уже завершены. Ну, все в руках юзера! Я видел много ассетов из стора которые в LateUpdate меняют какие-то важные позиции
|
|
| |
seaman | Дата: Пятница, 21 Сентября 2018, 13:58 | Сообщение # 13 |
старожил
Сейчас нет на сайте
| Цитата Я видел много ассетов из стора которые в LateUpdate меняют какие-то важные позиции В АссетСторе много всякой лажи...
|
|
| |