Суббота, 16 Ноября 2024, 12:39

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Движение объектов змейкой
lentinantДата: Воскресенье, 16 Февраля 2014, 22:46 | Сообщение # 1
ленивый программист
Сейчас нет на сайте
В общем, мне нужно, чтобы элементы двигались один за другим как змейка. Однако, мне не подходят Distance Joint (так как части, которые ближе заданного расстояния, не двигаются в принципе), и не подходит вариант с постоянным поворотом и перемещением элемента на в отношении следующего, так как при этом механика не совсем та - не факт, что все сегменты змейки пройдут тот же путь, что и первый сегмент (именно этого я пытаюсь достигнуть). В общем, это все должно быть похоже на эффект трейла.

У меня было два вспомогательных варианта. Первый глупый - сплайны - строить сплайн по положению текущего, следующего и предыдущего сегмента, и сдвигать текущий сегмент уже по сплайну, однако, это куча вычислений в коде, и это будет и мне геморрой, и компу нагрузка. Второй вариант - регулярно записывать положение каждого сегмента, а в следующем через всякие Лерпы менять расположение и поворот в направлении до сохраненной позиции предыдущего сегмента, и получится, что каждый сегмент однажды точно примет позицию и вращение предыдущего сегмента (после чего записанные координаты сохранятся).

Хотелось бы услышать другие возможные типы решений. Если нужно, могу запостить примеры, чего я хочу достичь, и чего хочу избежать.


Когда-то тут будут ссылки на крутые проекты. Или нет.
seamanДата: Воскресенье, 16 Февраля 2014, 22:53 | Сообщение # 2
старожил
Сейчас нет на сайте
Иметь массив позиций сегментов. Каждый кадр двигать сегмент на место предыдущего. Сдвигать массив.
Улучшение - использовать не массив, а специальную структуру типа списка.
lentinantДата: Воскресенье, 16 Февраля 2014, 23:00 | Сообщение # 3
ленивый программист
Сейчас нет на сайте
Цитата seaman ()
Иметь массив позиций сегментов. Каждый кадр двигать сегмент на место предыдущего. Сдвигать массив.

Так ведь проблема в том, что это не классическая змейка, и сдвигается она не поклеточно, а плавно, при чем, со свободными углами. Поэтому для того, чтобы позиция точно сохранялась, придется сохранять ее практически каждый Update.


Когда-то тут будут ссылки на крутые проекты. Или нет.
seamanДата: Воскресенье, 16 Февраля 2014, 23:37 | Сообщение # 4
старожил
Сейчас нет на сайте
Каждый апдейт. Но сохранять нужно только новую позицию головы. Остальное уже будет сохранено в массиве.
Проще всего использовать List<Vector3> snake;
Сдвигаем "голову".
Новую позицию головы записываем в snake.Add(head.transform.position)
Проходим циклом по всем сегментам. Сдвигая при этом сегменты.
for(int i =0; i < snake.Count - 1; i++)
{
segment[i].transform.position = snake[i + 1];
}
Удаляем из списка позицию последнего сегмента
snake.RemoveAt(0);
lentinantДата: Воскресенье, 16 Февраля 2014, 23:50 | Сообщение # 5
ленивый программист
Сейчас нет на сайте
Ну, тогда уже лучше очередью воспользоваться, а не листом.

Когда-то тут будут ссылки на крутые проекты. Или нет.
seamanДата: Понедельник, 17 Февраля 2014, 00:00 | Сообщение # 6
старожил
Сейчас нет на сайте
queue лучше, но я что-то не нашел как там взять i-й элемент. Так что если очередь то цикл перебора усложнится.
lentinantДата: Понедельник, 17 Февраля 2014, 00:54 | Сообщение # 7
ленивый программист
Сейчас нет на сайте
Щас просто попробую создать класс сегмента, в котором буду хранить инфу о желательном расположении, к которому и будет приближаться сегмент.

Добавлено (17.02.2014, 00:33)
---------------------------------------------

Цитата seaman ()
Каждый апдейт. Но сохранять нужно только новую позицию головы. Остальное уже будет сохранено в массиве.

Получится, каждый сегмент будет на месте следующего в протяжении одного апдейта. А это очень не хорошо.

Добавлено (17.02.2014, 00:35)
---------------------------------------------
Хотя, я вроде понял, что вы хотели сказать. Сделать набор точек, который якобы будет формировать линию, нарисованную головой, и по которой будут идти другие сегменты. Однако, тут есть проблема - смена одного сегмента другим может занять больше одной такой точки. Как мне понять, с каким шагом надо выбирать точку на этой линии для каждого следующего сегмента?

Добавлено (17.02.2014, 00:37)
---------------------------------------------
И да - что делать, если кроме головы есть сегменты, но игра только началась, и массив все еще пустой? Получается, пока не наберется необходимое количество точек, сегменты будут просто стоять. Или делать змейку изначально прямой и делать набор точек на протяжении этой линии?

Добавлено (17.02.2014, 00:54)
---------------------------------------------
Да, ваш метод оказался весьма неплохим, но его, вероятней всего, можно нормально применять только с FixedUpdate, иначе получится, что при разном фпс расстояния между точками разные, и змейка будет двигаться более неоднородно.


Когда-то тут будут ссылки на крутые проекты. Или нет.
seamanДата: Понедельник, 17 Февраля 2014, 08:00 | Сообщение # 8
старожил
Сейчас нет на сайте
Цитата
Получится, каждый сегмент будет на месте следующего в протяжении одного апдейта. А это очень не хорошо.

Чем нехорошо? 1 апдейт - 1 кадр. Раз в кадр двигаем. Что нехорошего то?
Цитата
И да - что делать, если кроме головы есть сегменты, но игра только началась, и массив все еще пустой? Получается, пока не наберется необходимое количество точек, сегменты будут просто стоять. Или делать змейку изначально прямой и делать набор точек на протяжении этой линии?

Это Вам решать. В стандартной змейке сегменты изначально по прямой стоят.
Цитата
Как мне понять, с каким шагом надо выбирать точку на этой линии для каждого следующего сегмента?

Вопрос совершенно непонятен. Никакого шага выбирать не надо.
Цитата
при разном фпс расстояния между точками разные, и змейка будет двигаться более неоднородно.

Голова у Вас двигается в FixedUpdate? Или все же в Update? Если она может двигаться в Update и все нормально, чем отличаются остальные сегменты?
lentinantДата: Понедельник, 17 Февраля 2014, 13:12 | Сообщение # 9
ленивый программист
Сейчас нет на сайте
Цитата seaman ()
Чем нехорошо? 1 апдейт - 1 кадр. Раз в кадр двигаем. Что нехорошего то?

Это если скорость змейки позволяет, чтобы размер сегмента был того же порядка, что и расстояние между точками. Если расстояние меньше, получится, что первая точка будет еще внутри первого сегмента. И если мы переместим второй сегмент на эту позицию, он будет пересекаться с первым.
Цитата seaman ()
Если она может двигаться в Update и все нормально, чем отличаются остальные сегменты?

Тогда длина змейки будет зависеть от FPS. При 50 фпс и скорости 100 юнитов в секунду, у нас будет расстояние 2 юнита между точками, при 100 фпс - 1 юнит, получается, змейка получится вдвое короче.


Когда-то тут будут ссылки на крутые проекты. Или нет.
andarkyДата: Понедельник, 17 Февраля 2014, 13:44 | Сообщение # 10
старожил
Сейчас нет на сайте
интересная тема!
я тоже пытался в прошлом году
и скрипты писал и Jointы пробовал... ни то ни другое не понравилось.
Я просто забил на это дело, а идея пылью покрылась...



Моя страничка по дизайну
GameDev//Design//3D
Ютубчик
seamanДата: Понедельник, 17 Февраля 2014, 16:34 | Сообщение # 11
старожил
Сейчас нет на сайте
Цитата
Это если скорость змейки позволяет, чтобы размер сегмента был того же порядка, что и расстояние между точками. Если расстояние меньше, получится, что первая точка будет еще внутри первого сегмента. И если мы переместим второй сегмент на эту позицию, он будет пересекаться с первым.

А, блин - туплю. Да, действительно - все сложнее оказывается.
RangerДата: Понедельник, 17 Февраля 2014, 18:08 | Сообщение # 12
почти ветеран
Сейчас нет на сайте
Цитата lentinant ()
Тогда длина змейки будет зависеть от FPS. При 50 фпс и скорости 100 юнитов в секунду, у нас будет расстояние 2 юнита между точками, при 100 фпс - 1 юнит, получается, змейка получится вдвое короче.

проблема решается привязкой к таймеру.
_dtime+=Time.deltatime;
(_dtime > .05f) // параметр подобрать
{
//вставка элемента в список удаление предыдущего.
_dtime=0;

}
// lerp позиции зависимых сегментов


Nasa13Дата: Понедельник, 17 Февраля 2014, 18:55 | Сообщение # 13
заслуженный участник
Сейчас нет на сайте
Я не знаю ,Как это поможет, но если бы я делал змейку, которая могла двигаться только вперед/налево/направо.. я бы сделал так

учитывая, что у нас система координат XZ (Y - не берем), я бы сделал своеобразные флажки=)

Т.е. флажок от головы, все части змейки движутся с одной скоростью и как только поворачиваешь , на месте ,где должна быть голова, появляется невидимый для игрока флажок, и он как регулировщик, распределяет блоки, дает им ускорение либо направо, либо налево, либо прямо...т.е. мы начали игру, нажали налево, голова повернулась, флажок на нее подействовал, дал ускорение, другие части двигаются строго вперед до встречи с регулировщиком(флажком), а затем распределяются...Как-то так


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

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

моя мини демка ,хоррор http://3drad-alec.ucoz.com/forum/6-39-1
lentinantДата: Понедельник, 17 Февраля 2014, 20:16 | Сообщение # 14
ленивый программист
Сейчас нет на сайте
Nasa13, твой вариант подходит к классической механике змейки, где поворот идет на определенный угол. У меня же вместо углов идут окружности - прямая линия переходит в дугу, и уже с другого конца дуги линия продолжается.
Цитата Ranger ()
проблема решается привязкой к таймеру.

Ну или в фиксед апдейте, о чем я и писал выше.
Цитата seaman ()
А, блин - туплю. Да, действительно - все сложнее оказывается.

Можно считать сумму расстояний между точками, а как только она больше определенного значения, помещать сегмент в последнюю добавленную точку.


Когда-то тут будут ссылки на крутые проекты. Или нет.
ЛевшаДата: Понедельник, 17 Февраля 2014, 21:42 | Сообщение # 15
почти ветеран
Сейчас нет на сайте
При изменении маршрута, оставлять в текущей позиции головы вейпоинт, который всем остальным элементам будет сообщать куда им идти.
После прохождения последнего элемента через него, вейпоинт удалять.


X.cor.R (Prologue)
Nasa13Дата: Понедельник, 17 Февраля 2014, 22:05 | Сообщение # 16
заслуженный участник
Сейчас нет на сайте
Левша, тоже самое, что сказал я=) не то, оказывается не подходит...

Т.е. как я понял, змейка может еще закручиваться? Этакая гибкая фигня?

Добавлено (17.02.2014, 22:05)
---------------------------------------------
В добавление скажу, что есть такая система, как система "ТАРГЕТ-ВЕЙПОИНТ", т.е. ставится не один регулировщик, как я описывал, а их может быть целое множество!

Это множество создаст лабильность, а на каждом поинте поставить проверку, для прохождения всех звеньев, как только все конечности прошли, удаляем его...

Т.е. одна точка,это линия, две точки, тоже линия, три точки, а представь, если их 50? И они невидимы, и не создают глобального просаживания фпс...Я вот тебе о чем выше говорил, просто утрировал, но может там все сложнее, и я чего-то не понимаю


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

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

моя мини демка ,хоррор http://3drad-alec.ucoz.com/forum/6-39-1
lentinantДата: Понедельник, 17 Февраля 2014, 22:16 | Сообщение # 17
ленивый программист
Сейчас нет на сайте
Левша, Nasa13,
Цитата lentinant ()
Сделать набор точек, который якобы будет формировать линию, нарисованную головой, и по которой будут идти другие сегменты. Однако, тут есть проблема - смена одного сегмента другим может занять больше одной такой точки. Как мне понять, с каким шагом надо выбирать точку на этой линии для каждого следующего сегмента?


Добавлено (17.02.2014, 22:16)
---------------------------------------------
Цитата Nasa13 ()
змейка может еще закручиваться? Этакая гибкая фигня?

Имеется ввиду змейка подобного типа.


Когда-то тут будут ссылки на крутые проекты. Или нет.

Сообщение отредактировал lentinant - Понедельник, 17 Февраля 2014, 22:17
Nasa13Дата: Понедельник, 17 Февраля 2014, 22:32 | Сообщение # 18
заслуженный участник
Сейчас нет на сайте
Поиграл в игру, прикольная , вроде ничего особенного...Короче...Мне приходит на ум бредовая идея, я не знаю как ее описать, но как-то такое делал уже...давно...

Короче, есть нулевая точка , откуда начинает движение наша змейка, из ее головы, сделать бесконечно прямую линию из таких же блоков, которые как бы уже следуют за нашей змейкой, и каждый раз, когда мы подбираем квадратик, он просто делает ShowNextBlock ...Т.е. мы делаем инфинити блока , и эти блоки уже есть ,просто они невидимы, и уже повторяют движения, и никаких манипуляций не надо делать...просто показывать их в нужный момент...Я делал когда-то такое, правда не на юнити...Уже как бы сцепленные с основной змейкой, думаю, идея ясна...я не точно такое же делал, примерно ,там надо было...

Они уже на заданном расстояние, Как бы все нормально...поэтому не должно быть смещений и ничего такого...

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

Еще забыл добавить, что на каждом новом блоке, должна еще ставить точка от него, для следующего за ним блока...(либо делать поправку на раст. от головы до хвоста,обязательно)


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

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

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


Сообщение отредактировал Nasa13 - Понедельник, 17 Февраля 2014, 22:44
lentinantДата: Понедельник, 17 Февраля 2014, 22:46 | Сообщение # 19
ленивый программист
Сейчас нет на сайте
Nasa13, я ищу ответ на конкретный вопрос - каким образом заставить двигаться каждый сегмент точно по той же траектории, по которой двигалась голова. С другими аспектами у меня проблем нет. Метод с точками, которые оставляются головой, я и так использую, после совета seaman'а, а сейчас просто пытаюсь придумать модификации кода, которые исправят присутствующие проблемы - отсутствие точек на старте игры, и расстояние между двумя сегментами. Оба пункта уже имеют теоретические методы решения (я их указал выше), и я их собираюсь проверить.

Когда-то тут будут ссылки на крутые проекты. Или нет.
  • Страница 1 из 1
  • 1
Поиск:

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