Суббота, 20 Апреля 2024, 04:09

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Проблема сопровождения движущегося объекта (Отставание слежения за движущимся объектом)
Проблема сопровождения движущегося объекта
SuntrashДата: Пятница, 21 Февраля 2014, 10:58 | Сообщение # 1
был не раз
Сейчас нет на сайте
Здравствуйте, граждане.

Делаю tower defense.

Башня следит за заранее выбранным мобом, вовремя его замечает (Raycast), но в начале сопровождения (Quaternion.Slerp) отстаёт от него (проскакивает слежение за центром моба) и далее уже устойчиво сопровождает "хвост". Когда башня начинает доворачивать на моба, но ещё не видит его, то заметно, что угловая скорость поворота башни явно достаточная (с большим запасом).

Кусок кода сопровождения моба (mob) башней (head), вызывается в FixedUpdate:
Код

head.rotation = Quaternion.Slerp(head.rotation,
                        Quaternion.LookRotation(mob.position - head.position),
                        RotateSpeed * Time.deltaTime);

Здесь под башней имеется ввиду дочерний объект (поворотная часть башни), работающий в мировых координатах.

Кусок кода движения моба (transform) к точке (point), вызывается в FixedUpdate:
Код

// Поворот на точку
transform.rotation = Quaternion.Slerp(transform.rotation,
      Quaternion.LookRotation(point.position - transform.position),
      RotateSpeed * Time.deltaTime);

// Движение к точке
if (Vector3.Distance(transform.position, point.position) > DistanceToStop)
      transform.position += transform.forward * MoveSpeed * Time.deltaTime;


Далее в поисках решения:
1) У моба включено Continuous Dynamic и Interpolate.
2) Попробовал сунуть управление башней в LateUpdate - никаких изменений.
3) При пропорциональном изменении RotateSpeed башни и MoveSpeed моба картина почти не меняется - отставание на одно и то же расстояние.
4) При значительном увеличении скорости вращения башни ситуация с сопровождением нормализуется (следим ровно за центром моба), но поворот к следующему мобу происходит почти мгновенно.

Попробовал примерно обрисовать ситуацию.


Буду очень благодарен за помощь!

Добавлено (21.02.2014, 10:58)
---------------------------------------------
Попробую учитывать тангенсальную скорость моба, чтобы сопровождать упреждённую точку. Отпишусь на днях о результатах.

Добавлено (22.02.2014)
РЕШЕНИЕ НАЙДЕНО (СМ.НИЖЕ В ТЕМЕ)
Код

head.rotation = Quaternion.RotateTowards(head.rotation,   
                        Quaternion.LookRotation(mob.position - head.position),   
                        RotateSpeed * Time.deltaTime);


Сообщение отредактировал Suntrash - Суббота, 22 Февраля 2014, 00:33
Nasa13Дата: Пятница, 21 Февраля 2014, 12:04 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Update - настоятельно рекомендую использовать , особенно для таких функций

Fixed Update - он подходит для физики( и то не всегда) (зависит от ФПС, и еще можно его самостоятельно повысить, понизить(скорость вызова))

late Update - если я не ошибаюсь,используется в таких случаях, как слежение камерой за игроком (вид 3-е лицо), ну чтобы проверять, что игрок уже прошел за камеру ,и все такое... (используется ПОСЛЕ всех Update)


все люди одинаково полезны,говорил людоед туристам.

Мешает грудь? Спячь под "СПОЙЛЕР.*)

моя мини демка ,хоррор http://3drad-alec.ucoz.com/forum/6-39-1
SuntrashДата: Пятница, 21 Февраля 2014, 14:01 | Сообщение # 3
был не раз
Сейчас нет на сайте
Nasa13, это не то.

Update как раз зависит от fps, а FixedUpdate гарантирует вызов через жесткие промежутки времени (задаются в настройке проекта). Поэтому физику рекомендуют в FixedUpdate.
Про LateUpdate я уже писал - пробовал работу башни туда совать. Это гарантировало то, что физика моба уже отработала. Но не помогло :(
Nasa13Дата: Пятница, 21 Февраля 2014, 14:18 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Вообще я тебя хотел натолкнуть тебя на то, чтобы ты выкинул Фикс Апдейт, И перешел на Апдейт,Потому как первое вообще не рекомендуется использовать( говорю потому как читал).. Погоди, а ты вообще в Апдейт Пробовал? Может корутин?

все люди одинаково полезны,говорил людоед туристам.

Мешает грудь? Спячь под "СПОЙЛЕР.*)

моя мини демка ,хоррор http://3drad-alec.ucoz.com/forum/6-39-1
RangerДата: Пятница, 21 Февраля 2014, 15:28 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
Цитата Suntrash ()
вовремя его замечает (Raycast)

значит дело в райкасте.
Потому как вроде везде все правильно

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


SuntrashДата: Пятница, 21 Февраля 2014, 17:05 | Сообщение # 6
был не раз
Сейчас нет на сайте
Nasa13, да, простой Update я пробовал на все скрипты ставить - безрезультатно.
А как там корутин вставить - не знаю. Я не работал с этим. Если конкретнее алгоритм подскажешь -будет здорово :)

Ranger, у меня Raycast влияет только на открытие атаки. А моб выбирается из массива мобов еще до начала вращения башни. Т.о. башня поворачивается на уже известный трансформ (см.первый кусок кода). Поэтому мимо :(
allodsДата: Пятница, 21 Февраля 2014, 17:14 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
Зачем рейкаст то, делай список отбирай цель по дистанции
SuntrashДата: Пятница, 21 Февраля 2014, 18:09 | Сообщение # 8
был не раз
Сейчас нет на сайте
allods, дык, я же писал
Цитата
...у меня Raycast влияет только на открытие атаки. А моб выбирается из массива мобов еще до начала вращения башни
allodsДата: Пятница, 21 Февраля 2014, 18:23 | Сообщение # 9
почти ветеран
Сейчас нет на сайте
но зачем, просто мне не понятно , зачем он нужен в твоем случае

Сообщение отредактировал allods - Пятница, 21 Февраля 2014, 18:23
Nasa13Дата: Пятница, 21 Февраля 2014, 19:18 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
Я так понял, как только башня поворачивается, из ее дула как бы идет Рей, и он сканирует врага ,и сразу начинается атака, вполне логично...На мой взгляд...

Я с корутинами так себе ,пару раз использовал, могу скинуть где почитать ,если интересно

Слушай, а может тебе сделать Local поворот?Может это исправит картинку?

А зачем ты использовал Slerp? он же для сферного поворота, ну там для солнца, чтобы оно шло по дуге...

Добавлено (21.02.2014, 19:18)
---------------------------------------------
Могу предложить корявый вариант....На первое время...

Сделать объект, что будет привязан к мобу, и только будет чуть дальше его...Смысл ясен? Чтобы компенсировать ...И ,естественно, пусть башня следит за объектом ,что невидим, и чуть дальше моба...


все люди одинаково полезны,говорил людоед туристам.

Мешает грудь? Спячь под "СПОЙЛЕР.*)

моя мини демка ,хоррор http://3drad-alec.ucoz.com/forum/6-39-1
SuntrashДата: Пятница, 21 Февраля 2014, 21:24 | Сообщение # 11
был не раз
Сейчас нет на сайте
allods, вот Nasa13 всё верно про рэйкаст написал.
Есть алгоритм выбора моба (по дальности, скорости, жирноте и т.д.) и связанный с ним алгоритм поворота башни.
А есть алгоритм атаки, который с ними не связан. Его дело пускать луч и включать лазер, если под луч попал объект с нужным тегом.

Добавлено (21.02.2014, 21:24)
---------------------------------------------
Nasa13, я никогда не откажусь от ссылок на инфу :) Тем более, что без корутинов серьёзных вещей не сделать, как я понял.

Про Slerp - а какие ещё варианты? Это как раз векторный поворот. Башня же вращается.

Локальный поворот здесь не прокатит - башня внутри префаба находится. У неё локальная система координат своя.

Вот вариант с дочерним объектом впереди моба аналогичен моей придумке.
Я как раз в конце своего поста дописал, что хочу вычислить расстояние, которое моб пройдёт за следующий шаг (тут как раз FixedUpdate нам гарантирует константный шаг по времени). Соответственно буду стремится к этой точке, а не к центру моба.

Nasa13Дата: Пятница, 21 Февраля 2014, 21:34 | Сообщение # 12
заслуженный участник
Сейчас нет на сайте
http://habrahabr.ru/post/147315/ (здесь лучше приписки внизу прочитать)

http://blogs.unity3d.ru/2010/09/coroutine/

Вот , мне понравилось...

Все, увидел про идею...Да, тоже вариант , если это проблему решит, то зачем мучиться?

Добавлено (21.02.2014, 21:34)
---------------------------------------------
1. Все расчеты производить исключительно в Update. В FixedUpdate можно делать небольшие проверки, специфичные для физики, но лучше вообще избегать использования FixedUpdate. Почему? Update вызывается FPS-равное количество раз и увеличение нагрузки просто будет просаживать скорость рендеринга рывками. Это не страшно, т.к. все апдейты должны вестись с учетом Time.deltaTime. FixedUpdate выполняется равное количество раз в секунду и движок ждет завершения выполнения. В результате игру будет визуально дергать при неравномерной вычислительной нагрузке в FixedUpdate.

Вот, нашел...я не знаю, просто , может поможет, я не уверен в учености этого человека, но на всякий случай кидаю!


все люди одинаково полезны,говорил людоед туристам.

Мешает грудь? Спячь под "СПОЙЛЕР.*)

моя мини демка ,хоррор http://3drad-alec.ucoz.com/forum/6-39-1
EchoITДата: Пятница, 21 Февраля 2014, 21:39 | Сообщение # 13
старожил
Сейчас нет на сайте
Suntrash, попробуй RotateTowards вместо Slerp, имхо, гораздо адекватней себя ведёт. Скорость во время всего поворота одинаковая, а у slerp сначала быстрая, а потом замедляется.

Не знаю, в этом ли проблема, но лично меня в своё время очень раздражали все эти Lerp и Slerp, пока я не наткнулся на такую классную вещь, как RotateTowards...


Долгожданный анонсик: State of War

Сообщение отредактировал EchoIT - Пятница, 21 Февраля 2014, 21:41
SuntrashДата: Пятница, 21 Февраля 2014, 21:41 | Сообщение # 14
был не раз
Сейчас нет на сайте
Nasa13, спасибо, дружище. Почитаю.
Nasa13Дата: Пятница, 21 Февраля 2014, 21:46 | Сообщение # 15
заслуженный участник
Сейчас нет на сайте
Suntrash, да без проблем...

Слушай, я сейчас посмотрел , у тебя в коде * Time.deltaTime; -имеется такая вещь ,а ведь ее обычно суют не в Fixe Update, а в Update.

И тут всплывает такая вещь - Time.fixedDeltaTime ...Пробовал?

Добавлено (21.02.2014, 21:46)
---------------------------------------------
Смотри , что нарыл

Time.deltaTime is NOT the physics timestep.

Time.deltatime (duration of last frame) should only be used in once per frame calls e.g. Update() calls.

Time.fixedDeltaTime should only be used in FixedUpdate(), since it the sample time of the physics loop.

Это я в плане предупреждения багов и лагов!


все люди одинаково полезны,говорил людоед туристам.

Мешает грудь? Спячь под "СПОЙЛЕР.*)

моя мини демка ,хоррор http://3drad-alec.ucoz.com/forum/6-39-1


Сообщение отредактировал Nasa13 - Пятница, 21 Февраля 2014, 21:48
EchoITДата: Пятница, 21 Февраля 2014, 21:47 | Сообщение # 16
старожил
Сейчас нет на сайте
Да говорю, попробуй RotateTowards, проблема исчезнет с вероятностью 50%.

Долгожданный анонсик: State of War
SuntrashДата: Пятница, 21 Февраля 2014, 21:51 | Сообщение # 17
был не раз
Сейчас нет на сайте
EchoIT, вот! То, что надо. Как же я это пропустил...
Вопрос решён - скорость одинаковая, всё чистенько сопровождается!
Огромное спасибо smile

Вот, что получилось в коде вращения башни:
Код

head.rotation = Quaternion.RotateTowards(head.rotation,
                      Quaternion.LookRotation(mob.position - head.position),
                      RotateSpeed * Time.deltaTime);
EchoITДата: Пятница, 21 Февраля 2014, 21:52 | Сообщение # 18
старожил
Сейчас нет на сайте
Suntrash, ну вот видишь. Кстати, аналогичное есть для движения - Vector3.MoveTowards. smile

Долгожданный анонсик: State of War
SuntrashДата: Пятница, 21 Февраля 2014, 22:01 | Сообщение # 19
был не раз
Сейчас нет на сайте
EchoIT, ага, я уже разглядел на docs.unity3d.com

Сообщение отредактировал Suntrash - Пятница, 21 Февраля 2014, 22:02
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Проблема сопровождения движущегося объекта (Отставание слежения за движущимся объектом)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг