Задача простая относительно, но застрял на некоторых элементах поведения бота. Суть - по игровому полю ползает бот, который должен преследовать мяч, затем загонять его в ворота.
С первой частью проблем не возникло:
Код
var turn = Quaternion.Lerp (emn.rotation, Quaternion.LookRotation (Vector3.forward, tar.position - emn.position), Time.deltaTime * 1.8f); // рассчитывается поворот к цели... float dist = Vector2.Distance (emn.position, tar.position); рассчитывается расстояние до цели... if (dist <= rag { // если... enemy.MovePosition(enemy.position + move * speed * Time.fixedDeltaTime); // бот движется и... enemy.MoveRotation (turn.eulerAngles.z); //... поворачивает в сторону цели. }
Со второй - тоже:
Код
if (dist <= 1.5f) { //если бот рядом с целью... enemy.MoveRotation (turn_gat.eulerAngles.z); // то поворачивается вместе с ней к воротам... }
Проблемы возникли дальше, а точнее, вопросы: 1. Если бот застрял в стене или, того хуже, в углу - как ему оттуда выбираться? Пробовал проверкой скорости, но так возникает больше проблем, чем решений. Триггером при столкновении с стенкой или raycast? Не хотелось-бы слишком сильно нагружать браузерную игру. 2. Если бот застрял в углу вместе с мячом, то каким методом ему лучше вытягивать мяч в сторону ворот, а не просто толкать его из стороны в сторону?
Неплохо-бы услышать не только дельные советы здешних мастеров, но и увидеть примеры спортивных AI, наподобие футбола или хоккея.
P.S Роль футболиста выполняет бульдозер.
P.S.S Забыл упомянуть, что игра - изометрия, в 2d. #Хийвэл бүү ай, айвал бүү хий.
Сообщение отредактировал Бозингар - Среда, 12 Августа 2015, 10:57
алгоритм может опираться на координаты - ведь координаты стен поля известны! т.е. если координата центра бота явно удалена от центра поля больше чем "возможно" - значит застрял.
ЦитатаБозингар ()
Если бот застрял в углу вместе с мячом, то каким методом ему лучше вытягивать мяч в сторону ворот
тут даже стратегия - "занять правильное положение и бить по мячу (а он имеет отскоки) пока не выскочит" может не сработать! поэтому у себя я сделал - угол запретная зона - если мяч туда попал - значит респаун (там правила на выбор - угловой, аут, персональный для робофутбола - просто респ)! при ситуации когда бот зажал мяч в борт - такое правило не срабатывает, это допустимо (для своего робофутбола можно задать безнаказанное время зажимания, можно сделать программный блок у бота чтобы отъезжал от борта под углом "на рефлексе" если пытается долбиться впрямую и тп). Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал KamiRonin - Среда, 12 Августа 2015, 11:39
"занять правильное положение и бить по мячу (а он имеет отскоки) пока не выскочит
Плюс тут в том, что данном случае роль мяча выполняет ящик, и его не бьют - просто тягают по полю, стараясь затащить в чужие ворота и мешая сделать это сопернику. Координаты ворот тоже известны, но полагаю, рассчитывать все углы и вектора, что бы объехать ящик с нужной стороны и тянуть к воротам - слишком ресурсоёмко. #Хийвэл бүү ай, айвал бүү хий.
Сообщение отредактировал Бозингар - Среда, 12 Августа 2015, 14:11