Искусственная глупость: искусство намеренных ошибок
Всё должно быть изложено так просто, как только возможно, но не проще.
— Альберт Эйнштейн
Чтобы игра была развлекающей и интересной, не обязательно делать управляемых компьютером противников умнее. В конце концов, игрок должен побеждать. Однако позволять ему выигрывать только потому, что управляющий противниками ИИ разработан плохо, тоже неприемлемо. Интерес к игре можно увеличить, если совершаемые противником ошибки будут намеренными. Тщательно настроив ошибки противников, сделав их намеренными, но правдоподобными, программисты позволят противникам выглядеть умными и одновременно обеспечат победу игрока. Кроме того, отслеживая системы ИИ и соответствующим образом управляя ими, можно превратить ситуации, в которых противники выглядят глупо, в интересный игровой процесс.
Частая ошибка в разработке и реализации систем ИИ в компьютерных играх заключается в слишком сложном дизайне. Разработчику ИИ легко увлечься созданием умного игрового персонажа и потерять из виду конечную цель, а именно создание развлекающей игры. Если у игрока есть иллюзия того, что компьютерный противник делает что-то умное, то неважно, каким образом ИИ (если он есть) создаёт эту иллюзию. Признак хорошего программиста ИИ — способность противостоять искушению добавить интеллекта туда, где он не нужен, и распознавание ситуаций, в которых достаточно более «дешёвых» и простых решений. Программирование ИИ часто больше похоже на искусство, чем на науку. Способность различать моменты, в которых достаточно дешёвых трюков, и тех, где требуется более сложний ИИ, даётся непросто. Например, программист, обладая полным доступом ко всем структурам игровых данных, легко может читерить, сделав NPC всезнающими. NPC могут знать, где находятся враги, где лежит оружие или амуниция, не видя их. Однако, игроки часто распознают такие дешёвые трюки. Даже если они не могут определить саму природу читерства, у них может создаться ощущение, что поведение NPC не похоже на естественное.
Несколько трюков
Довольно просто создать NPC, способного победить живого игрока. Гораздо сложнее создать такого, который может проиграть игроку в напряжённом бою. Трудность заключается в том, чтобы продемонстрировать игроку навыки NPC, но в то же время дать игроку победить. Ниже приведено несколько трюков, позволяющих игре показать интеллект NPC и обеспечить интересный игровой процесс. Эти трюки в основном рассчитаны на шутеры от первого лица (FPS), но некоторые применимы и в других жанрах.
Сначала движение, потом стрельба
Ничто не раздражает больше, чем мгновенная смерть от руки компьютерного противника сразу после попадания в новую комнату или область. Игрок, попадая в новое место, скорее всего будет перегружен впечатлениями от новых текстур, новых объектов, новой геометрии. Задача распознавания среди фоновых текстур уникальных текстур врага — не очень большое удовольстве. Это особенно верно сейчас, когда бюджеты на создание полигональных моделей и текстур значительно выросли. Все атаки NPC, происходящие в такие моменты, очень огорчают. Нужно всеми силами стремиться избегать таких приёмов. В таких ситуациях игрок не знает о грядущих опасностях и никаким способом не может понять, откуда в него стреляют.
Простейший способ снизить раздражение игрока: когда враг видит игрока, он должен начать двигаться, а не стрелять в него. Заставьте NPC перед атакой убежать с уязвимой открытой позиции в укрытие, чтобы предупредить игрока о начинающемся бое. В ситуации с несколькими противниками достаточно движения только одного из них, в то время как другие NPC могут просто ждать, прежде чем нападать на игрока.
Подсказывать игроку о предстоящем бое особенно важно в экшн-адвенчурах и FPS, потому что они обычно состоят из двух основных режимов игры. Игрок находится или в режиме исследования/решения головоломок, в течение которого нет или почти нет боёв, или активно участвует в бою. Предупреждение игроков о том, что они переходят в режим боя, жизненно необходимо для игрового процесса. Игрок должен переключиться из медленного, расслабленного режима геймплея в более быстрый.
Будьте заметны
Хотя в реальном бою противники стремятся быть как можно более невидимыми, в игровом мире отличный камуфляж создаёт плохой геймплей. Разглядывание пикселей в поисках противников — не слишком интересный процесс. Сделайте текстуры NPC контрастными относительно фона, чтобы игрок быстрее обнаруживал врагов и переходил к настоящему процессу игры. На униформе противников могут быть похожие на камуфляж узоры, но их цвет и яркость должны сильно контрастировать с окружением.
Не будьте снайпером
Активные перестрелки — это хорошо, они заставляют игрока двигаться и создаёт напряжение, повышая таким образом темп игры. Но они неприятны, когда игрок умирает слишком быстро. Простейший способ сделать NPC глупее и ускорить темп игры — дать компьютерным противникам сбитые прицелы. Благодаря этому можно использовать активные перестрелки, не делая игру слишком сложной для игрока. В FPS часто используется разброс пуль вплоть до 40 градусов.
Или же можно снизить сложность игры, уменьшив ущерб от пуль противника. Однако при этом теряются некоторые дополнительные преимущества плохого прицеливания. Одно из случайных последствий плохого прицеливания — это напряжение, возникающее при пролетании трассирующих пуль над головой игрока, облака бетонной пыли или искры от пуль, ударяющихся об стену рядом с игроком. Кроме того, промах награждает игрока: игроки часто считают близкие промахи подтверждением правильности выбранной тактики передвижения.
Промахнитесь в первый раз
Для оружия, наносящего большой урон (например, убивающего с одного-двух попаданий), требуется нечто большее. Обычно игроку не очень интересно внезапно и неожиданно получать большой урон. В таких ситуациях игроки часто чувствуют себя обманутыми. Можно снизить раздражаение, намеренно промахнувшись по игроку в первый раз. Это даёт игроку секунду, чтобы отреагировать, и сохраняет высокий уровень напряжений.
Кроме того, намеренные первые промахи можно располагать стратегически. Один из самых раздражающих аспектов выстрелов игроку в спину заключается в том, что игрок не понимает, откуда в него стреляли. В некоторых FPS пытались уменьшить эту проблему добавлением подсказок на экране (например, мерцающих красных значков), показывающих направление атаки. Такие подсказки (обычно воспринимаемые как часть интерфейса пользователя), разрушают иллюзию реальности и на удивление не так очевидны для игрока, как можно было ожидать.
Намеренные промахи, в особенности при выстрелах сзади, могут уменьшить эту проблему, указывая направление атаки, при этом не разрушая иллюзию реальности. Лазерный луч или трассирующая пуля, стратегически попадающая в пол или стену прямо перед убегающим игроком, показывает направление, с которого происходит нападение. К тому же информация о направлении, передаваемая лазерными лучами или трассерами, намного информативнее, чем простые мерцающие экранные подсказки. Они позволяют игроку более правильно реагировать на атаку.
Ещё один ценный способ использования намеренных промахов — попадание в определённые объекты окружения. Например, когда игрок приближается к бочке с водой, фарфоровой статуе или стеклянной вазе, противнику вместо выстрела в игрока лучше прицелиться в ближайший к тому разрушаемый объект, лучше всего тот, который разваливается наиболее драматично. Не забывайте — цель программиста хорошего ИИ — не убить игрока, а создать напряжение.
Последний, более сложный способ использования намеренных промахов — они позволяют дизайнеру направлять игрока. Продуманно расположив пули, летящие рядом с игроком, дизайнер может подтолкнуть игрока двигаться в нужном направлении.
Предупреждайте игрока
Ещё один эффективный способ повышения удовольствия от игры — предупреждение игрока перед атакой. Её можно реализовать визуально, воспроизводя короткую анимацию подготовки к нападению, или аудиально, проигрыванием звука (писка, щелчка и т.д.) или криком «Попался!» или «Получай!». Звуковые подсказки особенно важны, когда на игрока нападают сзади. Они дают игроку шанс отреагировать на атаку, чтобы он не чувствовал себя обманутым.
Поскольку люди в реальном бою никогда не останавливаются, чтобы предупредить своих врагов, то можно подумать, что из-за этого компьютерные противники будут выглядеть глупее. Напротив, такие предупреждения можно использовать для привлечения внимания к другим, более примечательным аспектам ИИ. Например, умного NPC можно запрограммировать на поиск маршрутов обходов врага с фланга или нахождения мест для засады [Lidén02]. Если игроки после попадания в засаду сразу же гибнут, то они не смогут оценить все изощрённые тактики противника. Интеллектуальное поведение будет более заметно, если NPC издаёт предупредительный звук, чтобы у игрока осталось время повернуться и увидеть затаившегося в умно подобранном для засады месте NPC. Если NPC в засаде постоянно убивает игрока, игра больше не будет доставлять удовольствия. Предупреждая игроков, вы даёте им время увидеть ум ИИ и отреагировать на его поведение, не умерев.
Ещё одно преимущество звуковых подсказок заключается в том, что игрок быстро учится реагировать на определённые звуки, если они неизменны [Madhyastha95]. Например, если конкретная фраза («Попался!») предшествует атаке, после нескольких таких случаев звук будет вызывать у игрока физическую реакцию. Такое условное поведение может значительно увеличить напряжённость игры. Более того, если фраза «Попался!» используется только когда враг применяет определённую боевую стратегию ИИ (например, разбирается, как обойти игрока с фланга), то увидев несколько раз сочетание флангового маневра и крика «Попался!», в дальнейшем игрок будет ожидать сложного обхода с фланга, даже если не видит его.
Нападайте в стиле «кунг-фу»
Во многих играх игрок находится в роли «Рэмбо» (другими словами, в одиночку противостоит целой армии). Хотя во многих жанрах выкашивание толп врагов одной очередью вполне приемлемо, противники в таких играх похожи на беззащитных ягнят с очень слабым искусственным интеллектом. Однако если наши противники умны, то схватка с несколькими из них одновременно оказывается слишком сложной для игрока. С другой стороны, большее количество врагов создаёт интересный и динамичный игровой процесс.
Решение заключается в дизайне боёв в стиле «кунг-фу». Другими словами, даже если одновременно рядом с игроком несколько NPC, нападает на него только пара. Другие занимаются перезарядкой оружия, прячутся или меняют позицию. Ни один из противников не должен оставаться на одном месте слишком долго, даже если текущее положение обеспечивает хорошую позицию для атаки. Меняясь ролями в атаке и постоянно двигаясь, противники создают активную боевую ситуацию, в которой игроку противостоит множество врагов, но атакуют его только некоторые. Удивительно, но игроки, встретившиеся с такой ситуацией, обычно не осознают, что их одновременно активно атакуют не более двух противников, даже если сражение идёт с большой группой врагов.
Сообщите игроку, что вы делаете
Когда игрок видит действия NPC, ему иногда сложно их интерпретировать. Будет ли бегущий противник прятаться, звать подкрепление, обходить с фланга или просто бежать без всякой цели, стараясь не нарваться на пулю? Сложное поведение NPC часто ускользает от игрока. Когда такое происходит, вся работа разработчика ИИ идёт прахом. Эффективный способ справиться с этой сложность — в буквальном смысле говорить игроку о том, что делает ИИ. Например, при выполнении действия противник может крикнуть своим соратникам «Обхожу с фланга!», «Прикрой!», или «Отступаю!». Такие подсказки могут иметь очень высокую эффективность и часто дают побочный эффект: игроки предполагают наличие интеллекта там, где его нет.
Реагируйте на ошибки
Даже самые изощрённые системы ИИ ошибаются, это неизбежно. Если подойти к ошибкам неправильно, то NPC будут казаться тупыми. Распознав возникновение ошибки и с умом отреагировав на неё, вы не только сохраните иллюзию интеллекта, но и превратите ошибки в особенности.
Рассмотрим вычисления, необходимые для точного поражения цели. В богатом 3D-мире с движущимися объектами (в том числе с другими NPC и игроком), несмотря на все сложные физические расчёты неизбежно возникают ошибки. Граната отскакивает от объекта или другого NPC и падает к ногам бросившего её NPC. (Не забывайте, что игроки тоже иногда делают эту ошибку!)
Если мы просто позволим NPC стоять и ждать взрыва, то ИИ покажется довольно жалким. Однако если мы распознаем ошибку, то сможем соответствующим образом отреагировать на неё. Если бросивший гранату NPC прикрывает голову, демонстрирует удивление и/или страх, кричит «Не-е-ет!», то это больше не выглядит ошибкой ИИ. Теперь ошибка превратилась в особенность, она добавляет NPC индивидуальности, а в игре появляется немного юмора и интересной вариативности.
Отступайте в последний момент
Задача системы ИИ — создание для игрока интересного и напряжённого игрового процесса. В идеале у игрока должно быть ощущение сложности, загнанности в угол, но в результате он всё равно должен победить. Один из способов реализации — встроить «подталкивание к краю» в саму архитекруту ИИ. В этой модели NPC активно атакуют игрока почти до самой смерти. Показатели игрока тщательно отслеживаются, чтобы его здоровье или ресурсы почти полностью истощались, но не до конца. Когда игрок достигнет предела, ИИ отступает, нападает менее эффективно, и его становится проще убить. После победы такая ситуация воспринимается игроком как настоящий подвиг. Однако при таком подходе разработчик должен быть очень аккуратным, чтобы игроки не поняли, что ими таким образом манипулируют. Если этот трюк можно распознать, он однозначно разрушает ощущения от игрового процесса.
Намеренные уязвимости
Игроки учатся делать упор на слабостях противника, даже если они возникают непреднамеренно. Поэтому вместо того, чтобы позволять игроку находить такие уязвимости, часто лучше встроить их в поведение NPC. Например, бегущему NPC может понадобиться остановиться и подготовить оружие, то есть у него уходит больше времени на атаку, чем у неподвижного. Противник, на которого напали сзади, может оказаться застигнутым врасплох и медленнее реагировать. Добавление несовершенства в поведение NPC тоже может сделать их более реалистичными и придать им индивидуальности. Например, при перезарядке NPC иногда может возиться дольше. Враг, знающий о том, как избегать мин-ловушек, может случайно нарваться на одну из них. Запланированные уязвимости делают управляемых компьютером персонажей более реалистичными. Непреднамеренные ошибки разрушают реализм. Для правильного подбора баланса требуется тщательное тестирование игрового процесса (плейтестинг).
Плейтестинг
Самый важный инструмент программиста ИИ — плейтестинг. Даже для разработчика с многолетним опытом создания ИИ тестирование игрового процесса — это единственный надёжный способ определить, когда можно использовать «дешёвые» решения, а когда стоит применить более сложные техники искусственного интеллекта. Не стоит недооценивать важность реакций неопытных тестеров на ИИ. Даже опытных разработчиков ИИ часто удивляют результаты плейтестинга и интерпретации, придумываемые игроками.
Выбор тестеров — это критически важный процесс. Плейтестеры ни в коем случае не должны быть членами команды разработчиков игры и лучше, чтобы они никак не были связаны с индустрией разработки игр.
Любые знания о техниках и трюках разработки искусственного интеллекта могут повлиять на интерпретацию событий плейтестером. Во-вторых, плейтестеров должно быть много. Тому есть две причины. Первая: после внесения изменений в ИИ требуется новый набор игроков-новичков. Повторно используемые плейтестеры подвержены предубеждениям, внушённым предыдущей версией ИИ. Их интерпретация поведений NPC и техники игры будут отличаться от восприятия новичков. Вторая: поскольку навыки игроков бывают очень разными, необходимо большое количество плейтестеров. Возможно, единственный из тридцати тестер сможет найти критическую слабость ИИ, из-за которой NPC выглядят глупо или их легко убить. При тестировании малым коллективом игроков ИИ может выглядеть безупречным, но оказаться провальным после выхода игры на большой рынок.
Плейтестинг необходимо проводить на протяжении всего процесса разработки, а не только в конце производства. Распознавание факторов, влияющих на интересность и напряжённость — это сложный и длительный процесс. Планируйте, что вам придётся несколько раз отбрасывать идеи и начинать с нуля. Кроме того, важно позволить некоторым из плейтестеров тестировать игру во время всего процесса разработки. Игроки лучше осваиваются в игре и с большей вероятностью смогут найти лазейки в реализации ИИ. Кроме того, после долгой игры они научатся распознавать трюки ИИ.
На каждом плейтестинге должно быть много наблюдателей. Во время сеанса игры наблюдатели делают заметки о внутриигровых действиях игрока, о его физических реакциях, таких как поза и выражение лица. Следует также записывать вопросы, которые нужно задать плейтестеру, но вопросы надо задавать только после завершения игрового процесса. Важно, чтобы наблюдатели ничего не говорили во время плейтеста, даже если у игроков возникают сложности.
После завершения игрового процесса нужно проинтервьюировать тестеров, чтобы узнать их реакцию на игру. Важно определить, что происходило по мнению игрока, а не то, что было реализовано в ИИ. Часто игроки предполагают наличие сложного поведения там, где его нет. И наоборот — игроки упускают сложное поведение ИИ. Спросите плейтестера о действиях и намерениях NPC. Постарайтесь не задавать наводящих вопросов. В продвинутых игровых движках есть режим записи, в котором можно показать игроку повтор сеанса игрового процесса и задать ему вопросы о его действиях.
Несколько примеров
Стандартная ошибка разработчиков ИИ — переусложнение дизайна. Часто достаточно гораздо более простого решения и дешёвые, но изобретательные решения оказываются значительно лучше. Например, программисты часто переусложняют дизайн при разработке тактики отрядов. Сложный обмен информацией и взаимодействия между бойцами часто не замечаются игроком, а потому необязательны. В игре Half-Life компании Valve [Valve98] есть впечатляющий пример того, как простые поведения могут создавать богатый геймплей, заставляющий игрока предполагать интеллектуальное поведение.
Десантники в Half-Life используют стиль боя «кунг-фу»: вне зависимости от количества десантников, с которыми сражается игрок, на самом деле одновременно в него разрешено стрелять максимум двоим. Между десантниками на самом деле не происходит никакого общения. Вместо этого каждому отряду бойцов даётся по два слота атаки. Если десантник хочет атаковать, но оба слота заполнены, то он находит себе другое занятие (например, перезарядку оружия или перемещение к новой позиции для атаки). Когда у одного из атакующих десантников заканчиваются патроны, он освобождает слот атаки и переключается на поведение поиска и перезарядки. Затем один из неатакующих десантников обнаруживает пустой слот, занимает его и начинает стрелять в игрока.
Добавлено ещё одно простое правило: когда слот атаки освобождается, и в бою есть несколько десантников, то освобождающий слот атаки боец кричит «Прикрой меня!». Хотя никакой коммуникации между этими десантниками не происходит, игрок воспринимает это так: один из бойцов просит прикрыть его, а второй открывает прикрывающий огонь. В реальности слот атаки освобождается и занимается другим десантником, ничего не знающем о перезарядке первого.
Во время плейтестинга обнаружилось, что когда игрок бросает гранату в группу NPC, алгоритм поиска пути Half-Life не способен найти путь побега для всех NPC. Поведение оставшихся NPC выглядело чрезвычайно тупым, они метались вокруг, пытаясь найти выход. Вместо переделки системы поиска путей (сложная задача), Valve решила обнаруживать возникшую проблему и воспроизводить специальную анимацию попавших в ловушку десантников — они приседали и закрывали головы руками. Такое поведение очень хорошо восприняли плейтестеры, потому что оно добавляло игре характерности.
Заключение
В этой статье рассмотрены важные концепции. Усилия разработчиков в области искусственного интеллекта так часто сосредоточены на том, чтобы сделать компьютерных противников умными, что они пренебрегают адекватным восприятием того, как ИИ делает игру интересной. Задача сложного ИИ — не убить игрока, а добавить напряжённости, управлять темпом игры и придать компьютерным персонажам индивидуальности. Простые решения часто лучше и интереснее, чем сложный искусственный интеллект. Добавляя в поведение NPC намеренные уязвимости, мы заставляем игрока обратить внимание на запланированные слабости ИИ, а не искать непреднамеренные. В этой статье также описаны различные трюки для того, чтобы системы ИИ максимизировали фактор развлекательности. Кроме того, не стоит считать, что годы разработки систем ИИ могут заменить тщательное тестирование игрового процесса.
Ссылки
[Lidén02] Lidén, Lars, «Strategic and Tactical Reasoning with Waypoints», AI Game Programming Wisdom, Charles River Media, 2002.
[Madhyastha95] Madhyastha, Tara and Reed, Daniel, «Data Sonification: Do You See What I Hear?» IEEE Software, Vol. 12, No. 2, 1995.
[Valve98] Valve LLC, “Half-Life,” 1998. См. www.valvesoftware.com