Developing Thifeo. Частина 1

Developing ThifeoВітаю всіх читачів Enetri і одразу перепрошую за таку затримку з виходом першої частини, все було пов'язано з форс-мажорними обставинами. В зв'язку з цим перша частина вийде не такою як я планував. Писати все я буду прямо по ходу роботи, хоча планував пройтись повторно по тому, що вже було зроблено. В кінцевому результаті першої частини ми маємо отримати:
1) Налаштовану sidescroller камеру, яка працює на будь-якому рівні
2) Базові sidescroller елементи (стрибки, керування)
3) Інші твіки, про які розкажу по ходу роботи.

Попередні частини:
Вступ (Частина 0)

Почнемо з sidescroller камери. Існує 2-і можливих реалізації - на UnrealScript та на Kismet (візуальний скриптинг). Другий спосіб звичайно значно легший, але після тестування цього способу виявилось, що кількість недоліків цього способу значно більша ніж одна його перевага у швидкості інтеграції. З суттєвих недоліків можна відзначити:
- При бігу назад, персонаж не розвертається, а біжить спиною.
- Kismet працює лише для одного рівня, і для активації його на інших рівнях потрібно повторювати всю процедуру знову.
- Коллайдинг камери з об'єктами на передньому плані.
Переваги:
+ Не потрібно лізти в конфіги (майже)
+ Не потрібно чіпати UnrealScript

Оскільки вищевказані недоліки влаштовують серйозний головний біль, будемо використовувати UnrealScript.
Будь який софт, як правило, потрібно конфігурувати і UDK не виключення.
Конфіги це одна з багатьох головних болей UDK. Проблема полягає в тому що їх там 17 (sick!) штук і в багатьох з них опції дублюються (причому при зміні "чогось не того", падає все). Після багатогодинних пошуків в інтернеті знайшлася відповідь на питання з конфігами.
Знімаємо Read Only з усіх конфігів в папці \UDK-2010-09\UDKGame\Config
В DefaultEngine.ini:
Секція [UnrealEd.EditorEngine], додаємо після усіх інших лінійок:
+EditPackages=Thifeo

Далі DefaultGame.ini
В [Engine.GameInfo]
Замінюємо
DefaultGame=UTGame.UTDeathmatch на DefaultGame=Thifeo.ThifeoGameInfo
PlayerControllerClassName=UTGame.UTPlayerController на PlayerControllerClassName=Thifeo.ThifeoPlayerController
і додаємо
+DefaultMapPrefixes= (Prefix="TG",bUsesCommonPackage=FALSE,GameType="Thifeo.ThifeoGameInfo")
після відповідних записів.
Видаляємо конфіги, назви яких починаються з UDK (Default не чіпаємо).

Тепер в папці \UDK-2010-09\Development\Src\ створюємо папку Thifeo, а в ній підпапку Classes.
Розпаковуємо в неї склад цього архіва (в ньому знаходяться 3 dummy класи потрібні для нормального старту UDK, знайдені на просторах інтернету і адаптовані для того щоб пересвідчитись, що "все працює").
Full Recompile Screen
Запускаємо UnrealFrontend і робимо Full Recompile. Якщо все правильно - отримуємо в результаті:
[COMMANDLET 'UDK.exe make -full' SUCCEEDED]
Запускаємо UDK.
Створюємо площину, додаємо світло, ребілдимо все. В опціях View -> World Properties -> World info в дропдауні Game type for PIE вибираємо ThifeoGameInfo і робимо Play from here.
В результаті маємо отримати щось таке:

Додаємо на рівень Add Actor -> PlayerStart і зберігаємо рівень під іменем TG-Test. TG - префікс, який ми прописали в конфігах, він вказує двигуну на те що для даного рівня потрібно використовувати ThifeoGameInfo оскільки Game type for PIE вказує Game Info тільки для редактора, а префікс - для самого двигуна. Редактор можна закривати.
Конфігурацію можна вважати завершеною. Тепер можна перейти до самої камери.

Модифікуємо PlayerController і Pawn класи для досягнення відповідного ефекту (як я і казав в 0-ій частині, copy-pase magic тут працювати не буде). Для обробки пересування в використовуємо функцію ProcessMove, і блокуємо пересування по осях Y і Z:
Pawn.Acceleration.X = -1 * PlayerInput.aStrafe * DeltaTime * 100 * PlayerInput.MoveForwardSpeed;
Pawn.Acceleration.Y = 0;
Рawn.Acceleration.Z = 0;
І розвертаємо персонажа відповідно до напрямку руху (натиснутої клавіші) (перший недолік Kismet реалізації усунуто)
if(Normal(Pawn.Acceleration) Dot Vect(1,0,0) > 0)
{
tempRot.Yaw = 0;
Pawn.SetRotation(tempRot);
}
else if(Normal(Pawn.Acceleration) Dot Vect(1,0,0) < 0)
{
tempRot.Yaw = 32768;
Pawn.SetRotation(tempRot);
}
В Pawn класі пересвідчуємось, що при старті нашого рівня камера буде на правильному місці за допомогою GetBaseAimRotation(). Налаштовуємо базові параметри камери за допомогою CalcCamera і твікаємо значення на приблизно такі:
out_CamLoc.Y = -300;
out_CamLoc.Z = Location.Z + 200;
out_CamLoc.X = Location.X + -200;

out_CamRot.Pitch = -5000;
out_CamRot.Yaw = 16384;
out_CamRot.Roll = 0;
Зберігаємо все і робимо Make в фронтенді.
Запускаємо UDK, завантажуємо наш збережений рівень і жмакаємо Play in Editor.
В результаті маємо отримати цілком робочу sidescroller камеру:


Тепер до твіків.

Встановлюємо KillZ. View -> World Properties -> Zone info. KillZ -> -2000

Вимикаємо інтерфейс через Kismet, оскільки для Thifeo він нам не буде потрібен (все вбиває від 1 торкання).
В defaultproperties ThifeoPawn.uc додаємо
JumpZ=500.0 - це збільшить висоту стрибка MaxMultiJump=0 - це заборонить подвійний стрибок (гравці в Unreal Tournament знають, що воно таке) і GroundSpeed=300.0 - це зменшить базову швидкість пересування (якщо користуватись стандартною то відстань стрибка виходить надто велика).

В результаті усього цього маємо отримати:


На цьому першу частину Developing Thifeo я вважаю завершеною. До наступної частини я підкручу свої знання в редакторі землі (terrain editor), розповім про SpeedTree, почну працювати над першим рівнем ну і можливо ще дещо (сам ще не вирішив :) ). Коментарі та побажання залишаємо в коментарях. Як завжди вибачаюсь за можливі помилки.

На останок хочу запитати про доцільність створення окремого (від enetri) блогу по даній темі? Варто? Чи все таки варто продовжувати постити на Enetri?

доповнення:

До речі я думаю, що кроспостинг на хабр був би вдалою ідеєю, але займатись перекладом в мене немає часу.

коментарі:

fedikw 10.10.2010 16:25
продовжуйте тут, так буде зручніше читати
UaHummer 10.10.2010 17:46
цікаво...ото б ще зображення клікабельні і було б супер )))
+1deleted 10.10.2010 18:00
Врахую при написанні другої частини. Просто моя система завантаження зображень не передбачає рескейлингу. Можливо до наступної частини допиляю аплоад зображень.
+1deleted 28.10.2010 13:34

додати коментар: