Перейти к содержанию

Общие сходства между игровыми движками


Рекомендуемые сообщения

По не подтвержденным данными сходства у игр следующие:
 
1. Все игровые объекты имеют "базовый класс", а реализация - "базовый объект". Базовый объект мы видим в памяти как "структуру данных"

Если в игре видно например 10 бегающих игроков, то у них 100% общий базовый класс. По классу выстраиваются данные собственной структуры. У каждого игрока своя структура. Она чем-то похожа, но и чем-то отличается от других.


 
Например, похожи или отличаются структуры данных уникальным именем (строка текста), тегом - тоже текст, битовая маска - принадлежность к слою. Например, в Unity3d cлоев в игре может быть множество, а камеры и свет в игре настраиваются под эти слои. Тогда 10 одинаковых смещений от начала базового адреса до  адреса с одинаковой битовой маской слоя будет у 10-ти структур данных.
 
2. Динамическая иерархия базовых объектов
Объекты во время игры могут быть дочерними своих родительских объектов и наоборот, или не иметь родителей. Это очень похоже на дерево из вложенных папок, которое вы смотрите в проводнике Windows, открывая его по ярлыку "Мой компьютер" 

 
Т.е. мы имеем динамический список иерархии объектов типа компонента TreeView (программисты знают этот тип компонента). В этой иерархии мы можем найти объект вызывая игровые функции, которые просто обязаны быть в игровом движке. Как правило это функции поиска по уникальному имени объекта, тегу или типу. Возвращают такие функции один объект или массив объектов.
 
3. Объект можно активировать, деактивировать, удалить, создать, назначить родителя и прочие функции характерные для базового объекта
 
4. В базовом объекте содержатся данные ориентации в игровом мире
Сам по себе игровой объект это пустой контейнер. В движке Unity3d он содержит по умолчанию компонент Transform, который содержит Vector3 структуру (координат, масштаба, ейлеровы углы), Quaternion структуру (углы).

 
5. В базовом объекте находится динамический список копонентов-поведений игрового объекта
Компонент-поведение это базовый класс, а его наследует пользовательский. Соответственно структура получается где-то похожа на другие структуры, а где-то отличающаяся. Поведения можно отключать, включать, удалять, создавать, присоединять. Поведения можно искать "по типу" для базовых объектов...

 
Например, персонажи, которые бегают по карте имеют базовый объект с компонентом  CharController (компонент игрового движка). Значит используя игровую функцию поиска можно перечислить все объекты с типом CharController, получить ссылк на Transform и получить например координаты этих объектов в игре.
 
Интересный вопрос. Каким образом боты знают, что им нужно стрелять в определенного персонажа - нашего главного героя.
 
Это может быть, когда бот создается (спавнится) и он ищет по иерархии объектов все GameObject и отличает их по главному тегу и ссылку на этот GameObject он сохраняет. Другой вариант,  у у бота есть поле зрения в виде невидимой меш-сферы или триггер-коллизии. Когда в поле попадает CharController, то срабатывает событие и в нем проверяется, главный ли это игрок чтобы преследовать его или стрелять по нему.
 
6. Компоненты или поведения могут быть стандартные или пользовательские - наследуемые от стандартных.
Компонент - это класс, у которого есть функции(методы) и поля (игровые параметры). Если есть 10 игроков, то мы имеем одинаковые наборы ссылок на функции в 10 структурах от базового адреса и также имеем набор полей в 10 структурах, которые могут отличаться или быть похожими

 
7. Все персонажи в игре имеют коллизии
Коллизия это компонент с не видимым в игре мешем (mesh-сеткой из вершин составляющих треугольники). Коллзия может быть с гравитацией, без гравитации, а может быть как триггером - пустой коллизией, в которую можно заходить. Коллизии как правило сообщают базовым объектам события о столкновениях, вхождениях, нахождения, выходах из коллизии.

 
8. Рейкастинг
Это функция (а может быть их несколько) выпускает невидимый луч от начала X,Y,Z по направлению  X,Y,Z на некоторую дистанцию. После чего возвращается массив из коллизий, которые попали в этот луч. Это используется для стрельбы, чтобы нарисовать искры в месте попадания и отправить сообщение об уроне базовому объекту в коллизию, которого попали

 
9. Сообщения
Компоненты игровых объектов могут содержать функции - приёмники. Можно посылать базовому объекту сообщение игровой функцией, а какие поведения будут принимать сообщения можно и не знать. Сообщения как правило трех видов. Сообщение базовому объекту. Сообщение базовому и его дочерним - т.е. сообщение вглубь. Сообщение объекту и его родителям, т.е. сообщения вверх из иерархии.

 
10. Базовые объекты имеют слои
Слои это битовая маска. По ней может может определяться какой объект в какую камеру будет виден, какой свет будет падать на какой объект, а также физические взаимодействия тоже возможны по слоям.

 
11. Меш
Меш в играх эта сетка из вершин, которые соединяться в треугольники по индексам. Используя меш и шейдер - программу для видео карт, мы рисуем перед камерой изображение. Сам шейдер обычно содержится в материале, а в материале описывают свойства, которые задаются шейдеру по входным параметрам. Так и получается, что CPU двигает базовые объекты с компонентами сетки, камеры, источника освещения, а GPU рассчитывает цвет на каждый пиксель (рисует, рисует и рисует...)

 
12. Функции загрузки сцен
Ну, да, эти функции есть у всех игровых движков... передается обычно уникальный индекс сцены или имя сцены
 
13. Функции работающие с параметрами настроек
В игровых движках могут быть функции сохранения и загрузки параметров по уникальному имени - ключевое текстовое значение. Например, у Unity3d такие функции находятся в классе 
PlayerPrefs.
 
Например, следующие код выведет счет игрока

А другой код запишет и сохранит счет

PlayerPrefs работает с общими типами Float, Int, String.
 
В жвижке X-Ray Engine 1.6 следующий пример

 Можно поискать строки в памяти игры похожие на скорость стрельбы, перезарядки, загрузки вещей. Если найти адрес похожий на настройку, поставить брейкпоинт на чтение, загрузить сцену игры, то если повезет мы выйдем на инстуркцию чтения парметров. Сделав Lua скрипт на CE мы можем вывести все текстовые ключи и настройки для них, а также подменить эти ключи в режиме игры.

 

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

 

1. Используя CE Lua можно совершать поиск и сохранение в файл строк. Я обсуждал в этой теме

 

2. Для подмены значений на инструкции нужно написать свой Lua скрипт

 

3. Для логирования ключевых слов на инструкции нужно написать свой Lua скрипт

 

print (PlayerPrefs.GetFloat("Player Score"));
PlayerPrefs.SetFloat("Player Score", 10.0);PlayerPrefs.Save();
//сила выстрела и его мощьность	s_sHitPower			= pSettings->r_string_wb(section, "hit_power" );//читаем строку силы хита пули оружия	s_sHitPowerCritical		= pSettings->r_string_wb(section, "hit_power_critical" );	fvHitPower[egdMaster]		= (float)atof(_GetItem(*s_sHitPower,0,buffer));//первый параметр - это хит для уровня игры мастер	fvHitPowerCritical[egdMaster]	= (float)atof(_GetItem(*s_sHitPowerCritical,0,buffer));//первый параметр - это хит для уровня игры мастер	fvHitPower[egdNovice] = fvHitPower[egdStalker] = fvHitPower[egdVeteran] = fvHitPower[egdMaster];//изначально параметры для других уровней сложности такие же
Изменено пользователем MasterGH
Добавлен пункт 13
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.