Далее описывается пример
создания u-файла "с нуля", содержащего несколько условно новых декораций
для игры Clive Barker’s Undying.
Это будут плоские квадратные листы с натянутыми на них текстурами листьев водяных
лилий с цветами и без. В файле присутствуют 2 новых класса и некоторое
количество картинок. Как сделать картинки здесь не рассматривается. Для примера
я использовал картинку из Unreal.
1. В корне диска С:\ создаём папку с именем UndyingScripts.
2. Внутри создаём папку DecoSheets,
а внутри неё – папки Classes и Textures.
ПРИМЕЧАНИЕ: Если вы хотите использовать в скрипте существующий текстурный пакадж, то вы должны положить его в папку DecoSheets.
Синтаксис будет такой #exec OBJ LOAD FILE=[имя нужного пакаджа].utx PACKAGE=[имя нужного пакаджа]
3. Внутрь папки Classes кладём (или создаём с нуля) файлы скриптов с расширением .uc (в нашем примере два файла DecoSheets.uc и LilySheet.uc). Внутрь папки Textures кладём файлы картинок в формате pcx (или bmp). Картинки должны иметь палитру 256 цветов и размер не более 512х512 пикселей.
4. Текст скрипта DecoSheets.uc приведён ниже:
//======================================================================
// DecoSheets. Root
class to all sheet decorations.
//======================================================================
class DecoSheets expands Decoration
abstract;
#exec TEXTURE IMPORT NAME=lilys
FILE=Textures\lilys.pcx PACKAGE=DecoSheets FLAGS=2
#exec TEXTURE IMPORT NAME=lilys2
FILE=Textures\lilys2.pcx PACKAGE=DecoSheets FLAGS=2
defaultproperties
{
DrawType=DT_MESH
Style=STY_Masked
bMRM=False
ShadowImportance=0
ShadowRange=0
}
По аналогии с Unreal мы описываем корневой класс для всех новых декораций, чтобы группа смотрелась обособленно среди «родных» декораций Undying. Комментарии определяются двойным прямым слэшем //
С помощью команд #exec TEXTURE IMPORT импортируем две новые текстуры из папки UndyingScripts\Textures.
STY_Masked задаёт декорациям прозрачность для чёрного и белого цветов.
bMRM=False отключает поддержку Multi-resolution Mesh. Эта фича «движка» игры нужна для поддержки теней. Мне тени не нужны, поэтому ниже также указывается ShadowImportance=0 (тень для актора не важна).
Подразумевается, что внутри корневого класса будет целая пачка новых декораций. Для примера хватит и одной. Текст её скрипта приведён ниже:
//======================================================================
// LilypadSheet.
//======================================================================
class LilySheet expands DecoSheets;
var() texture NewSkin; // Текстура новой «шкурки»
function PreBeginPlay()
{
Super.PreBeginPlay();
// Изменим «шкурку»
if (NewSkin != none)
{
SetTexture( 1, NewSkin );
}
}
defaultproperties
{
MESH=SkelMesh'Aeons.Meshes.BloodScryePrints_m'
Drawscale=0.500000
NewSkin=Texture'Decosheets.lilys'
}
Что мы видим?
Переменная var() texture NewSkin позволит в редакторе назначить актору произвольную текстуру, которая станет новой «шкуркой». Но вы её в редакторе не увидите! Далее – пояснение почему так.
Функция PreBeginPlay() позволит применить эту произвольную текстуру перед тем, как игрок возникнет на карте. SetTexture( 1, NewSkin ) указывает конкретный слот (из трёх возможных), в котором будет размещена эта текстура.
В качестве скелетной модели используется существующая в игре BloodScryePrints_m.
Почему всё так сложно? В отличие от Unreal модернизированный «движок» Undying работает с моделями в формате NGF, на которые «шкурки» уже натянуты прямо при сборке моделей. Другого пути поменять «шкурки» не существует! По этой же причине невозможно внедрение моделей других форматов (PSK, 3D).
5. Нужно открыть в Блокноте файл System.ini и внести правки в две секции (добавленные нужные строки выделены жирным шрифтом):
[URL]
Protocol=unreal
ProtocolDescription=Unreal Protocol
Name=Player
{cut}
Class=Aeons.Patrick
SourceDir=\DWIUnreal
SourceDir=C:\UndyingScripts
Чтобы во время последующей компиляции всё было правильно, создаваемый класс должен быть определён и должен идти последним.
{cut}
C_ZoneWire=(R=0,G=0,B=0,A=0)
EditPackages=Core
EditPackages=Engine
EditPackages=Editor
EditPackages=UWindow
EditPackages=Fire
EditPackages=IpDrv
EditPackages=UWeb
EditPackages=UBrowser
EditPackages=UMenu
EditPackages=IpServer
EditPackages=Aeons
EditPackages=Cutscenes
EditPackages=UndyingShellPC
EditPackages=DecoSheets
[Engine.GameInfo]
bLowGore=False
{cut}
6. Затем, находясь в папке \System, выполняем в командной строке Windows (но лучше пользоваться файловым менеджером с поддержкой командной строки - нагляднее):
ucc make
Запускается Unreal Code Compiler и последовательно проверяет существующие в директории \System u-файлы, при этом имея в виду дополнительный путь C:\UndyingScripts. Т.е. он по порядку, указанному в файле System.ini, пропустит существующие u-файлы, а дойдя до строки,
EditPackages=DecoSheets
начнёт компиляцию.
Если всё завершится удачно, вы увидите такую картинку (рис.1), а в папке \System появится файл DecoSheets.u.
7. Открыв редактор UndED (в моём примере это версия 2), вы получите доступ к новому классу декораций в Actor Class Browser (рис.2).
Ещё раз подчеркну, что разместив на карте новую декорацию LilySheet и назначив ей новую текстуру, вы не увидите изменений в редакторе. Изменения будут видны только при нормальном старте карты. Более того, нельзя создать ДВЕ декорации LilySheet с РАЗНЫМИ новыми текстурами! На каждой карте можно разместить сколько угодно LilySheet с ОДНОЙ и ТОЙ ЖЕ текстурой, и никак иначе. Именно поэтому задуман целый пак однотипных декораций, использующих разные NGF-модели, чтобы применять РАЗНЫЕ текстуры. К сожалению, в ресурсах игры я нашёл только две однотипные NGF-модели.
Может быть, вы сможете больше, чем я?
Рис. 1
Рис. 2