Game Dev: "Hello World"

Основы UnrealScript: Учимся на практике
Думаю, не было еще ни одного урока по программированию без программы "Hello World". Ну, у нас программы не будет, так как, по сути, Unreal Script не позволяет создавать полностью самостоятельные программы. Вместо этого мы, как бы, создаем надстройки к одной большой программе (которой, по сути, является основа UDK), а некоторыми такими надстройками можем даже заменять стандартные компоненты большой программы. Впрочем, менять саму программу весьма возможно, правда, для этого вам придется ковыряться в исходниках самого движка, что доступно только тем, кто приобрел лицензию. Но нам и скриптов хватит, как для "Hello World", так и для серьезного преображения игры.

TestActor

Ну что ж, товарищи, наш первый шаг на пути к полноценной игре - создание первого собственного скрипта.
Создайте в Development\Src\TestGame\Classes файл TestActor.uc. Откройте его с помощью ConTEXT и добавьте следующий текст
Class TestActor extends Actor
    placeable;

defaultproperties
{
    Begin Object Class=SpriteComponent Name=Sprite
        Sprite=Texture2D'EditorResources.S_NavP'
    End Object
    Components.Add(Sprite)
}
Немного разъяснений об этом коде. Первая строчка указывает, как называется наш класс, и какое отношение он имеет к другим классам. Запомните, что имя класса всегда должно совпадать с названием скрипта (или наоборот, это как посмотреть). extends Actor значит, что наш класс является дочерним классом от класса Actor. Приставка placeable делает возможным размещение нашего актора в редакторе UDK. Большинство стандартных акторов, например, генераторы частиц, источники света, звука, путевые точки и т.д., вмещают в себя строчку placeable. Блок defaultproperties служит для хранения свойств по умолчанию (что ясно с самого названия), например, значения определенных переменных, или добавление определенных компонент (в нашем случае, спрайта - картинки, которую мы будем всегда видеть на месте объекта, с какой стороны не посмотрим).
Теперь нажмите F9. Откроется черное консольное окошко компилятора. Признаком окончания компиляции можно считать зеленую, красную или желтую строчку. Первое значит, что компиляция прошла успешно, второе - что в вашем коде есть ошибки, не позволяющие последующую компиляцию (там же указываются номера строк, в которых и есть ошибка), третье - что ошибки есть, но на компиляцию они не влияют. В общем, такое окошко
Не стоит переживать, если компиляция идет слишком долго, в первый раз будут компилироваться все файлы, в том числе, стандартные скрипты Эпиков, а не только наш актор.
Теперь запустите редактор (лучше всего, через меню Пуск, там сразу есть необходимые ярлыки). Откройте любую карту. Откройте браузер контента (для тех, кто не знает, картинка)
Теперь сверху перейдите на вторую вкладку, Actor Classes, и увидите все происходящие от Actor классы UDK. По умолчанию классы рассортированы определенным образом, и найти там наш TestActor, весьма трудно. Чтобы это исправить, уберите галочку напротив Show Categories. Теперь вы должны увидеть наш актор в соответствующем по алфавиту месте. Добавьте его на уровень. Это можно сделать двумя методами. Первый - выделите актор, закройте или сверните браузер контента, нажмите где-то на уровне правой кнопкой, и в контекстном меню нажмите Add TestActor Here. Второй - просто перетяните актор с браузера на уровень. Ваш актор должен отобразиться в редакторе.
Обычно мы не видим все акторы в игре, но, в нашем случае, мы не предприняли никаких шагов, чтобы скрыть наш TestActor. Теперь нажмите кнопку запуска игры в окне.
Теперь вы должны увидеть этот актор в игре.
Если же вы создавали актор с другой целью, и вам не нужно, чтобы игрок его видел, то можно без проблем сделать его невидимым. Для этого достаточно изменить блок свойств по умолчанию следующим образом (звездочками выделена новая строчка, увы, форматирование в блоке кода в txt2 не работает)
Begin Object Class=SpriteComponent Name=Sprite
    Sprite=Texture2D'EditorResources.S_NavP'
**HiddenGame=True**
End Object
Components.Add(Sprite)
Важно: так как редактор использует текущую версию скриптов и будет сопротивляться их изменению, всегда закрывайте его перед компиляцией.
Скомпилируйте и запустите уровень опять. Актор исчезнет. Теперь, над блоком defaultproperties добавьте следующую функцию
function PostBeginPlay()
{
    `log("Hello World! ==========");
}
Функция PostBeginPlay() запускается, опять таки, как и указано в названии - сразу же после начала игры. А команда `log, как ни странно, пишет в логе запуска соответственное сообщение. Вместо строчки в скобках можно подставлять переменные. Склеивать между собой различные компоненты можно с помощью знака @. Например, если у нас есть какое-то А=9, то `log("А = " @ A) выведет в лог А = 9.
Опять таки, скомпилируйте код (я могу иногда забывать указывать этот шаг, так что постарайтесь сами не забывать, что после изменений кода его нужно компилировать), запустите уровень, закройте, и откройте лог. Находится он в UDKGame\Logs и называется launch.log. Файлов в папке может быть много, но вам нужен именно конкретный файл, это лог последнего запуска, остальные файлы - логи предыдущих запусков. Теперь, просмотрев текст лога (или, что проще, запустив поиск текста по файлу), мы можем найти результат наших действий.
[0008.05] Log: Game class is 'UTGame'
[0008.24] Log: Primary PhysX scene will be in software.
[0008.24] Log: Creating Primary PhysX Scene.
[0008.26] Log: Bringing World UEDPCTestMap.TheWorld up for
play (0) at 2011.05.19-15.15.52
[0008.28] ScriptLog: Hello World! =========
[0008.28] Log: Bringing up level for play took: 0.193269
Ну вот, цель достигнута. Команда лога очень полезна для решения проблем, не стесняйтесь добавлять несколько лишних строчек в код, чтобы понять, правильно ли он работает.

Комментирование

Этот участок я тоже вставлю в эту подстатью, так как больше он нигде не приживется тематически, и, тем не менее, является обязательным аспектом программирования. Речь идет о комментариях.
Комментарии - текст в вашем коде, который остается обычным текстом, он не влияет на действие самого скрипта. Его очень удобно использовать, чтобы указать для других, или для самого себя, для чего нужна та или иная часть кода, например, для чего нужна определенная функция, или что вы хотите отследить командой лога. Также можно сделать комментарием часть самого кода, если вы не хотите, чтобы она компилировалась, например, чтобы что-то проверить.
Сам синтаксис комментария. Двойной слэш указывает, что вы хотите закомментировать все, что идет в строчке после него.
//Вся эта строчка является комментарием
НашКод(); //Это комментарий в конце строки
4+5; //+6; С целью что-то проверить, мы закомментировали "+6;"
Второй метод - слеш со звездочкой. Используется для комментирования целых блоков кода
/* Закомментированная строчка
Тоже закомментированная строчка
Символы в обратном порядке используются для окончания комментирования */
Подмечу, что второй тип комментирования не может использоваться внутри закомментированного блока.
/* Комментарий
//Подобное комментирование нормально работает
Конец блока комментирования */
А вот так делать нельзя
/* Комментарий
/* Подобный комментарий внутри другого комментария не будет работать*/
Конец блока комментирования */
Если кто-то спросит, кто же будет помещать комментарий внутрь комментария, ответ весьма прост. Припустим, у вас есть блок кода, с комментариями в качестве объяснения, и вам необходимо полностью его закомментировать. В таком случае, комментариев внутри блока комментария не избежать. Поэтому, для незначительных по размеру комментариев я рекомендую использовать двойной слэш, а слэш со звездочкой оставить большим блокам кода.

Итог

В общем, это все. Мы научились создавать собственные скрипты, написали своеобразный "Hello World" и научились делать комментарии. Я не углублялся в подробности, обо всем этом будет более детально рассказано в следующих подстатьях. А так, не этом все. Пишите отзывы и комментарии, а также сообщайте о любых возникнувших проблемах.

Просмотров: 513

Комментарии пока отсутcтвуют