Существуют различные способы поддержки сценариев в играх; это скользящая шкала.
С одной стороны, вы можете запустить практически все, используя язык сценариев, так что вы определяете все свои данные, логику и т. Д. С помощью сценариев и просто имеете некоторые основные функциональные возможности движка в C / C ++. В этой схеме почти все на стороне C / C ++ * находится именно на той стороне разрыва, чтобы сделать его достаточно эффективным или потому, что оно уже написано на этом языке и будет дорогостоящим для переопределения.
С другой стороны, вы можете определить большую часть своего игрового кода и данных, определенных в C / C ++, и реализовать привязки и / или обратные вызовы, чтобы позволить некоторую настройку с помощью сценариев. Привязки (например, LuaBind ) позволяют вашим сценариям получать и устанавливать значения / вызывать функции, которые не определены в коде сценария, но на стороне C / C ++. Обратные вызовы позволяют сценариям прослушивать инициируемые игровые события; Например, у вас может быть скрипт, который вызывается, когда сущность собирается получить урон. Затем вы можете настроить / расширить свою игровую логику с помощью сценариев.
Книга Архитектура игрового движка хорошо объясняет возможные варианты, хотя в ней нет примера кода или чего-либо подобного.
как сценариев очень сильно зависит от того, какой у вас стиль реализации и какие языки ядра и сценариев вы выберете. Если вы хотите что-то более конкретное, попробуйте найти некоторые языковые варианты (например, C ++ и Lua), а затем отследить некоторые учебники, такие как этот .
, почему зависит от выбранного подхода, но обычно он разделяет функциональность / поведение / данные игрового процесса от внутренностей вашего игрового движка. Это облегчает изменение, поскольку вы можете перезагрузить сценарии во время выполнения, не перестраивая остальную часть проекта. Хорошо реализованная система сценариев также позволяет людям участвовать или модифицировать / расширять игру, не беспокоя программиста.
Конкретный пример:
Возможно, вы захотите создать функциональность, которая скажет игроку, какой урон он нанес за раунд.
Если вы делаете это на стороне C ++ / core, это означает, что программист должен загрузить очень специфический код для выполнения очень специфической функции, перестроить весь проект и развернуть новую версию. Затем они проверяют с дизайнером, что все великолепно. Если это не так, им приходится перекодировать и перестраивать, тратя много времени.
С хорошо разработанной системой сценариев это просто случай, когда вы помещаете сценарий round_damage.lua в папку сценариев. Сценарий автоматически включается и активируется при запуске игры, и каждый раз, когда игрок получает урон, запускается обработчик «OnDamageReceived». Когда раунд заканчивается, вызывается обратный вызов OnRoundEnded, и сценарий отображает сообщение.
Предоставляя богатый набор хуков, сценарист может делать все это без помощи программиста. Если они допустят ошибку или захотят попробовать что-то еще, сценарист может немедленно перезагрузить сценарий, не закрывая игру.
* Заметьте, я говорю C / C ++ для ядра движка, потому что это общий выбор, но это может быть любой язык, достаточно быстрый для ваших целей.