• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Урок по SpellEditor от UnionSpacer

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
И так, раз уж сделал полноценный редактор частиц на движке готики, и параллельно редактор VisualFx, На днях тут выложу урок по созданию интересного(или не очень) заклинания с нуля.

Начнем с создания нового эффекта частиц.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Ледяной взрыв. Суть заклинания, игрок кастует заклинание, которое летит по рандомной траектории, и при попадании в цель, взрывается нанося урон всем кто стоит поблизости.

Используемые плагины :
zSpells -Простой конструктор заклинаний.
zParserExtender - Расширитель возможности скриптов. (последний парсер екстендер встроен в плагин zSpells)

Используемые инструменты - Union Spacer

И так, начнем с того что запустим Spacer, в режиме редактирования частиц:
Для этого запускаем редактор, и в меню File - > Start Pfx Editor, загрузится тестовый мир и появится окно PFX Editar, для удобства работы те у кого маленький монитор, нажмите TAB что бы скрыть лишние окна.
1604440352320.png

Вот так должно выглядеть окно, для навигации по миру нажмите F3.

В мире есть 2 воба, которые выглядят как руны, в центре пентограмы статичный, и по кругу летает динамический воб.
Stat - перемещает визуал на статичный воб.
Dyn - перемещает визуал на динамичный воб.


Далее создадим эффект инициализации заклинания( когда заклинание берется в руку ).
В окне свойств, вводим имя MFX_ICEBOMB_INIT, это и будет имя нашей новой инстанции эффекта.
Далее жмем кнопку Create instance, и затем Save Script, в папке _work/data/scripts/system/pfx/ появится файл MFX_ICEBOMB_INIT.d

В данной версии редактора, нет возможности сразу перекомпилировать скрипт с инстанциями эффектов, по этому под каждую инстанцию создается файл куда записываются все данные, после завершения настройки, необходимо добавить этот файл в ParticleFX.src, и пересобрать скрипты


Подробно раписывать процесс создания эффекта, и какие поля за что отвечают не стану, т.к. есть полноценное описание всех полей класса C_PARTICLEFX тут Эффекты частиц - ZenGin справочник - Gothic Library


1604443528653.png1604443577817.png
Вот настройки стартового эффекта, сохраняеми идем далее.


А вот как эффект наш выглядит:
1604443752089.png

Теперь приступим к эффекту для заклинания в полете. Назовем его MFX_ICEBOMB_CAST, так же как и выше просто предоставлю скрин настроек эффекта.
1604444308955.png

Получился пульсирующий снежный ком, вроде нормально, кому интересно может под себя в принципе все эффекты настроить, файлы будут приложены к "уроку".

1604444400216.png

Вот такой эффект каста получился, в процессе полета эффект "пульсирует".

Ну и теперь настроим финальную часть эффекта, а именно сам "Взрыв" бомбы.
Назовем эффект MFX_ICEBOMB_SPREAD.

1604445273829.png1604445331630.png1604445389178.png

Вот свойства, а ниже результат, немного топорно конечно, но в принципе пойдет, можно настроить под себя как красивше.
1604445421972.png

В архиве скрипты эффекта, и используемые текстурки.
 

Вложения

  • IceBomb_files.7z
    172,8 KB · Просмотры: 10
Последнее редактирование:

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Теперь приступим к настройке VisualFx, запускаем Union Spacer, во вкладке File выбираем пункт Start Spell editor, загрузится все тот же тестовый ми что и в случае редактора частиц, только уже с двумя нпс. Зачем нпс? Для удобства настройки эффекта , учитывая что в случае VFX, эффект может испускаться из опредленных костей, для того они и нужны, объяснил.

info: Нпс появятся только после того как мы создадим \ откроем эффект.

1604486480142.png


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

После того как ввели имя эффекта, нажимаем кнопку New or load from string (создать новый эффект, или загрузить по имени).

В мире появится 2 нпс, тот что ближе к нам, это нпс Кастующий,тот что дальше -Цель, в него и будут лететь все наши прелести.

Теперь приступим к настройке эффекта, тут в отличии от предыдущей части будет подробно расписано каждое поле которое мы будем заполнять.

visName_S - имя визуала нашего эффекта, сюда пропишем MFX_ICEBOMB_INIT, т.е. эффект инициализации заклинания.
emTrjMode_S - задает траекторию эффекту, в нашем случае поскольку это инициализация, сюда пишем FIXED , то есть эффект привязан к кости.
emTrjOriginNode_S - тут указывается кость источник эффекта, в нашем случае поскольку в готике все заклинания кастуются из правой руки, пропишем ZS_RIGHTHAND.


На этом собственно первый этап настройки эффекта завершен, ниже скрин окна свойств.
1604487152752.png

Главная фишка редактора VisualFx в том, что он автоматически находит все инстанции эффектов в игре, и при сохранении дописывает\изменяет нужные строки в файле VisualFxInst.d и перекомпилирует скрипты VisualFx.dat после каждого сохранения.


Далее нажимаем кнопку Save, и повторно New or Load from string, затем нажимаем кнопку Play\Update, в правой руке кастера появится эффект инициализации, но вот проблема, на этапе создания PFX, я немного ошибся с размером эффекта, и он получился очень маленьким, это нужно исправить.
1604487267193.png


Что бы это исправить, нужно переопределить параметры PFX эмиттера, для этого идем в правое окно свойств(Emitter Key)
И жмем кнопку INIT, вылезет окно подтверждения создания нового ключа
1604487694576.png


Соглашаемся, и окно свойств поменяет имя на имя только что созданного нами ключа.

Затем что бы сделать наш эффект по крупнее, переопределим некоторые параметры излучателя:

Во первых, удалим все лишние параметры которые система скопировала с базового эффекта
1604487914938.png


Что бы окно приняло вот такой вид.

Теперь собственно переопределим количество частиц в секунду, и размер визуала.

visSizeScale - задает размер визуала в готических попугаях, поставим 3
pfx_ppsValue - задает количество частиц в секунду, поставим 50
Далее жмем сохранить, и затем перезагружаем эффект (Load from string -> play)
1604488140006.png


Вот теперь визуал нормального размера, с задачей справились. Далее нужно настроить сосбственно сам эффект летящего снаряда.

ВАЖНО! Перед созданием ключей , CAST, COLLIDE, INVEST , необходимо предварительно остановить эффект нажав кнопку Load From string или же Load From Script (предварительно выбрав нужный эффект из списку справа внизу, в противном случае редактор может зависнуть, или создать неправильный ключ, или не сохранить его.


Load from string, далее жмем кнопку CAST, соглашаемся с созданием ключа, и снова очищаем окно от мусора, чтоб было так:
1604488841983.png


Теперь заполним необходимые поля:

pfx_ppsisloopingchg - TRUE указывает эффекту, что на этом ключе он должен прекратится, в противном случае после каждого каста в руке будет оставаться эффект INIT.

sfxid - MFX_Icelance_Cast имя инстанции звукового эффекта, возьмем из стандартных, звук ледяного копья.
sfxisambient - TRUE указывает эффекту, что звук относится к окружению, и может быть выключен в настройках игры.

Жмем кнопку сохранить, и перезагружаем эффект, жмем Play, и ключ CAST, будет проигран звук, и удален эффект из руки кастера.
1604489264736.png
 
Последнее редактирование:

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Теперь настроим новый эффект, собственно сам летящий снаряд. В поле ввода вводим название инстанции Spellfx_IceBlast_Fly. И жмем кнопку New or Load, и настраиваем как показано ниже:

visname_s - MFX_ICEBOMB_CAST - Имя визуала, ставим наш визуал созданный ранее
vissize_s -2 - поскольку как и в случае INIT, у нас немного не те размеры, задаем х2

emtrjmode_s - TARGET RANDOM SPLINE -
А вот тут происходит самое интересное, ранее мы сюда писали FIXED, поскольку эффект у нас должен был быть в руке, то сейчас мы задаем 3 новых параметра :
TARGET - указывает что траектория строится в цель

RANDOM - рандомизирует траекторию, работает только в связке со SPLINE\LINE
SPLINE - говорит что траектория строится из сплайна, то есть эффект летит по линии с плавными изгибами.
emtrjoriginnode - ZS_RIGHTHAND - Эффект будет излучатся из правой руки
emtrjtargetnode - BIP01 HEAD - этот параметр указывает куда конкретно будет лететь эффект, если целью является нпс, в нашем случае прямо в голову
emtrjtargetrange - 5 - этот параметр задает какое расстояние пролетит эффект, если нет цели. оставим по умолчанию 5 метров
emtrjnumkeys - 2 - количество ключей траектории, а конкретно количество ключей нашего сплайна, минимум 2
emtrjnumkeysvar - 1 - этот параметр задает дополнительное количество рандомных ключей, то есть, если мы укажем 1, то в результате от каста к касту, количество ключей будет от 2 до 3
emtrjangleheadvar - 30 задает разброс рысканья, в нашем случае 30 гото попугаев. ( по сути насколько сильно будет изгибатся траектория по горизонтали)
emtrjeasevel - 1300 - задает скорость полета эффекта в цель, поставим 1300 (стандартное значение для большей части заклинаний в готике)
emtrjdynupdatedelay - 1000 - Интервал обновления траектории, поставим 1000 секунд, что бы траектория обновлялась только при каждом новом касте.
emTrjLoopMode_S - RESTART Это нужно чисто для отладки траектории, говорит что бы эффект по достижению цели проигрывался заново.

Сохраняем эффект, и в окне ключей жмем кнопку drawTrj - показывает траекторию полета, что бы было нагляднее.
1604490884720.png


Вот что у нас вышло, для обновления траектории жмем кнопку Play, и траектория изменится.

И тут опять та же проблема что была ранее, а именно очень "худой" эффект, создаем ключ INIT что бы это исправить. Настройки приведены ниже:

vissizescale - 5 - делаем размер визуала в 5 раз больше положеного

pfx_ppsvalue - 1500 - переопределяем количество частиц в секунду до 1500
pfx_shpdim_s - 3 - переопределяем размер излучающей области до 3
pfx_shpisvolumechg - 1 - говорим эффекту что объем должен менятся.

Жмем сохранить, перезагружаем эффект, и жмем Play, смотрим что получилось.
1604491428417.png



Вот теперь эффект уже похож на что то внушительное и не очень внятное, на этом пока остановимся =)
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Daedalus:
//+++++++++++++++++++++++++++++++
//SPELLFX_ICEBLAST
//+++++++++++++++++++++++++++++++

INSTANCE SPELLFX_ICEBLAST (CFX_BASE)
{
     visname_s = "MFX_ICEBOMB_INIT";
     visalpha = 1;
     visalphablendfunc_s = "ADD";
     emtrjmode_s = "FIXED";
     emtrjoriginnode = "ZS_RIGHTHAND";
     emtrjtargetrange = 20;
     emtrjnumkeys = 1;
     emtrjdynupdatedelay = 0.100000001;
     emfxlifespan = -1;
     secsperdamage = -1;
};

INSTANCE SPELLFX_ICEBLAST_KEY_INIT (C_PARTICLEFXEMITKEY)
{
     vissizescale = 3;
     scaleduration = 1;
     pfx_ppsvalue = 50;
     pfx_sctime = 1;
     pfx_shpisvolumechg = 1;
};

INSTANCE SPELLFX_ICEBLAST_KEY_CAST (C_PARTICLEFXEMITKEY)
{
     scaleduration = 1;
     pfx_ppsisloopingchg = 1;
     pfx_shpisvolumechg = 1;
     sfxid = "MFX_Icelance_Cast";
     sfxisambient = 1;
};

//+++++++++++++++++++++++++++++++
//SPELLFX_ICEBLAST_FLY
//+++++++++++++++++++++++++++++++

INSTANCE SPELLFX_ICEBLAST_FLY (CFX_BASE)
{
     visname_s = "MFX_ICEBOMB_CAST";
     vissize_s = "2";
     visalpha = 1;
     visalphablendfunc_s = "ADD";
     emtrjmode_s = "TARGET RANDOM SPLINE";
     emtrjoriginnode = "ZS_RIGHTHAND";
     emtrjtargetnode = "BIP01 HEAD";
     emtrjtargetrange = 5;
     emtrjnumkeys = 2;
     emtrjnumkeysvar = 1;
     emtrjangleheadvar = 30;
     emtrjloopmode_s = "RESTART";
     emtrjeasevel = 1300;
     emtrjdynupdatedelay = 1000;
     emfxlifespan = -1;
     secsperdamage = -1;
};

INSTANCE SPELLFX_ICEBLAST_FLY_KEY_INIT (C_PARTICLEFXEMITKEY)
{
     vissizescale = 5;
     scaleduration = 1;
     pfx_ppsvalue = 1500;
     pfx_shpdim_s = "3";
     pfx_shpisvolumechg = 1;
     emtrjeasevel = 1300;
};

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

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
674
Благодарности
655
Баллы
245
Сделал хорошую вещь. *thumbs up*
Привет всем оставшимся :)
Хочу дописать инфу по классам на GL.
Теперь просьба к знающим визуальные эффекты.
В скрипте представлено описание класса и его свойства.
Некоторые элементы не разобраны. Если вы знаете, за что они отвечают - дополните пожалуйста :)
Если я где-то ошибся - поправьте :)

Daedalus:
class CFX_BASE
    {
        // --- Визуализация --- //
        
        var string         visName_s;                    // Визуализация эффекта: PFX, TGA, 3DS, EQK, SCX, MDS, TRL, LTN, FOV, MMS, SLW   
                                                        // PFX - Particle Effects
                                                        // TGA - Game Texure
                                                        // 3DS - Game Static Models
                                                        // EQK - Special Effects Shaking Camera
                                                        // SCX - Screenblend Special Effects
                                                        // MDS - Dynamic Animation Models
                                                        // TRL - В игре не найдены. След от движения оружия.
                                                        // LTN - В игре не найдены.
                                                        // FOV - Special Effects Field of View
                                                        // MMS - Morph Amimation Models
                                                        // SLW - Special Effects Slow Motion
        
        var string         visSize_s;                    // Размер 2D визуализации, т.е. текстур
                                                        // Example "22 22"
        
        var float         visAlpha;                    // Прозрачность альфа-канала от 0.0 до 1.0
        
        var string         visAlphaBlendFunc_s;        // Метод просчета альфа-канала:
                                                    // MAT_DEFAULT - Альфа-канал материала
                                                    // NONE - Не использовать альфа-канал
                                                    // BLEND - Смешивание
                                                    // ADD - Добавление
                                                    // SUB - Вычитание
                                                    // MUL - Умножение
                                                    // MUL2 - Умножение №2
                                                
        var float         visTexAniFPS;                // Скорость проигрывания анимации материала (FPS) для визуализации типа: TGA, 3DS, MDS, TRL, LTN, MMS
        var int         visTexAniIsLooping;            // Цикличность проигрывания анимации материала: 0 - 1 раз, 1 - Циклично. Используется для объектов: TGA, 3DS, MDS, TRL, LTN, MMS
        
        // --- Траектория --- //
        
        var string         emTrjMode_s;                // Траектория эммитера визуального эффекта: FIXED, TARGET, LINE, SPLINE, RANDOM, FOLLOW, MISSILE
                                                        // FIXED - Эммитер привязан к кости
                                                        // TARGET - Траектория эммитера направлена в сторону определенной цели
                                                        // LINE - Траектория строится по прямой.
                                                        // SPLINE - Траектория строится по сплайну, т.е. по линии с плавными изгибами.
                                                        // RANDOM - Раномизирование траектории. Работает в связке с SPLINE/LINE
                                                        // FOLLOW - Эмиттер следует за PC/Npc
                                                        // MISSILE -
                                                    
        var string         emTrjOriginNode;            // Узел скелета, который является источником эффекта. Обычно слот правой руки ZS_RIGHTHAND.
        var string         emTrjTargetNode;            // Узел скелета в который будет направлен эмиттер эффекта.
        var float         emTrjTargetRange;            // Максимальное расстояние полета эмиттера эффекта, если нет цели.
        var float         emTrjTargetAzi;                // Максимальный азимут отклонения от цели.
        var float         emTrjTargetElev;            // Максимальный тангаж отклонения от цели.
        var int         emTrjNumKeys;                // Количество ключей траектории эмиттера при перемещении по сплайну/прямой. Миниум 2.
        var int         emTrjNumKeysVar;            // Случайные ключи траектории эмиттера. От случая к случаю может добавлять дополнительные ключи траектории.
        var float        emTrjAngleElevVar;            // Случайный угол азимута отклонения траектории.
        var float         emTrjAngleHeadVar;            // Величина изгиба траектории по горизонтали.
        var float         emTrjKeyDistVar;            // Случайное расстояние между ключами траектории.
        
        var string         emTrjLoopMode_s;            // Режим циклического перемещения по траектории.
                                                        // RESTART - Бесконечное повторение
                                                        // PINGPONG_ONCE - Туда-обратно один раз.
                                                        // PINGPONG - Туда-обратно.
                                                        // HALT - Эммитор остается в целевом объекте.
                                                    
        var string         emTrjEaseFunc_s;            //
                                                        // LINEAR - Линейная
                                                        // SINE - Синусоидальная
                                                        // EXP - Экспонентная
                                                    
        var float         emTrjEaseVel;                // Скорость перемещения эмиттера к цели.
        var float         emTrjDynUpdateDelay;        // Интервал динамического обновления траектории.
        var int         emTrjDynUpdateTargetOnly;    // Динамическое обнавление траектории только для цели
        
        // --- Дочерние эффекты --- //
        
        var string         emFXCreate_s;                // Инстанция создаваемого дочернего эффекта.
        var string         emFXInvestOrigin_s;            // Инстанция эффекта запускаемого при инвестировании маны для кастующего.
        var string         emFXInvestTarget_s;            // Инстанция эффекта запускаемого при инвестировании маны для цели.
        var float         emFXTriggerDelay;            // Задержка перед запуском триггера. Используется в специальных эффектах EQK, SCX, FOV.
        var int         emFXCreateDownTrj;            // Будут ли для дочерних эффектов использоваться собственные траектории.
        
        var string         emActionCollDyn_s;            // Действие при столкновении с динамическим объектом
                                                        // BOUNCE -
                                                        // CREATEONCE -
                                                        // CREATE -
                                                        // COLLIDE -
                                                        // NORESP - Закомментирован в коде движка
                                                        
        var string         emActionCollStat_s;            // Действие при столкновении со статическим объектом
                                                        // BOUNCE -
                                                        // CREATE -
                                                        // COLLIDE -
                                                        // CREATEQUAD -
                                                        // NORESP - Закомментарирован в коде движка
                                                        
        var string         emFXCollStat_s;                // Имя инстанции эффекта проигрываемого при столкновении со статическим объектом.
        var string         emFXCollDyn_s;                // Имя инстанции эффекта проигрываемого при столкновении с динамическим объектом.
        var string         emFXCollDynPerc_s;            // Запуск визуального эффекта при столкновении с динамическим объектом и отправка восприятия магии с помощью свойства sendAssessMagic.
        
        var string         emFXCollStatAlign_s;        // Выравнивание эффекта при столкновении со статическим объектом
                                                        // TRAJECTORY - По траектории
                                                        // COLLISIONNORMAL - По нормали объекта столкновения
                                                        
        var string         emFXCollDynAlign_s;            // Выравнивание эффекта при столкновении с динамическим объектом
                                                        // TRAJECTORY - По траектории
                                                        // COLLISIONNORMAL - По нормали объекта столкновения
                                                        
        var float         emFXLifeSpan;                // Продолжительность жизни эффекта эммитера
        var int         emCheckCollision;            // Проверять ли коллизию
                                                        // 0 - Не проверять коллизию
                                                        // 1 - Проверять коллизию и наносить урон
                                                        // 2 - Проверять коллизию, но не наносить урон
                                                        
        var int         emAdjustShpToOrigin;        // Подогнать форму под кастующего. Если в качестве визуального эффекта используется PFX со свойством shptype_s = "mesh"
                                                    // но без инициализации, а свойство emAdjustShpToOrigin установлено в True, то
                                                    // система oCVisualFX сама начинает управлять визуализацией моделью PFX придавая
                                                    // правильную форму.
                                                    
        var float         emInvestNextKeyDuration;    // Время, через которое можно произвести следующее инвестирование маны
        var float         emFlyGravity;                // Действие гравитации. Отрицательные значения притягивают к земле. Положительные уводят в небо.
        var string         emSelfRotVel_s;                // Скорость вращения эмитера по осям ZYX.
        var string         userString[5];                // Дополнительные строки настроек в зависимости от типа объекта визуализации.
        
                                                        // Для SCX эффектов
                                                            // userString[0] - Длительность цикла эффекта ScreenBlend
                                                            // userString[1] - Цвет эффекта ScreenBlend
                                                            // userString[2] - Длительность входа и выхода из эффекта ScreenBlend
                                                            // userString[3] - Текстура эффекта ScreenBlend
                                                            // userString[4] - FPX анимированных текстур
                                                            
                                                        // Для FOV эффектов
                                                            // userString[0] - Масштабирование амплитуды морфинга FOV
                                                            // userString[1] - Масштабирование скорости морфинга FOV
                                                            // userString[2] - Базовый FOV по x
                                                            // userString[3] - Базовый FOV по y
                                                            
                                                        // Для SLV эффектов
                                                            // userString[0] - Масштабирование мирового времени
                                                            // userString[1] - Масштабирование времени PC
                                                            
                                                        // Для EQK эффектов
                                                            // userString[0] - Радиус эффекта трясения камеры
                                                            // userString[1] - Время в секундах
                                                            // userString[2] - Амплитуда трясения
                                                            
                                                        // Для эффектов со свойством emActionCollStat_s установленным в значении CREATEQUAD
                                                            // userString[0] - Текстура
                                                            // userString[1] - Размер текстуры
                                                            // userString[2] - Режим просчета альфа канала                                                           
        
        var string         lightPresetName;            // Шаблон источника света из файла data/Presets/LightPresets.zen
        var string         sfxID;                        // Имя инстанции звукового эффекта
        var int         sfxIsAmbient;                // Указывает эффекту, что звук относится к окружению, и может быть выключен в настройках игры.
        var int         sendAssessMagic;            // Эффект посылает восприятие B_AssessMagic.
        var float         secsPerDamage;                // Время в течении которого будет наносится урон от магии.
    };
 
Сверху Снизу