Руководство начинающего в Unreal используя UnrealScript Цель В этом документе я попытаюсь продставить введение в программирование для Unreal используя UnrealScript и обрисовать основную структуру классов которую использует Unreal. Это предназначено для начинающих, кто ищет начальную точку в создании модификаций для Unreal. Я очень советую также прочитать Introduction to UnrealScript by Tim Sweeney, так как этот документ является более специфичным в приложениях UnrealScript в Unreal, и введение в него является более общим. Это не затронет использование файлов заголовков и других библиотек, так как это было не доступно в то время когда писался этот документ. Комментарии, предложения, похвала должны быть посланы Ray Davis по email, адрес ca@planetunreal.com. Спасибо Tim Sweeney, Steven Polge и остальной команде Epic за создание крутой игры и за то, что будучу крутыми программистами, отвечали на вопросы. Введение UnrealScript является языком разработки исключительно для создания игрового содержания для Unreal. Он основан на Java и C++, таким образом если вы имеете некоторый опыт или в этих языках или просто в C, процесс обучения UnrealScript будет сравнительно небольшим, но если вы не имеете никакого предыдущего опыта, я настоятельно рекомендую чтобы вы сначала изучили один из этих языков и затем вернулись в UnrealScript. UnrealScript придерживается стиля синтаксиса общего для Java и С++/C, разделяя много ключевах слов найденных в Java. UnrealScript является объектно-ориентированным языком (ООП для краткости), это значит, что он основан на концепции классов и наследовании. Важно заметить, что UnrealScript не имеет всех особенностей большинства полных языков ООП, таких как Java, в основном он не поддерживает сложное наследование, но к счастью ни одна из этих отсутствующих особенностей не нужна чтобы делать полнофункциональные модификации. Есть несколько руководств которые быстро ознакомят с концепцией ООП, если вы незнакомы с этим, то одно из таких руководств от Brandon Reinhart лежит по этому адресу: http://www.planetquake.com/osp/tuts/GM-OOtutorial.html Уникальной особенностью UnrealScript являеются состояния, которых нет ни в Java, ни в C++. Состояния являются особенностью, которая позволит вам определять различные реализации функций внутри одного и того же класса (очень близко к подавлению функций в ООП) и в общем они используются для программирования основанного на времени. Например, вы имеете класс Player, который содержит три состояния: Walking, Running и Idle. Вы хотите чтобы Player сделал прыжок через голову в воздухе, если он прыгает когда бежит и вы не хотите чтобы он прыгал когда он стоит (или Idle). Один способ сделать это используя состояния. Определите функцию прыжка в обоих состояних Running и Idle, затем в коде состояния Running простой прыжок в ту версию функции Jump и затем код бездействия в версию функции Jump состояния Idle. Таки образом когда ваш игрок бежит (и соответственно в состоянии Running) он сделает прыжок через голову в воздухе если он прыгнет и ничего не сделает если он не бежит. Прошу прощения, если это не очень хороший пример, но это должно помочь сделать немного понятнее как состояния могут быть очень полезны. Unreal сохраняет UnrealScript код в package (дополнительно вместе с текстурами, звуками и моделями) в директории Unreal/System. Чтобы держать все ваши новые классы в одном package для простого распространения, просто укажите имя того же самого package в поле имени package, когда вы создаете ваш новый подкласс. Использование UnrealED для редактирования UnrealScript UnrealED имеет встроенный браузер классов, редактор и компилятор для UnrealScript который легко доступен. Запустите UnrealED обычным способом и справа должно быть раздвижное дерево начинающееся с "+Actor" и имеющее несколько других классов внизу него как "-Brush" и "-Info". Кликнув на "-" или "+" перед именем класса вы можете свернуть.развернуть дерево классов чтобы показать его дочерние классы и сделав двойной клик на самом имени класса, откроется окно редактирования с кодом класса (если он есть) внутри него. Кликнув правой кнопкой мыши на имени класса вы можете получить небольшое меню, которое поможет вам создать подкласс текущего класса или редактировать свойства по умолчанию. Замечание:для большинства модификаций вы захотите сделать подклассы существующих классов и сохранить их в вашем собственном package, т.к. если вы модифицируете оригинальный код Unreal вы будете не способны играть в другие версии Unreal в результате несоответствия (главным образом как меры препятствующие читингу, я полагаю). Чтобы скомпилировать и сохранить заново отредактированный код просто нажмите F7 чтобы откомпиировать все измененные скрипты и затем на верху дерева выберите сохранить, найдите ваш package и кликните на сохранить. UnrealED затем сохранит ваш код (компиленный или нет) в файл в директории Unreal\System с именем вашего package и расширением .u (т.е. blah.u для package blah). Структура классов Unreal Object(объект) и Actor Все что кодируется UnrealScript происходит от очень абстрактного и основного класса Object (Объект) и из него мы получаем много внутренних классов которые распоряжаются движком сами (в основном звук, графика и т.д.) и более важно класс Actor, который довольно много заключает все что вы хотите модифицировать для частичной модификации. Класс Actor определяет большинство стандартных переменных и функций которые необходимы для всех классов и весь связанный с игровым содержимым материал содержится в классах происходящих от Actor. Игроки, оружие, искусственный интеллект и даже сама игра происходит от базового класса Actor. Важные функции записанные в Actor: BeginPlay(), Spawn(), Touch(), Tick(), Destroy(). Функция BeginPlay(), вызывается всякий раз когда объект этого класса помещается в игру. Это очень полезно инициализировать важные переменные и сделать другие действия в точке создания. Функция Spawn() используется чтобы создать объект класса и поместить его в игру. Touch() вызывается всякий раз когда этот Actor коснулся другого Actor и полезна для причинения повреждения или изменения переменных в другом Actor. Функция Tick() вызывается каждый игровой тик, обычно настолько насколько возможно, используйте ее чтобы выполнять переодические действия или проверять определенные условия. Замечание: будьте осторожны и не помещайте слишком много кода в функцию Tick(), т.к. очень просто затормозить игру и причинить заметный лаг, если буде слишком много выполняться. Используйте функцию Destroy() чтобы уничтожить объект класса когда вы больше не хотите чтобы он был в игре. Pawns Класс Pawn содержит ScriptedPawn(искуственный интеллект), FlockPawn(Insect/Flock AI), PlayerPawn(игроки) и большинство классов классов Botpack, по существу все живые существа на уровне. Класс Pawn определяет основные переменные, пемещение и другие раснообразные функции общие для всех Pawn. Здоровье, скорость на земле, скорость в воздухе и JumpZ являются просто некоторыми из полезных переменных обнаруженных в Pawn. PlayerPawn окружает всех игроков, читай клиентов, которые доступны в игре. Он имеет несколько дочерних классов, в основном UnrealIPlayer, затем Human/Skaarj и затем различные мужчины/женщины игроки. PlayerPawn содержит всю функциональность игроков (перемещение, поддержка ввода) в то время как остальные дочерние классы поддерживают всю анимацию и звуки особенные для различных игроков. PlayerInput() и PlayerCalcView() две функции которые могут быть изменены в ваших собственных классах чтобы создавать некоторые крутые модификации. PlayerInput() поддерживает весь ввод от игрока, вызывает подходящие функции и модифицирует соответствующие данные. PlayerCalcView() поддерживает вычисления вида игрока и может быть просто модифицирована, чтобы создать вид от третьего лица, и т.д. ScriptedPawn место где вы найдете все содержимое игры связанное с искусственным интеллектом (исключение FlockPawns). Этот класс определяет основу скаржа Unreal, налей, королевы и любого другого создания которое вы найдете в игре. Искусственный интеллект использует в большой степени состояния и основывается на общем pathnode используя технику для навигации. Слава богу, что Steven Polge очень хороший программист и создал очень крепкий искуственный интеллект, который может использоваться чтобы создавать новых созданий очень просто без нового кода, используя редактируемые переменные чтобы определить все стороны искуссвенного интеллекта. Я настоятельно рекомендую прочитать руководство "Unreal Creature Care and Feeding Guide" by Steven Polge расположенное по следующему адресу http://unreal.epicgames.com/AI.htm, если вы планируете сделать значительное программирование искуственного интеллекта или вы просто хотите получить более глубокое понимание, как такие выщи работают. FlockPawns специальный случай искусственного интеллекта, который приводит в действие удивительные стаи рыб или рои мух, которые в самом деле не делают ничего, кроме как выглядят круто. Вы можете модифицировать их чтобы сделать их немного более разумными, если вы захотите, я полагаю, но они очень хороши уже будучи тем что они есть. Замечание: FlockMasterPawns действительно поддерживает создания FlockPawns и вы должны родить их вместо индивидуальных FlockPawns, так как они кодируются чтобы самоуничтожаться если они не имеют FlockMasterPawn. Класс Bot используется чтобы находится ниже ScriptedPawn класса, но позже был перемещен в дочерний класс Pawn, так как его искусственный интеллект значительно отличается от среднего в ScriptedPawn в его функции и цели. Этот класс стоит поучить если вы думаете, что вы имеете хорошие идеи как сделать более реалистического/смертельного/уникального Bot. Info Класс Info обобщенный класс, который окружает все классы которые имеют дело с различной игровой информацией, такой как текущие правила (Deathmatch, SinglePlayer, TeamGame), ZoneInfo который используется для создания лавы, воды или просто плоских пустых пространств и PlayerReplicationInfo, которое содержит специальную сетевую информацию для игрока. Большинство моего опыта кодирования в классах Info было в GameInfo чтобы определить новый тип игры или изменения классических, например ASMD only deathmatch. Также возможно сделать подкласс класса ZoneInfo чтобы создавать новые типы зон, такие как токсические отходы с Марса или может быть специальный тип воды который отражает выстрелы из оружия и т.д. Triggers Класс Trigger поддерживает деятельность лифтов, дверей и других событий отвечающих определенным действиям в игре и затем выполняющих другие действия, или модификацией другого actor или выключением другого триггера или обоих. Триггеры невидимы в игре и как правило переключаются касанием, близостью или другим триггером. Он также вызывает функцию Trigger() из другого класса чтобы выключить триггер, сказать открыть все двери на уровне сразу или некоторые. Подкласс класса Trigger создает специальный набор триггеров или другой геймплей управляемый событиями. Effects Effects покрывает все спецэффекты в Unreal, как взрывы, лазерные взрывы и т.д. Подкласс Effects создает ваши собственные спецэффекты или комбинирует другие существующие. Inventory Класс Inventory, дочерний класс Actor, содержит оба класса Pickup и Weapon. Класс Pickup это все предметы, за исключеним оружия, которые Pawn поднимет и использует в игре, будь это здоровье, броня или патроны. Используйте класс Pickup чтобы сделать ваш собственный предмет в игре, такой как can of beans или может быть даже фугас. Класс Weapon поддерживает все функции для стрельбы и получения оружия в игре. Все индивидуальное оружие Unreal определяется как подкласс класса Weapon и поддерживает специфику оружия, такую как анимацию и создание эффектов снарядов/оружия. Просто сделайте подкласс Weapon чтобы создать новое оружие, предусмотренное вашей новой моделью или вы можете сделать подкласс одного из оружий Unreal и использовать его модель. Замечание: Оружие базируется на важной переменной, bInstantHit. Если она установлена в true, тогда оружие не будет создавать снарядов (таких как рокета) и вместо этого будет делать мгновенное повреждение люболй цели на линии взгляда (такое как снайперская винтовка). Все остальное Есть много классов которые используются для создания оставшихся вещей которые вы видете в Unreal, такие как HUD для игроков, свет, перемещающиеся brushes, меню или новые снаряды. Эксперементирование и просто просматривание кода должны помочь вам добыть основное понимание как все еще layed out и как это работает. Vectors and Angles (векторы и углы) Unreal использует концепцию векторов и углов чтобы поддерживать все перемещения и вращение Actor в мире 3D игры. Вектор является структурой которая содержит три компоненты X, Y, Z, где X ось вперед/назад, Y влево/вправо и Z вверх/вниз. Вы можете изменить эти значения напрямую изменив позицию Actor в мире, используя функцию SetLocation() с новым вектором в новой позиции. Вращение поддерживается структурой Angle, которая также состоит из трех компонент, Pitch, Yaw и Roll, где Pitch вращает вверх/вниз, Yaw влево/вправо и Roll вращает будто вы качали головой влево/вправо. Используя SetRotation() вы можете изменить направление в котором обращен Actor или преобразовать вращение в вектор чтобы изменить направление скорости Actor и т.д. Если вы в колледже и хотели бы знать больше о 3D математике, я советовал бы взять немного уроков физики и линейной алгебры с векторы/матрицы как основная тема. Также попытайтесь поискать в онлайне руководства по 3D математике, я знаю здесь http://www.planetquake.com/qdevels есть руководство, также здесь http://www.planetunreal.com/wod. Заключение Хотя, я уверен, что вы вероятно имеете много вопросов, которые выходят далеко за рамки и цели этого документа, но вы можете найти руководства по более специфичному приложению UnrealScript на различных вебсайтах, включая этот http://www.planetunreal.com/chimeric. Также, уверен, что вы будете часто бывать на странице http://unreal.epicgames.com/, так как она содержит самые последние новости от команды разработчиков Unreal и содержит много полезной информации.