Понедельник, 25 Ноября 2024, 06:39

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
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 меняют какие-то важные позиции :D
seamanДата: Пятница, 21 Сентября 2018, 13:58 | Сообщение # 13
старожил
Сейчас нет на сайте
Цитата
Я видел много ассетов из стора которые в LateUpdate меняют какие-то важные позиции

В АссетСторе много всякой лажи...
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг
Несущии Профнастил Н75. создание игр трубы калининград