Поиск пути
| |
Valik_Fenko | Дата: Суббота, 28 Мая 2016, 00:20 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Написал волновый алгоритм поиска пути.(Занимает все соседние клетки и по диагонали тоже пока не найдёт конечную точку).Но вот проблема ,я не могу сделать чтоб персонаж двигался по этому пути... В Update() путь постоянно обновляется и поэтому я не знаю как сделать чтобы игрок шел от клетки до клетки пока путь заного прощитывается.Я делаю я через Vector3.MoveToward и проблема в том что оно перезаписывает постоянно шаги, в итоге персонаж идет напрямик проходя через стены..Мб кто подаст идею как его лучше реализовать.Ну поэтапно.Потому что в интерете только реалзация самого алгоритма,а как передвигать по сетке персонажа ниче нету :(.У самого не получается чет
|
|
| |
EchoIT | Дата: Суббота, 28 Мая 2016, 01:07 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Valik_Fenko, нужен просто поиск пути или цель состоит именно в самостоятельной разработке? Что мешает использовать какой-нибудь NavMesh из коробки? Хотелось бы увидеть код для возможности детального разбора.
Долгожданный анонсик: State of War
|
|
| |
Valik_Fenko | Дата: Суббота, 28 Мая 2016, 13:47 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| С этим разобрался.Есть проблема с подвижными объектами(Юнитами).Вся карта разбита на квадраты по которым юниты двигаются.Как лучше проверять находится ли юнит в квадрате чтобы изменить тег квадрата(Сделать непроходимым)?
Делаю сам.NavMesh мягко говоря фигня.Он ищет самый кототкий путь и всё такое,но напишу я Instantiate гденить и мой объект будет игнорится NavMesh.Такчто мимо сразу
В общем напишу ещё раз по другому сформулирую вопрос). По всей карте находятся квадратики на расстоянии 1 юнит друг от друга.Мне нужно сделать чтоб пока они сталкивались со стеной или другим непроходимым обьектом у них тег был UnPath,если же они не сталкиваются с таким обьектом то Path..
Как лучше всего проверять столкновение?. Я делал через OnTriggerStay и Enter,Exit,но он хорошо работает ток для неподвижных обьектов,а у меня RPG жанр игры.И мне нид чет не очень ресурсозатратное и чтоб работало и с подвижными обьектами.
Сообщение отредактировал Valik_Fenko - Суббота, 28 Мая 2016, 16:31 |
|
| |
EchoIT | Дата: Суббота, 28 Мая 2016, 17:25 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| Цитата но напишу я Instantiate гденить и мой объект будет игнорится NavMesh Щас бы забить на справку, да? Для этих целей есть Nav Mesh Obstacle.
Цитата По всей карте находятся квадратики на расстоянии 1 юнит друг от друга.Мне нужно сделать чтоб пока они сталкивались со стеной или другим непроходимым обьектом у них тег был UnPath,если же они не сталкиваются с таким обьектом то Path.. Ты велосипеды изобретаешь. Но допустим тебе это очень надо, и необходимо решить эту проблему.
OnTriggerEnter и OnTriggerExit прекрасно работают и с подвижными объектами, проверено. Сам писал подобный поиск пути. Но нюансы начинаются ровно с того момента, как твой юнит утыкается в UnPath, и тут уже нужно придумать, как он будет его обходить. Изврат, в общем. Можно попробовать использовать теорию графов и поиск вглубину, например. Все пути прохода алгоритма записывать, затем, если пути найдены, то выбираем кратчайший, и пускаем по нему юнита (ну а клетку, в которую заходит юнит, соответственно делать занятой - UnPath). Разумеется, это работает для статики. Для динамики этот поиск пути нужно производить возможно даже каждый кадр. А это прожорливо. Но опять же, повторюсь, OnTriggerExit и OnTriggerEnter замечательно работают.
И всё же, я бы советовал хорошенько разобраться с НавМеш, точно убедиться, что он не подходит, и уж только в этом случае писать велосипеды.
Долгожданный анонсик: State of War
|
|
| |
Valik_Fenko | Дата: Суббота, 28 Мая 2016, 17:33 | Сообщение # 5 |
почетный гость
Сейчас нет на сайте
| Мм.Алгоритм у меня уже есть(Волновой поиск пути) и персонаж по нему двигается,проблема только в нем самом.Я покамись поставил красные и синие материалы на эти квадратики.Если он непроходим то он красный если проходим то синий(чтоб видеть).Алгоритм отлично работает и обходит квадратики.Как ты говоришь он каждый кадр считывает новый путь(лагов нет.Лишнее всё убрал).Алгоритм поиска волновой,так что он без всяких проблем находит путь.Проблема не в нем а в этих квадратиках.Скажем у меня есть вот такой скрипт
Код using UnityEngine; using System.Collections;
public class PathSetting : MonoBehaviour { public Material Red,Blue; void OnTriggerEnter(Collider other) { if(other.gameObject.tag == "Path") { other.gameObject.tag = "UnPath"; other.gameObject.renderer.material = Red; } } void OnTriggerExit(Collider other) { if(other.gameObject.tag == "UnPath") { other.gameObject.tag = "Path"; other.gameObject.renderer.material = Blue; } } } Он работает только для неподвижных объектов.Если вешаю на юнита ничиго не происходит все клеточки которые он тригерно зацепил остются синими и проходимымы ,а ининогда одна становится красной и даже после того как юнит покидает этот квадрат.Вот поэтому я и усомнился в работе OnTriggerEnter. Напиши плиз что куда кидать чтоб правильно работало. То есть на какой объект скрипт кидать(Подвижный неподвижный).На какой галочку ставить IsTrigger и кидать Rigibody,а то у меня чет ваще не ок работает.Или мб скрипт не так сделал. =(
Ну если ты говоришь я изобрёл велосипед,черт с ним ;D.
Сообщение отредактировал Valik_Fenko - Суббота, 28 Мая 2016, 17:37 |
|
| |
EchoIT | Дата: Суббота, 28 Мая 2016, 18:05 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| Valik_Fenko, во-первых, и на кубиках пути, и на юните должен быть коллайдер (или триггер, не суть важно), и хоть на одном из них должен быть Rigidbody (насколько я помню на подвижном, т.е. в твоём случае на юните, да и это будет менее ресурсозатратно). Чтобы не было проблем с Rigidbody (если не нужна физика), ставишь на нём галку isKinematic. Свой скрипт кидаешь на игрока, и всё должно работать.
Долгожданный анонсик: State of War
|
|
| |
Valik_Fenko | Дата: Суббота, 28 Мая 2016, 18:09 | Сообщение # 7 |
почетный гость
Сейчас нет на сайте
| Щас попробую Добавлено (28 мая 2016, 18:09) --------------------------------------------- Работает.Но очень лаги жуткие начались когда я это сделал =(
|
|
| |
EchoIT | Дата: Суббота, 28 Мая 2016, 18:18 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| Valik_Fenko, Ctrl+7 нажми, выбери CPU Usage и заскринь окошко во время игры.
Долгожданный анонсик: State of War
|
|
| |
Valik_Fenko | Дата: Суббота, 28 Мая 2016, 18:27 | Сообщение # 9 |
почетный гость
Сейчас нет на сайте
| СКРИН
Сообщение отредактировал Valik_Fenko - Суббота, 28 Мая 2016, 18:40 |
|
| |
EchoIT | Дата: Суббота, 28 Мая 2016, 18:40 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| Valik_Fenko, попробуй нафиг вырубить рендер всех этих кубиков. Ну и цвет соответственно им не менять - сам говоришь, заработало. Возможно, из-за этого.
Ну и ещё нагуглил, что стоит вырубить VSync в QualitySettings (хотя, ИМХО, это и так нужно сделать в первую очередь).
Долгожданный анонсик: State of War
Сообщение отредактировал EchoIT - Суббота, 28 Мая 2016, 18:41 |
|
| |
Valik_Fenko | Дата: Суббота, 28 Мая 2016, 18:50 | Сообщение # 11 |
почетный гость
Сейчас нет на сайте
| да уже пробовал так убрал рендер (
ваще куба нету.Один коллайдер.Лаги менше,но всё равно жуткие
вопрос от нуба.Что это?
Добавлено (28 мая 2016, 18:45) --------------------------------------------- А понял нагуглил сеттинг щас поиграюсьДобавлено (28 мая 2016, 18:50) --------------------------------------------- Не, =(.Всё равно жуткие лаги настройки самые низкие
Сообщение отредактировал Valik_Fenko - Суббота, 28 Мая 2016, 18:49 |
|
| |
EchoIT | Дата: Суббота, 28 Мая 2016, 18:57 | Сообщение # 12 |
старожил
Сейчас нет на сайте
| Valik_Fenko, растяни окошко, которое открылось при ctrl+7 и сделай ещё раз скрин, а то там не всё видно. И помимо CPU Usage заскринь ещё Rendering, скорее всего, там будет что-то интересное.
Долгожданный анонсик: State of War
|
|
| |
Valik_Fenko | Дата: Суббота, 28 Мая 2016, 19:00 | Сообщение # 13 |
почетный гость
Сейчас нет на сайте
| кажется я понял в чем проблема.Вот сотри он кидает под себя "стену",ну что нельзя там пройти,а потом пытается пройти.И мой волновой алгоритм сходит с ума прост ппц.Пытается чет сделать :D.Можно добавить ещё 1 тип тега Unit,но ведь тогда и остальные юниты будут проходить через него.
P.S возможно даже если он будет ходить нормально лаги будут,т.к чтоб увидеть что оно тупить я уменшил сетку с 85 на 85 до 25 на 25.Что очень значительно..
Добавлено (28 мая 2016, 19:00) --------------------------------------------- Странно у меня в процесах ниче не происходит в рендеринге.Цифры не меняются,диаграмма не шевелится.да и ваще ниче интересно нету.так и должно быть?
Сообщение отредактировал Valik_Fenko - Суббота, 28 Мая 2016, 19:02 |
|
| |
EchoIT | Дата: Суббота, 28 Мая 2016, 19:01 | Сообщение # 14 |
старожил
Сейчас нет на сайте
| Valik_Fenko, если камеру не двигать, то вряд ли там что-то меняться будет. Вполне возможно, что из-за алгоритма просадки, у самого так было, когда код кривоват получался)
Долгожданный анонсик: State of War
|
|
| |
Valik_Fenko | Дата: Суббота, 28 Мая 2016, 19:14 | Сообщение # 15 |
почетный гость
Сейчас нет на сайте
| Сотри!Он короче зацикливается и не перестает искать путь потомучто красной становятся ток 2-3 клетки остальные синие и алгоритм работает.И жесть как нагружает систему...Нид придумать как игнорить красные кубики которые созданы самим юнитом
Сообщение отредактировал Valik_Fenko - Суббота, 28 Мая 2016, 19:21 |
|
| |
EchoIT | Дата: Суббота, 28 Мая 2016, 19:26 | Сообщение # 16 |
старожил
Сейчас нет на сайте
| Valik_Fenko, записывать этот кубик в переменную и потом просто воткнуть в цикле или где там конструкцию вида if (checkingCube!=cubeBelowUnit) или как-нибудь так.
Долгожданный анонсик: State of War
|
|
| |
Valik_Fenko | Дата: Суббота, 28 Мая 2016, 19:37 | Сообщение # 17 |
почетный гость
Сейчас нет на сайте
| Не циклится я хз как его сделать.Сложно(
Сообщение отредактировал Valik_Fenko - Суббота, 28 Мая 2016, 19:41 |
|
| |
EchoIT | Дата: Суббота, 28 Мая 2016, 19:42 | Сообщение # 18 |
старожил
Сейчас нет на сайте
| Valik_Fenko, блин, не знаю
Долгожданный анонсик: State of War
|
|
| |
Valik_Fenko | Дата: Суббота, 28 Мая 2016, 19:54 | Сообщение # 19 |
почетный гость
Сейчас нет на сайте
| Сделал!Смотри.Когда юнит начинает движение делаем клеточку красной.Если стартовая клеточка красная алгоритму как-то *****. Когда он доходит до сл . клеточки делаем эти назад синей,а ту в которую он пришал делаем красной и так пока он не прийдёт.т.к любой юнит будет проходить клеточку весьма быстро,то проблем с проходом через юнитов быть не должно!Добавлено (28 мая 2016, 19:54) --------------------------------------------- Ток 1 минус.Пока он стоит под ним нету красного квадратика.Бога нет!
|
|
| |
EchoIT | Дата: Суббота, 28 Мая 2016, 19:54 | Сообщение # 20 |
старожил
Сейчас нет на сайте
| Valik_Fenko, в целом, вменяемое решение. Странно, что так не работало.
Долгожданный анонсик: State of War
|
|
| |
|