Sunday, April 14, 2013

Подгружаем уровни (level streaming)



    Очевидно, что игры частенько состоят из нескольких больших или не очень, уровней. По задумки создателя или иным причинам, порой бывает необходимо создать несколько игровых уровней, которые должны будут подгружаться лишь по надобности. Такая возможность имеется и в UDK и реализуется довольно просто.

    Часто получается так, что требуется загрузить огроменную локацию, которая будет претендовать на приличный кусок ресурсов компьютера. Если позволяет дизайн, в такие моменты очень удобно использовать подгружаемые уровни. Т.е. вся локация будет разбита на куски - игрок находится только в определенной части карты, а в нужным момент подгружается необходимая часть, в то время как  уже не нужная - выгружается. Если все сделано аккуратно(а кто ж сомневается в обратном?), для игрока это практически не заметно, а разработчикам и компьютеру проще работается.


    На самом деле можно просто загрузить другой уровень с помощью kismet, но на это уходит побольше времени(если уровень велик) и в случаях, когда приходится часто скакать с одного уровня на другой, долгая загрузка будет раздражать игрока(и не только его). 








    На всякий случай расскажу, как можно загрузить уровень из другого уровня.

    Создав простейший уровень, ставим на него, для примера, триггер (при касании триггера будет загружаться другой уровень), в редакторе жмем правую кнопку мыши и выбираем
Add Actor > Add Trigger. Выделяем его и идем в Kismet.



Делаем как на скриншоте:
New Action > Misc > Console Command
New Event Using Trigger_1 > Touch
New Variable > Player > Player

    Соединяем. Выделяем Console Command и в строке Commands пишем "open DM-Deck" без кавычек. Это команда загрузки уровня DM-Deck. Есть небольшая особенность - если Вы хотите подгрузить свой уровень (куда ж без этого) то он должен находиться в папке: C:\UDK\UDK-2010-XX\UDKGame\Content\Maps  
дабы UDK увидел ваш уровень.

    И еще, уровень будет подгружаться, если вы запустите игру как Play on PC. По другому не заработает. И не забудьте поставить PlayerStart, и т.д. и т.п.

С этим разобрались. Теперь задача такая - подгружаем один уровень прямо в другой.

    Создаем простейший уровень. Я создал несколько платформ. Все они немного соприкасаются друг с другом, но это не обязательно. Можно просто раскидать по разным углам - как Вам удобно. Сохраняем его (например map_full).
    Теперь удаляем все платформы кроме первой и ребилдим (жмем кнопку Build Geometry for visible levels), сохраняем уровень (например map_01). Загружаем map_full и тем самым возвращаем уровни. Удаляем все платформы кроме второй - ребилдим и сохраняем (map_02). И так далее.






    Загружаем map_01, ставим свет, точку старта для игрока - созраняем. теперь идем в Content Browser и переходим на вкладку levels. Выбираем Add Existing Level и добавляем туда map_02, map_03 и т.д.

Примечание : у меня получилось нормально добавить карты только после того как я их переместил в
C:\UDK\UDK-2010-XX\UDKGame\Content\Maps 
Из других место они не добавлялись. Увы, с чем это связано пока не разобрался. Может кто подскажет?

    В появившемся окошке выбираем
Kismet (будем управлять подгрузкой через Kismet). AlwaysLoaded - тут понятно, постоянно загруженный, а с третьим еще не экспериментировал. Сохраняем. Если сейчас запустить уровень, то мы увидим только map_01, что вполне естественно - команды загружать остальные платформы не было.




    Чтобы загружались остальные платформы через триггер, мы используем Kismet. Но сначала сделаем триггер, для этого выставляем размеры у builder brush и жмем правой кнопкой мыши по значку Add Volume, далее выбираем из списка TriggerVolume. Теперь у нас есть триггер. Нам нужно сделать так, чтобы при касании области триггера, подгружалась следующая платформа. Для этого идем в Kismet и делаем вот такую схемку:




Это у нас:
New Event Using TriggerVolume_1 > Touch
New Action > Level > Stream Level







    Выделяем Stream Level и пишем там название подгружаемого уровня.Тоже самое проделываем с остальными уровнями. Вот в общем то и все, дальше уже сами экспериментируйте.






No comments:

Post a Comment