Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Разговоры у барной стойки
GAMEINATOR forums > S.T.A.L.K.E.R. > Бар "Тайны Зоны"
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380
NanoBot-AMK
Блин что за английский, Cossack правильно писать Cozzack. Мне постоянно читается кошак, а не казак!
Turrel именно turrel а не turret? англорусский если что, что бы знали что turrel делал русский(нац).
Xottab_DUTY
NanoBot-AMK, ты это, завязывай с питием-то kozak.gif СКАЙНЕТ и ПЕРИМЕТР был лучше biggrin.gif
RedMagic
Скайнет? Периметр? Тогда вот вам история про Любителя biggrin.gif



PS: http://romanticallyapocalyptic.com/0-1/russian , если кто не знает (специально выделил наличие русского на оф. сайте создателя). Думаю, сталкерской аудитории сумашедшая постапокалиптическая научно-фантастическая (сталкер тоже относится к НФ, если кто не в курсе) история приключений Капитана (и его кружки) приправленная черным юмором и безумием должна понравится.



Капитан, Сниппи и Пилот. Сниппи немного поранился.

PSS:



"Капитан и его кружка" - Один в один rofl.gif
Xottab_DUTY
А ведь действительно.. Хм. rolleyes.gif
RedMagic
А еще разработчики из GSC выкладывают в стиме скриншоты из ТЧ. Троллят, конечно, знатно biggrin.gif
RedMagic
Trollz0r
Цитата(STALKER2011x @ 10.10.2017, 06:07) *
А еще разработчики из GSC выкладывают в стиме скриншоты из ТЧ. Троллят, конечно, знатно biggrin.gif
Троллинг тупостью? Ну это уже не ново smile.gif
Xottab_DUTY
STALKER2011x, о, а ссылочку на стимы разрабов можно?) rolleyes.gif
Cossack-HD
Цитата(NanoBot-AMK @ 08.10.2017, 22:47) *
Блин что за английский, Cossack правильно писать Cozzack. Мне постоянно читается кошак, а не казак!
Turrel именно turrel а не turret? англорусский если что, что бы знали что turrel делал русский(нац).

Ахахаха, GSC уже три игры выпустили про "Кошаков", а в столкире обнаружилась "Кошачья водка" biggrin.gif
Молния в вакууме
Cossack-HD, а гугл переводит твой ник как Казацко-HD.
Barbarian
Цитата(STALKER2011x @ 10.10.2017, 08:07) *

Вроде фильм 9 раз полностью сняли. В смысле разные варианты.
Cartoteka
Цитата(Barbarian @ 10.10.2017, 15:22) *
Цитата(STALKER2011x @ 10.10.2017, 08:07) *

Вроде фильм 9 раз полностью сняли. В смысле разные варианты.



Было 7 вариантов сценария (самый первый назывался "Машина желаний"). Последний был ближе всего к тому, что получилось в итоге.

А сам фильм переснимался раза три. Один раз фильм сняли, но оказалась запорота плёнка - засвечена или ещё что-то. В итоге заменили оператора и пересняли с самого начала.

К сожалению, первоначально отснятый материал не сохранился - запоротые плёнки сгорели на складе, где как раз такие объекты хранятся.
tom-m15
Cossack-HD
Цитата(tom-m15 @ 11.10.2017, 14:31) *

Интересный видос, уже смотрел. Автор довольно красиво всё рассказал и провёл интервью со сталкерами-нелегалами. Только вот он засрал всю зелёную Припять серым цветофильтром ради атмосфээры, за что минус.
RedMagic
Мои эксперименты с AR (не обращайте внимание на размытие, просто камера не сфокусировалась):



Тени (источник света в камере)



PS: изначально тестировал на Unity-chan, но материалов с ней полно, поэтому решил взять что-то более интересное.
Р.М.А.
STALKER2011x, я ещё такой шейдер использую для поверхности, чтобы тень от объекта падала:
CODE
Shader "Custom/ShadowReceiverTransparent"
{
Properties
{
_Color("Shadow Color", Color) = (1,1,1,1)
_ShadowInt("Shadow Intensity", Range(0,1)) = 1.0
_Cutoff("Alpha cutoff", Range(0,1)) = 0.5
}

SubShader
{
Tags
{
"Queue" = "AlphaTest"
"IgnoreProjector" = "True"
"RenderType" = "TransparentCutout"
}
LOD 200
ZWrite off
Blend zero SrcColor

CGPROGRAM
#pragma surface surf ShadowOnly alphatest:_Cutoff

fixed4 _Color;
float _ShadowInt;

struct Input
{
float2 uv_MainTex;
};

inline fixed4 LightingShadowOnly(SurfaceOutput s, fixed3 lightDir, fixed atten)
{
fixed4 c;
c.rgb = lerp(s.Albedo, float3(1.0,1.0,1.0), atten);
c.a = 1.0 - atten;
return c;
}

void surf(Input IN, inout SurfaceOutput o)
{
o.Albedo = lerp(float3(1.0,1.0,1.0), _Color.rgb, _ShadowInt);
o.Alpha = 1.0;
}
ENDCG
}

Fallback "Transparent/Cutout/VertexLit"
}


Будет, примерно, так (тень падает на прозрачную плоскость):


Чтобы тень лучше выглядела, в настройках задаю Shadow Projection - Close Fit.

А на фотках какая версия Unity? Не Unity 2017.2? А то они туда внедрили нативную поддержку Vuforia и сделали бесплатный тариф для пользователей юнити.
RedMagic
Р.М.А., ага, тоже думал об этом. Но я ради интереса решил поэсперементировать с AR, поэтому особо не напрягался для теста и просто поставил пару кубиков smile.gif

Цитата(Р.М.А. @ 11.10.2017, 17:01) *
Не Unity 2017.2?

Неа, она еще в бете, я решил пока не обновляться (лень чинить если что-то отвалится, а у меня там проекты рабочие есть). Но на сайте Vuforia ассет для юнити помечен как устаревший, так что в любом случае потом придется обновится до новой версии.

PS: я тоже выставлял в моделях отражения на максимум чтобы на блеск посмотреть smile.gif Тестировал на этой модели (анимированная версия). Правда, лень было разбираться с настройкой материалов и шейдеров, поэтому она выглядела не так красиво как на рендере.
Р.М.А.
Цитата(STALKER2011x @ 11.10.2017, 17:37) *
на блеск посмотреть

Ещё от устройства зависит. У меня скрин слева (где Лара) - это Samsung Galaxy S4, справа - Nexus 5. На нексусе гораздо лучше и картинка, и камера, и производительность.

Лара на нексусе:
aka_sektor
Кто по украински шпарит? Можете продублировать по-русски: https://youtu.be/-5UxSE6cPvo?t=704
Че там Парфенюк именно говорит?
RedMagic
aka_sektor, про тени (чем ближе к объекту (прим.: полагаю, имеется ввиду источник света) - тем четче, чем дальше - тем размытие), SSAO, тесселяцию (на персонажах и монстрах).

PS: там еще дальше в видео говорится "если вы не поняли что сказал этот человек, то вкратце - в ЗП будет поддержка DX 11" smile.gif
aka_sektor
STALKER2011x, продублировать никак? Без этих вкратце, общих смыслов.
Может даже по-украински написать.
RedMagic
aka_sektor, мне лень smile.gif Там нет никакой ценной/полезной/новой информации, так что это пустая трата времени.
aka_sektor
STALKER2011x, какая нахрен лень? kozak.gif Там несколько фраз, просто записать по-украински.
Degtyar
Цитата(aka_sektor @ 13.10.2017, 16:15) *
Кто по украински шпарит? Можете продублировать по-русски: https://youtu.be/-5UxSE6cPvo?t=704
Че там Парфенюк именно говорит?

— Мы добавили новые тени, так называемые тени, которые становятся более жёсткими при контакте с объектом. Чем ближе к объекту — тем более чёткий предел, а чем дальше от объекта — предел более расплывчатый.
— То есть это как в реально, получается, да? Приближенно…
— Да, к тому, что происходит в действительности. Мы добавили новый вид SSAO и ускорили с помощью комплит-шейдеров. И последняя наша фича — это тесселяция, которая увеличивает полигонаж объектов уже на видеокарте. Это позволило значительно улучшить.
— То есть это на персонажах?
— В основном на персонажах художники поставили и на монстриках. Они стали более круглыми.

И да, привет тебе от вики!
aka_sektor
Degtyar, я уже было начал пытаться сам записать laugh.gif
->

Долоновиченне. Звания теней, якия стоять жорстки шо на прыкантакте c абъектам. Чым блише от абъекта, тем блиш чатка мажа. Чым далее ат абъекта, тым ужо бильш расплывчасти.
... [тут чет неразборчиво] ...
Гэта далэ новый выд SSAO, яки паскароузэ новую комплит шейдерную эфиктибливую цакстату тыкслей. Ну и астальное что тычацца, тэсяляция. Гэта бильшы полиганаж абъекти. Уже на либа карте, т.е. и цэ воно значна патрачны. В основном на персонажах, художники поставыли, и на монстрыках. Яны стали бильш круглейши.


Цитата(Degtyar @ 13.10.2017, 19:23) *
И да, привет тебе от вики!

Эт там такое? Чет не видел.

А украинская версия есть? А то русская заметно отличается.
Degtyar
Цитата(aka_sektor @ 13.10.2017, 19:40) *
Degtyar, я уже было начал пытаться сам записать

Забавно, только больше похоже не белорусский.
Цитата(aka_sektor @ 13.10.2017, 19:40) *
Эт там такое? Чет не видел.

Нет, просто вижу знакомый ник, думаю, откуда, потом вспомнил, что ты на вики правил статью про Лобанчикова.
Цитата(aka_sektor @ 13.10.2017, 19:40) *
А украинская версия есть? А то русская заметно отличается.

Нет, нету. Как и надобности в ней.
aka_sektor
Цитата(Degtyar @ 13.10.2017, 19:49) *
больше похоже не белорусский

Вполне может быть, учитывая мою национальность. tongue.gif

Цитата(Degtyar @ 13.10.2017, 19:49) *
Нет, нету. Как и надобности в ней.

Да, согласен. Посмотрел читая перевод, лёг как родной. Эт я не так услышал.
Спасибо.
NanoBot-AMK

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

Грузовик Смерти


Вояк убил не Я!
Cossack-HD
Я тут говорил о важности итеративности разработки и удобстве SDK. Собственно, вот эталонЪ SDK, который работает на дизайнеров.

Там ещё есть тулзы для настройки ИИ с тестироваием в реальном времени, т.е. для любого триггера и в любом сегменте можно настроить в том числе ИИ, и тут-же его проверить в деле.
abramcumner
Цитата(Cossack-HD @ 13.10.2017, 23:43) *
Я тут говорил о важности итеративности разработки и удобстве SDK. Собственно, вот эталонЪ SDK, который работает на дизайнеров.

Мне показалось или ролике долго водили мышкой, много болтали, но так в своем чудесном сдк не поменяли ни одного параметра? biggrin.gif
Cossack-HD
Цитата(abramcumner @ 14.10.2017, 13:43) *
Цитата(Cossack-HD @ 13.10.2017, 23:43) *
Я тут говорил о важности итеративности разработки и удобстве SDK. Собственно, вот эталонЪ SDK, который работает на дизайнеров.

Мне показалось или ролике долго водили мышкой, много болтали, но так в своем чудесном сдк не поменяли ни одного параметра? biggrin.gif

DOF меняли, например.
То был пример интерактивной разработки полноценного трейлера непосредственно в движке игры, с возможностью перематывать до любого кадра с учётом физики в реальном времени. Показал он меньше, чем рассказал. Он упоминал возможности настройки AI.
RedMagic
Цитата(Cossack-HD @ 13.10.2017, 23:43) *
Я тут говорил о важности итеративности разработки и удобстве SDK. Собственно, вот эталонЪ SDK, который работает на дизайнеров.

Так это же Unity biggrin.gif

Естественно он один из самых удобных (если вообще не самый удобный) движков. Я уже давно говорил что при желании можно даже С2 сделать на нем (с бесшовной зоной, алайфом и прочим), ничуть не хуже оригинальных игр (кроме производительности, все имеет свою цену sleep.gif ).

X-Ray SDK очень неудобен. Он хорошо выполнял свои функции в свое время, но сейчас все то же самое можно сделать в сотни раз удобнее и быстрее.
Отключить лайтмапинг/настроить освещение - одна галочка во вкладке управления освещением в Unity.
Нужно сделать WYSYWYG редактор НПС? Пожалуйста, сделали один скрипт и теперь в отдельной вкладке редактора можно в реалтайме менять все характеристики.
Редактор погоды? Аналогично - делаем скрипт редактора и можем сразу все посмотреть и настроить.
АИ сетка? Чик-чик и готово, а если что - можно за несколько секунд все поправить ручками (добавить зону укрытий, прыжков и т.д.).
Добавлять и редактировать диалоги всех НПС с заданием условий для квестов? Пожалуйста, можно даже настроить автоматический экспорт сгенерированных строк в вашу любимую систему перевода (а заодно и проверкой орфографии), синхронизацией с игрой и переключением языка прямо во время игры, для тестирования (чтобы не было как в ТЧ в одном из первых диалогов с Волком "Нло" вместо "Но").
Быстрое прототипирование задач - без проблем. Например, взбрело в голову посмотреть что видят НПС во время симуляции в реалтайме - создаем новый скрипт который добавляет каждому НПС камеру, собираем их вместе и выводим изображение с них (в Unity это называется рендер в текстуру) на большой телевизор в центральном зале (а поверх изображения можно еще телеметрию наложить. Здоровье, список предметов в инвентаре и т.д.). Зачем? Просто так. Потому что можем biggrin.gif А еще смотреть перестрелку НПС одновременно с разных точек зрения может быть довольно занятно.
Про такие мелочие как настройка пост-эффектов камеры я даже даже говорить не буду.

Как все уже поняли, это был пост человека которому нравится Unity smile.gif
7.9
То есть, сидит такой постановщик (весь такой режисёр и дизайнер) за компом, ставит сцены (или настраивает а-лайф), а рядом с ним пара скриптеров, и если что они ему инструментик -- ррраз, и он дальше всё ещё лучше ставить начинает...
Если всё правда так -- я то-же люблю Юнити.
Р.М.А.
Цитата(7.9 @ 14.10.2017, 19:36) *
он дальше всё ещё лучше ставить начинает

Удобно. Я так себе скрипт для редактора юнити писал, который читал настройки карт из SDK ЗП и воссоздавал по ним карту в юнити.

Нашёл для старой версии юнити (импорт освещения и звуков):
Файл StkImport.cs (положить в папку Assets\Editor)
CODE
/*
Импорт сцены из STK SDK 0.7 в Unity 4.6.1
Р.М.А., 2015
*/

using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections;

namespace Stk
{

#region Импорт освещения

/// <summary>
/// Окно импорта освещения.
/// </summary>
public sealed class StkImportLightsWindow : EditorWindow
{

#region Строковые константы
/// <summary>
/// Заголовок окна
/// </summary>
private const string WINDOW_TITLE = "Импорт освещения";
/// <summary>
/// Название пункта в главном пеню.
/// </summary>
private const string MENU_ITEM_NAME = "Stk";
/// <summary>
/// Название подпункта.
/// </summary>
private const string SUBMENU_ITEM_NAME = "Импорт освещения";
/// <summary>
/// Надпись на кнопке выбора файла.
/// </summary>
private const string BUTTON_SELECT_FILE_NAME = "...";
/// <summary>
/// Заголовок окна выбора файла.
/// </summary>
private const string PANEL_OPEN_FILE_TITLE = "Выберите файл с освещением (light.part)";
/// <summary>
/// Расширение файла, в котором хранятся настройки освещения.
/// </summary>
private const string FILE_EXTENSION = "part";
/// <summary>
/// Надпись для настроек сдвига позиции.
/// </summary>
private const string LABEL_TRANSLATE = "Сдвиг позиции";
/// <summary>
/// Надпись для настроек масштабирования позиции.
/// </summary>
private const string LABEL_SCALE = "Масштабирование позиции";
/// <summary>
/// Надпись на кнопке для запуска импорта.
/// </summary>
private const string BUTTON_IMPORT_NAME = "Импорт";
#endregion

#region Числовые константы
/// <summary>
/// Высота элемента управления.
/// </summary>
private const int CONTROL_HEIGHT = 16;
/// <summary>
/// Отступ слева от края окна.
/// </summary>
private const int MARGIN_LEFT = 5;
/// <summary>
/// Отступ справа от края окна.
/// </summary>
private const int MARGIN_RIGHT = 5;
/// <summary>
/// Отступ сверху от края окна.
/// </summary>
private const int MARGIN_TOP = 5;
/// <summary>
/// Отступ снизу.
/// </summary>
private const int MARGIN_BOTTOM = 5;
/// <summary>
/// Ширина кнопки выбора файла.
/// </summary>
private const int BTN_SELECT_WIDTH = 24;
#endregion

#region Координаты и размеры элементов управления
/// <summary>
/// Поле для отображения пути к выбранному файлу.
/// </summary>
private Rect rectPathField = new Rect(MARGIN_LEFT, MARGIN_TOP, 0, CONTROL_HEIGHT);
/// <summary>
/// Кнопка выбора файла.
/// </summary>
private Rect rectBtnSelect = new Rect(0, MARGIN_TOP, BTN_SELECT_WIDTH, CONTROL_HEIGHT);
/// <summary>
/// Поле для сдвига позиции.
/// </summary>
private Rect rectFieldTrans = new Rect(MARGIN_LEFT, 0, 0, CONTROL_HEIGHT);
/// <summary>
/// Поле для мастабирования позиции.
/// </summary>
private Rect rectFieldScale = new Rect(MARGIN_LEFT, 0, 0, CONTROL_HEIGHT);
/// <summary>
/// Поле для мастабирования позиции.
/// </summary>
private Rect rectBtnImport = new Rect(MARGIN_LEFT, 0, 0, CONTROL_HEIGHT);
#endregion


/// <summary>
/// Путь к выбранному файлу.
/// </summary>
private string filePath = "Выберите файл light.part";
/// <summary>
/// Ширина окна.
/// </summary>
private int windowWidth;
/// <summary>
/// Значения масштабирования позиции.
/// </summary>
private Vector3 posScale = Vector3.one;
/// <summary>
/// Значения сдвига позиции.
/// </summary>
private Vector3 posTrans = Vector3.zero;


[MenuItem(MENU_ITEM_NAME + "/" + SUBMENU_ITEM_NAME)]
public static void Init()
{
StkImportLightsWindow wnd = GetWindow<StkImportLightsWindow>();
wnd.title = WINDOW_TITLE;
wnd.Show();
}

/// <summary>
/// Отрисовка элементов окна импорта.
/// </summary>
public void OnGUI()
{
// обновление размеров
UpdateRect();
// выбор файла
if (GUI.Button(rectBtnSelect, BUTTON_SELECT_FILE_NAME))
{
filePath = EditorUtility.OpenFilePanel(PANEL_OPEN_FILE_TITLE, System.String.Empty, FILE_EXTENSION);
}
// путь к файлу
GUI.TextField(rectPathField, filePath);
// масштабирование
posScale = EditorGUI.Vector3Field(rectFieldScale, LABEL_SCALE, posScale);
// сдвиг
posTrans = EditorGUI.Vector3Field(rectFieldTrans, LABEL_TRANSLATE, posTrans);
// импорт
if (GUI.Button(rectBtnImport, BUTTON_IMPORT_NAME))
{
new StkLightsImporter(filePath, posScale, posTrans).Start();
}
}

/// <summary>
/// Обновление координат и размеров элементов управления.
/// </summary>
private void UpdateRect()
{
if (windowWidth != (int)position.width)
{
windowWidth = (int)position.width;

rectBtnSelect.x = windowWidth - BTN_SELECT_WIDTH - MARGIN_RIGHT;
rectPathField.width = rectBtnSelect.x - MARGIN_LEFT - MARGIN_RIGHT;

rectFieldScale.y = rectPathField.y + rectPathField.height + MARGIN_TOP;
rectFieldScale.width = windowWidth - MARGIN_LEFT - MARGIN_RIGHT;

rectFieldTrans.y = rectFieldScale.y + rectFieldScale.height * 2 + MARGIN_TOP;
rectFieldTrans.width = rectFieldScale.width;

rectBtnImport.y = rectFieldTrans.y + rectFieldTrans.height * 2 + MARGIN_TOP;
rectBtnImport.width = rectFieldTrans.width;
}
}
}

/// <summary>
/// Класс читает выбранный файл и расставляет на сцене свет.
/// </summary>
public sealed class StkLightsImporter
{

#region Строковые константы
/// <summary>
/// Сообщение в лог о начале импорта ({0} - дата).
/// </summary>
private const string IMPORT_START = "[{0}]: импорт начат;";
/// <summary>
/// Сообщение в лог о завершении импорта ({0} - дата, {1} - импортированно, {2} - всего).
/// </summary>
private const string IMPORT_END = "[{0}]: импорт завершён: импортированно {1} из {2}.";
/// <summary>
/// Название объекта на сцене, куда помещаются всё импортированное освещение.
/// </summary>
private const string OBJECT_PARENT_NAME = "Imported Lights";
/// <summary>
/// Сообщение о том, что файл не найдён ({0} - путь к файлу).
/// </summary>
private const string FILE_NOT_FOUND = "Файл не найден: {0}";
#endregion

#region Ключи для чтения параметров
/// <summary>
/// Секция с параметрами объекта.
/// </summary>
private const string KEY_SECTION_OBJECT = "[object_";
/// <summary>
/// Ключ для чтения общего количества ичсточников света.
/// </summary>
private const string KEY_OBJECTS_COUNT = "objects_count";
/// <summary>
/// Ключ для чтения яркости.
/// </summary>
private const string KEY_BRIGHTNESS = "brightness";
/// <summary>
/// Ключ для чтения цвета.
/// </summary>
private const string KEY_COLOR = "color";
/// <summary>
/// Ключ для чтения имени.
/// </summary>
private const string KEY_NAME = "name";
/// <summary>
/// Ключ для чтения позиции.
/// </summary>
private const string KEY_POSITION = "position";
/// <summary>
/// Ключ для чтения расстояния.
/// </summary>
private const string KEY_RANGE = "range";
#endregion

/// <summary>
/// Разделительный символ для параметров.
/// </summary>
private const char SPLIT_KEY_VALUE_CHAR = '=';
/// <summary>
/// Разделительный символ для значения параметра (например, координаты).
/// </summary>
private const char SPLIT_VALUE_CHAR = ',';


/// <summary>
/// Общее количество источников света для импорта.
/// </summary>
private int objectsCount;
/// <summary>
/// Количество импортированных объектов.
/// </summary>
private int objectsCountImported;

/// <summary>
/// Пусть к файлу.
/// </summary>
private string path;
/// <summary>
/// Масштабирование позиции.
/// </summary>
private Vector3 scale;
/// <summary>
/// Сдвиг позиции.
/// </summary>
private Vector3 trans;

/// <summary>
/// Родительский объект, в который будут помещены все импортированные объекты.
/// </summary>
private GameObject parentObj;
/// <summary>
/// Текущий импортируемый объект.
/// </summary>
private GameObject importedObj;

/// <summary>
/// Конструктор импортёра.
/// </summary>
/// <param name="path">Путь к файлу с настройками света (light.part).</param>
/// <param name="trans">Смещение позиции по осям.</param>
/// <param name="scale">Масштабирование света по осям.</param>
public StkLightsImporter(string path, Vector3 scale, Vector3 trans)
{
this.path = path;
this.scale = scale;
this.trans = trans;
this.objectsCount = 0;
this.objectsCountImported = 0;
}

/// <summary>
/// Начинает импорт освещения.
/// </summary>
public void Start()
{
if (File.Exists(path))
{
// читает файл и создаёт источники света
Debug.Log(System.String.Format(IMPORT_START, System.DateTime.Now));
parentObj = new GameObject(OBJECT_PARENT_NAME);
using (StreamReader sr = new StreamReader(path, true))
{
while (sr.Peek() != -1)
{
ParseLine(sr.ReadLine());
}
}
// сообщение о завершении импорта
string importEndMsg = System.String.Format(IMPORT_END, System.DateTime.Now, objectsCountImported, objectsCount);
if (objectsCountImported == 0)
{
Debug.LogError(importEndMsg);
}
else if (objectsCountImported != objectsCount)
{
Debug.LogWarning(importEndMsg);
}
else
{
Debug.Log(importEndMsg);
}
}
else
{
Debug.LogError(System.String.Format(FILE_NOT_FOUND, path));
}
}

/// <summary>
/// Разбирает строку файла: создаёт объект света, настраивает параметры.
/// </summary>
/// <param name="line">Line.</param>
private void ParseLine(string line)
{
if (line.IndexOf(KEY_SECTION_OBJECT) != -1)
{
importedObj = new GameObject();
importedObj.AddComponent<Light>();
importedObj.transform.parent = parentObj.transform;
++objectsCountImported;
}
else
{
string[] keyValue = line.Split(SPLIT_KEY_VALUE_CHAR);
if (keyValue != null && keyValue.Length == 2)
{
keyValue[0] = keyValue[0].Trim();
keyValue[1] = keyValue[1].Trim();
ParseValue(keyValue[0], keyValue[1]);
}
}
}

/// <summary>
/// Разбирает значение: настраивает параметры текущего объекта света.
/// </summary>
/// <param name="key">Название параметра.</param>
/// <param name="value">Значение параметра.</param>
private void ParseValue(string key, string value)
{
if (importedObj != null)
{
string[] values;
float v1, v2, v3;
switch (key)
{
case KEY_BRIGHTNESS:
importedObj.GetComponent<Light>().intensity = float.Parse(value);
break;
case KEY_COLOR:
values = value.Replace(" ", "").Split(SPLIT_VALUE_CHAR);
v1 = float.Parse(values[0]);
v2 = float.Parse(values[1]);
v3 = float.Parse(values[2]);
importedObj.GetComponent<Light>().color = new Color(v1, v2, v3);
break;
case KEY_NAME:
importedObj.name = value;
break;
case KEY_POSITION:
values = value.Replace(" ", "").Split(SPLIT_VALUE_CHAR);
v1 = float.Parse(values[0]) * scale.x + trans.x;
v2 = float.Parse(values[1]) * scale.y + trans.y;
v3 = float.Parse(values[2]) * scale.z + trans.z;
importedObj.transform.localPosition = new Vector3(v1, v2, v3);
break;
case KEY_RANGE:
importedObj.GetComponent<Light>().range = float.Parse(value);
break;
}
}
// количество объектов
if (objectsCount == 0 && key.Equals(KEY_OBJECTS_COUNT))
{
objectsCount = int.Parse(value);
}
}
}
#endregion

/// <summary>
/// Окно импорта источников звука.
/// </summary>
public sealed class StkImportSoundSrcWindow : EditorWindow
{

#region Строковые константы
/// <summary>
/// Заголовок окна
/// </summary>
private const string WINDOW_TITLE = "Импорт звуков";
/// <summary>
/// Название пункта в главном пеню.
/// </summary>
private const string MENU_ITEM_NAME = "Stk";
/// <summary>
/// Название подпункта.
/// </summary>
private const string SUBMENU_ITEM_NAME = "Импорт звуков";
/// <summary>
/// Надпись на кнопке выбора файла.
/// </summary>
private const string BUTTON_SELECT_FILE_NAME = "...";
/// <summary>
/// Надпись на кнопке выбора папки.
/// </summary>
private const string BUTTON_SELECT_FOLDER_NAME = "...";
/// <summary>
/// Заголовок окна выбора файла.
/// </summary>
private const string PANEL_OPEN_FILE_TITLE = "Выберите файл со звуками (sound_src.part)";
/// <summary>
/// Заголовок окна выбора папки.
/// </summary>
private const string PANEL_OPEN_FOLDER_TITLE = "Выберите папку со звуками в ассетах";
/// <summary>
/// Расширение файла, в котором хранятся настройки освещения.
/// </summary>
private const string FILE_EXTENSION = "part";
/// <summary>
/// Надпись для настроек сдвига позиции.
/// </summary>
private const string LABEL_TRANSLATE = "Сдвиг позиции";
/// <summary>
/// Надпись для настроек масштабирования позиции.
/// </summary>
private const string LABEL_SCALE = "Масштабирование позиции";
/// <summary>
/// Надпись на кнопке для запуска импорта.
/// </summary>
private const string BUTTON_IMPORT_NAME = "Импорт";
#endregion

#region Числовые константы
/// <summary>
/// Высота элемента управления.
/// </summary>
private const int CONTROL_HEIGHT = 16;
/// <summary>
/// Отступ слева от края окна.
/// </summary>
private const int MARGIN_LEFT = 5;
/// <summary>
/// Отступ справа от края окна.
/// </summary>
private const int MARGIN_RIGHT = 5;
/// <summary>
/// Отступ сверху от края окна.
/// </summary>
private const int MARGIN_TOP = 5;
/// <summary>
/// Отступ снизу.
/// </summary>
private const int MARGIN_BOTTOM = 5;
/// <summary>
/// Ширина кнопки выбора файла.
/// </summary>
private const int BTN_SELECT_WIDTH = 24;
#endregion

#region Координаты и размеры элементов управления
/// <summary>
/// Поле для отображения пути к выбранному файлу.
/// </summary>
private Rect rectPathFieldFile = new Rect(MARGIN_LEFT, MARGIN_TOP, 0, CONTROL_HEIGHT);
/// <summary>
/// Кнопка выбора файла.
/// </summary>
private Rect rectBtnSelectFile = new Rect(0, MARGIN_TOP, BTN_SELECT_WIDTH, CONTROL_HEIGHT);
/// <summary>
/// Поле для отображения пути к выбранной папке.
/// </summary>
private Rect rectPathFieldFolder = new Rect(MARGIN_LEFT, 0, 0, CONTROL_HEIGHT);
/// <summary>
/// Кнопка выбора папки.
/// </summary>
private Rect rectBtnSelectFolder = new Rect(0, 0, BTN_SELECT_WIDTH, CONTROL_HEIGHT);
/// <summary>
/// Поле для сдвига позиции.
/// </summary>
private Rect rectFieldTrans = new Rect(MARGIN_LEFT, 0, 0, CONTROL_HEIGHT);
/// <summary>
/// Поле для мастабирования позиции.
/// </summary>
private Rect rectFieldScale = new Rect(MARGIN_LEFT, 0, 0, CONTROL_HEIGHT);
/// <summary>
/// Поле для мастабирования позиции.
/// </summary>
private Rect rectBtnImport = new Rect(MARGIN_LEFT, 0, 0, CONTROL_HEIGHT);
#endregion


/// <summary>
/// Путь к выбранному файлу.
/// </summary>
private string filePath = "Выберите файл sound_src.part";
/// <summary>
/// Путь к папке со звуками.
/// </summary>
private string folderPath = "Выберите папку со звуками в ассетах";
/// <summary>
/// Ширина окна.
/// </summary>
private int windowWidth;
/// <summary>
/// Значения масштабирования позиции.
/// </summary>
private Vector3 posScale = Vector3.one;
/// <summary>
/// Значения сдвига позиции.
/// </summary>
private Vector3 posTrans = Vector3.zero;


[MenuItem(MENU_ITEM_NAME + "/" + SUBMENU_ITEM_NAME)]
public static void Init()
{
StkImportSoundSrcWindow wnd = GetWindow<StkImportSoundSrcWindow>();
wnd.title = WINDOW_TITLE;
wnd.Show();
}


/// <summary>
/// Отрисовка элементов окна импорта.
/// </summary>
public void OnGUI()
{
// обновление размеров
UpdateRect();
// выбор файла
if (GUI.Button(rectBtnSelectFile, BUTTON_SELECT_FILE_NAME))
{
filePath = EditorUtility.OpenFilePanel(PANEL_OPEN_FILE_TITLE, System.String.Empty, FILE_EXTENSION);
}
// путь к файлу
GUI.TextField(rectPathFieldFile, filePath);
// выбор папки
if (GUI.Button(rectBtnSelectFolder, BUTTON_SELECT_FOLDER_NAME))
{
folderPath = EditorUtility.OpenFolderPanel(PANEL_OPEN_FOLDER_TITLE, System.String.Empty, System.String.Empty);
}
// путь к папке
GUI.TextField(rectPathFieldFolder, folderPath);
// масштабирование
posScale = EditorGUI.Vector3Field(rectFieldScale, LABEL_SCALE, posScale);
// сдвиг
posTrans = EditorGUI.Vector3Field(rectFieldTrans, LABEL_TRANSLATE, posTrans);
// импорт
if (GUI.Button(rectBtnImport, BUTTON_IMPORT_NAME))
{
new StkSoundsImporter(filePath, folderPath, posScale, posTrans).Start();
}
}

/// <summary>
/// Обновление координат и размеров элементов управления.
/// </summary>
private void UpdateRect()
{
if (windowWidth != (int)position.width)
{
windowWidth = (int)position.width;

rectBtnSelectFile.x = windowWidth - BTN_SELECT_WIDTH - MARGIN_RIGHT;
rectPathFieldFile.width = rectBtnSelectFile.x - MARGIN_LEFT - MARGIN_RIGHT;

rectBtnSelectFolder.x = windowWidth - BTN_SELECT_WIDTH - MARGIN_RIGHT;
rectBtnSelectFolder.y = rectBtnSelectFile.y + rectBtnSelectFile.height + MARGIN_TOP;
rectPathFieldFolder.y = rectPathFieldFile.y + rectPathFieldFile.height + MARGIN_TOP;
rectPathFieldFolder.width = rectBtnSelectFile.x - MARGIN_LEFT - MARGIN_RIGHT;

rectFieldScale.y = rectPathFieldFolder.y + rectPathFieldFolder.height + MARGIN_TOP;
rectFieldScale.width = windowWidth - MARGIN_LEFT - MARGIN_RIGHT;

rectFieldTrans.y = rectFieldScale.y + rectFieldScale.height * 2 + MARGIN_TOP;
rectFieldTrans.width = rectFieldScale.width;

rectBtnImport.y = rectFieldTrans.y + rectFieldTrans.height * 2 + MARGIN_TOP;
rectBtnImport.width = rectFieldTrans.width;
}
}
}


/// <summary>
/// Класс читает выбранный файл и расставляет на сцене источники звука.
/// </summary>
public sealed class StkSoundsImporter
{

#region Строковые константы
private const string ASSETS_FOLDER = "Assets";
/// <summary>
/// Сообщение в лог о начале импорта ({0} - дата).
/// </summary>
private const string IMPORT_START = "[{0}]: импорт начат;";
/// <summary>
/// Сообщение в лог о завершении импорта ({0} - дата, {1} - импортированно, {2} - всего).
/// </summary>
private const string IMPORT_END = "[{0}]: импорт завершён: импортированно {1} из {2}.";
/// <summary>
/// Название объекта на сцене, куда помещаются всё импортированное освещение.
/// </summary>
private const string OBJECT_PARENT_NAME = "Imported Sounds";
/// <summary>
/// Сообщение о том, что файл не найдён ({0} - путь к файлу).
/// </summary>
private const string FILE_NOT_FOUND = "Файл не найден: {0}";
/// <summary>
/// Сообщение о том, что папка не найдёна ({0} - путь к папке).
/// </summary>
private const string FOLDER_NOT_FOUND = "Папка не найдена: {0}";
#endregion

#region Ключи для чтения параметров
/// <summary>
/// Имя секции объекта.
/// </summary>
private const string KEY_SECTION_OBJECT = "[object_";
/// <summary>
/// Ключ для чтения общего количества объектов.
/// </summary>
private const string KEY_OBJECTS_COUNT = "objects_count";
/// <summary>
/// Ключ для чтения частоты.
/// </summary>
private const string KEY_FREQ = "freq";
/// <summary>
/// Ключ для чтения максимального расстояния звучания.
/// </summary>
private const string KEY_MAX_DIST = "max_dist";
/// <summary>
/// Ключ для чтения минимального расстояния звучания.
/// </summary>
private const string KEY_MIN_DIST = "min_dist";
/// <summary>
/// Ключ для чтения имени.
/// </summary>
private const string KEY_NAME = "name";
/// <summary>
/// Ключ для чтения позиции.
/// </summary>
private const string KEY_POSITION = "position";
/// <summary>
/// Ключ для чтения названия звука.
/// </summary>
private const string KEY_SND_NAME = "snd_name";
/// <summary>
/// Ключ для чтения громкости.
/// </summary>
private const string KEY_VOLUME = "volume";
#endregion


/// <summary>
/// Разделительный символ для параметров.
/// </summary>
private const char SPLIT_KEY_VALUE_CHAR = '=';
/// <summary>
/// Разделительный символ для значения параметра (например, координаты).
/// </summary>
private const char SPLIT_VALUE_CHAR = ',';
/// <summary>
/// Разделительный символ в путях файлов.
/// </summary>
private const char CHAR_FILE_SEPARATE = '/';

/// <summary>
/// Максимальное значение поля pitch;
/// </summary>
private const float AUDIO_MAX_PITCH = 3.0f;
/// <summary>
/// Минимальное значение поля pitch.
/// </summary>
private const float AUDIO_MIN_PITCH = -3.0f;


/// <summary>
/// Общее количество источников света для импорта.
/// </summary>
private int objectsCount;
/// <summary>
/// Количество импортированных объектов.
/// </summary>
private int objectsCountImported;

/// <summary>
/// Пусть к файлу.
/// </summary>
private string pathFile;
/// <summary>
/// Путь к папке.
/// </summary>
private string pathFolder;
/// <summary>
/// Путь к папке со звуками в ассетах без корневого каталога ('Assets/Sounds').
/// </summary>
private string pathAssetsSound;
/// <summary>
/// Масштабирование позиции.
/// </summary>
private Vector3 scale;
/// <summary>
/// Сдвиг позиции.
/// </summary>
private Vector3 trans;

/// <summary>
/// Родительский объект, в который будут помещены все импортированные объекты.
/// </summary>
private GameObject parentObj;
/// <summary>
/// Текущий импортируемый объект.
/// </summary>
private GameObject importedObj;


/// <summary>
/// Конструктор.
/// </summary>
/// <param name="pathFile">Путь к файлу sound_src.part.</param>
/// <param name="pathFolder">Путь к папке со звуками в ассетах.</param>
/// <param name="scale">Масштабирование позиции.</param>
/// <param name="trans">Сдвиг позиции.</param>
public StkSoundsImporter(string pathFile, string pathFolder, Vector3 scale, Vector3 trans)
{
this.pathFile = pathFile;
this.pathFolder = pathFolder;
this.scale = scale;
this.trans = trans;
this.objectsCount = 0;
this.objectsCountImported = 0;

string pathAssets = Application.dataPath;
if (pathFolder.IndexOf(pathAssets) != -1)
{
if (pathAssets.Length < pathFolder.Length)
{
this.pathAssetsSound = ASSETS_FOLDER + pathFolder.Substring(pathAssets.Length);
}
else
{
this.pathAssetsSound = ASSETS_FOLDER;
}
}
else
{
Debug.LogError(System.String.Format("Выбранная папка ({0}) не находится в ассетах ({1}).", pathFolder, pathAssets));
}
}

/// <summary>
/// Начинает импорт.
/// </summary>
public void Start()
{
if (!File.Exists(pathFile))
{
Debug.LogError(System.String.Format(FILE_NOT_FOUND, pathFile));
}
else if (!Directory.Exists(pathFolder))
{
Debug.LogError(System.String.Format(FOLDER_NOT_FOUND, pathFile));
}
else if (System.String.IsNullOrEmpty(pathAssetsSound))
{
Debug.LogError(System.String.Format("В проекте не удалось найти путь к папке со звуками.", pathFile));
}
else
{
// читает файл и создаёт источники света
Debug.Log(System.String.Format(IMPORT_START, System.DateTime.Now));
parentObj = new GameObject(OBJECT_PARENT_NAME);
using (StreamReader sr = new StreamReader(pathFile, true))
{
while (sr.Peek() != -1)
{
ParseLine(sr.ReadLine());
}
}
// сообщение о завершении импорта
string importEndMsg = System.String.Format(IMPORT_END, System.DateTime.Now, objectsCountImported, objectsCount);
if (objectsCountImported == 0)
{
Debug.LogError(importEndMsg);
}
else if (objectsCountImported != objectsCount)
{
Debug.LogWarning(importEndMsg);
}
else
{
Debug.Log(importEndMsg);
}
}
}

/// <summary>
/// Разбирает строку файла: создаёт объект на сцене, настраивает параметры.
/// </summary>
/// <param name="line">Line.</param>
private void ParseLine(string line)
{
if (line.IndexOf(KEY_SECTION_OBJECT) != -1)
{
importedObj = new GameObject();
importedObj.AddComponent<AudioSource>();
importedObj.GetComponent<AudioSource>().loop = true;
importedObj.transform.parent = parentObj.transform;
++objectsCountImported;
}
else
{
string[] keyValue = line.Split(SPLIT_KEY_VALUE_CHAR);
if (keyValue != null && keyValue.Length == 2)
{
keyValue[0] = keyValue[0].Trim();
keyValue[1] = keyValue[1].Trim();
ParseValue(keyValue[0], keyValue[1]);
}
}
}

/// <summary>
/// Разбирает значение: настраивает параметры текущего объекта.
/// </summary>
/// <param name="key">Название параметра.</param>
/// <param name="value">Значение параметра.</param>
private void ParseValue(string key, string value)
{
if (importedObj != null)
{
string[] values;
float v1, v2, v3;
switch (key)
{
case KEY_FREQ:
importedObj.GetComponent<AudioSource>().pitch = Mathf.Clamp(float.Parse(value), AUDIO_MIN_PITCH, AUDIO_MAX_PITCH);
break;
case KEY_MAX_DIST:
importedObj.GetComponent<AudioSource>().maxDistance = float.Parse(value);
break;
case KEY_MIN_DIST:
importedObj.GetComponent<AudioSource>().minDistance = float.Parse(value);
break;
case KEY_NAME:
importedObj.name = value;
break;
case KEY_POSITION:
values = value.Replace(" ", "").Split(SPLIT_VALUE_CHAR);
v1 = float.Parse(values[0]) * scale.x + trans.x;
v2 = float.Parse(values[1]) * scale.y + trans.y;
v3 = float.Parse(values[2]) * scale.z + trans.z;
importedObj.transform.localPosition = new Vector3(v1, v2, v3);
break;
case KEY_SND_NAME:
importedObj.GetComponent<AudioSource>().clip = GetAudioClip(value);
break;
case KEY_VOLUME:
importedObj.GetComponent<AudioSource>().volume = Mathf.Clamp01(float.Parse(value));
break;
}
}
// количество объектов
if (objectsCount == 0 && key.Equals(KEY_OBJECTS_COUNT))
{
objectsCount = int.Parse(value);
}
}


private AudioClip GetAudioClip(string value)
{
AudioClip audioClip = null;
value = value.Replace('\\', CHAR_FILE_SEPARATE);
int lastIndexSep = value.LastIndexOf(CHAR_FILE_SEPARATE);
string searchFolder = pathAssetsSound;
string soundName = value;
if (lastIndexSep != -1)
{
soundName = value.Substring(lastIndexSep + 1);
searchFolder += CHAR_FILE_SEPARATE + value.Substring(0, lastIndexSep);
}
string[] assetesGuid = AssetDatabase.FindAssets(soundName + " t:AudioClip", new string[] { searchFolder });
if (assetesGuid != null && assetesGuid.Length > 0)
{
foreach (string guid in assetesGuid)
{
audioClip = Resources.LoadAssetAtPath<AudioClip>(AssetDatabase.GUIDToAssetPath(guid));
if (audioClip.name.Equals(soundName))
{
break;
}
}
}
else
{
Debug.LogWarning(System.String.Format("Не найден звуковой файл: {0}", value));
}
return audioClip;
}

}
}

Файл не удаётся прикрепить, поэтому скинул код...
RedMagic
В CoC баг со спавном в режиме виживания (survival mode), никто не знает? После сна спавнится ~80-100+ зомбированных рядом с ГГ. Похоже, настройки спавна монстров/НПС и радиус запрета спавна вокруг ГГ вообще не работает в этом режиме. Специально даже их применял, перезапускал игру и начинал новую игру.

И второй вопрос - можно как-то отключить коллизию трупов и НПС в ЗП/CoC? У меня жуткие лаги (~2fps) после такого спавна. Или логику им упростить (но, похоже, именно физика все нагружает). Забавно, но даже с такой частотой кадров сама игра более-менее работает (помимо частоты кадров все остальное особо не замедлилось) и даже вполне интересно играть. Почти как в Super Hot - хедшот, хедшот, побежал и подобрал новое оружие, хедшот, уворот и т.д., только мир не замирает если не двигаться и пару вещей не работают (бросание гранат, удар ножом).

Просто скриншот из Мертвого Города



После рабочего дня (на скриншоте плохо видно, но зомби спускаются по лестнице и покидают здание)



Party Hard devil2.gif
На самом деле зомби просто прибежали ко мне (я в комнате слева, на последнем этаже), но зайти не могут (видимо, аи сетки в ту комнату нет). На первых скриншотах еще видно как зомби буквально стоят друг на друге.

    

PS: наверняка на динамике все смотрелось бы куда интереснее, но у меня даже на статике 2fps с таким спавном biggrin.gif
Cossack-HD
Цитата(7.9 @ 14.10.2017, 21:36) *
То есть, сидит такой постановщик (весь такой режисёр и дизайнер) за компом, ставит сцены (или настраивает а-лайф), а рядом с ним пара скриптеров, и если что они ему инструментик -- ррраз, и он дальше всё ещё лучше ставить начинает...
Если всё правда так -- я то-же люблю Юнити.

Эмм, рядом никто не сидит. Они первую игру сделали практически не встречаясь друг с другом в реале - большинство разрабов встретились вместе уже на первом показе их игры на E3 - там уже была готова вся основная механика и минимум тредь игрового мира в почти финальном оформлении. У них там разрабы из Европы, Австралии, США... но всё равно игра получилась очень целостной, как будто один человек всё сделал. Оказалось, композитор их всех вдохновил. Т.е. игру написали/нарисовали по музыке, а музыка - это язык эмоций. Так что они добились вполне предсказуемого вау эффекта rolleyes.gif
Вместо разгребания XRAY-подобных палок в колёсах, они пользовались творческой свободой и удобным SDK.

Цитата(STALKER2011x @ 15.10.2017, 13:40) *
И второй вопрос - можно как-то отключить коллизию трупов и НПС в ЗП/CoC? У меня жуткие лаги (~2fps) после такого спавна.

Поставь скриптовый уборщик трупов для зомбарей или настрой уже существующий уборщик (наверняка есть) на более агрессивную уборку laugh.gif
Xottab_DUTY
Цитата(Cossack-HD @ 15.10.2017, 14:58) *
Цитата(STALKER2011x @ 15.10.2017, 13:40) *
И второй вопрос - можно как-то отключить коллизию трупов и НПС в ЗП/CoC? У меня жуткие лаги (~2fps) после такого спавна.

Поставь скриптовый уборщик трупов для зомбарей или настрой уже существующий уборщик (наверняка есть) на более агрессивную уборку laugh.gif

Убирать ещё живых? laugh.gif
Cossack-HD
STALKER2011x, сократи радиус A-Life до метров 15 для пущего эффекта хоррора naughty.gif
RedMagic
Оф. твиттер GSC оживился totstalkir.gif

Xottab_DUTY
Начать стримчик, что ли laugh.gif
Cossack-HD
Прикольный отрывок получился laugh.gif

Это у меня там радиатор водяного охлаждения проца плавает в водке со льдом.
Ruw
Угадайте кому принадлежит эта стена



правильный ответ smile.gif

Стена принадлежит этой симпатичной тян



на минуточку отбросим подозрения, что это фей аккаунт

действительно существуют девушки фанатеющие по сталкеру?

С этим вопросом я пошёл изучать базу подписчиков больших сталкерских групп
https://vk.com/test.stalker

и судя по всему да..существуют


вот они, типичные фанатки сталкера









GoodBadMan
Цитата(Ruw @ 16.10.2017, 01:22) *
действительно существуют девушки фанатеющие по сталкеру?
и судя по всему да..существуют

Ого, девушки играют в сталкер, ого, девушки играют в игры, ого, девушки тоже могут любить игры, ого, да как такое вообще возможно?
Cossack-HD
Цитата(GoodBadMan @ 16.10.2017, 06:58) *
Цитата(Ruw @ 16.10.2017, 01:22) *
действительно существуют девушки фанатеющие по сталкеру?
и судя по всему да..существуют

Ого, девушки играют в сталкер, ого, девушки играют в игры, ого, девушки тоже могут любить игры, ого, да как такое вообще возможно?

Ого, девушки - тоже люди!
Сколько есть косплеерш всяких там Fallout'ов, TES'ов и прочих Warcraft'ов?

Один одноклассник как-то оговорился на презентации, сказал "люди и женщины" (manniskor och kvinnor) biggrin.gif
1_A
Ого, девушки существуют.
Ким
Это ловушка!
1_A
Ким, тык, осторожно маты
Loki
Вы вси врёти! Девушки не могут играть в игры!1 Это обман, похожий на синий туман! biggrin.gif
Kontro-zzz
Цитата
X-Ray SDK очень неудобен

как и ламповый усилок(в процессе сборки), но с тем самым ламповым звуком.
И характеристики у него хреновые. happy.gif А звучит цука лучше, чем современные.
Или всерьез думаешь что кто-то из местных захочет вступить в Юннаты.?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.