Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!
> Разговоры у барной стойки
ДмитрийТ
сообщение 10.01.2011, 06:08
Сообщение #14981


СССР
********************

Репутация:   760  
Группа: Участник
Сообщений: 4400
Регистрация: 28.12.2008




Вставить ник Цитировать выделенное в форуму быстрого ответа


S.T.A.L.K.E.R.: Bundle

Дорогие друзья, хочу немного прояснить Вам ситуацию, во избежание превращения бара в "Филиал СП на gameru.net".

1. Флудилка будет такой, какой сделаете ее Вы, если все же у Вас возникнет непреодолимое желание превратить тему в шоу "Цирк уехал, клоуны остались", ни я ни администрация препятствовать в этом не будем, только подумайте оно вам надо.
2. Все правила описанные в первом посте, кроме нового по поводу архивов, действовали в данном разделе и ранее.
3. Напоминаю что данная тема предназначена прежде всего для свободного общения на около сталкеровские темы, но это не означает что в ней нужно обсуждать вопросы, для обсуждения которых созданы не только отдельные темы но и целые разделы.
Например обсудить или задать вопросы по игре "Метро "2033" можно тут http://www.gameru.net/forum/index.php?showforum=257.

И последнее не бойтесь создавать новые темы в Баре, если Вы сомневаетесь в адекватности темы и боитесь что за ее создание Вас могут забанить, пишите модератору раздела, разберемся.

P.S. Не забывайте новое правило:
В ДАННОЙ ТЕМЕ СТРОГО ЗАПРЕЩЕНО ВЫКЛАДЫВАТЬ ЗАПАРОЛЕННЫЕ АРХИВЫ, КАК С УКАЗАНИЕМ ПАРОЛЯ ТАК И БЕЗ ОНОГО.

Сообщение отредактировал tom-m15 - 27.08.2017, 17:24
Причина редактирования: Напильник


--------------------
Internet Explorer это такая программа, с помощью которой можно зайти на сайт www.mozilla.com и скачать себе браузер...
На презентации Internet Explorer 9 парализованный мальчик встал и вышел =)
Безалкогольное пиво - первый шаг к резиновой женщине.

"...если человек не курит, не пьет... поневоле возникает вопрос - а не сволочь ли он…" А.П.Чехов
Перейти в начало страницы
 
949 страниц V  « < 748 749 750 751 752 > »   
Начать новую тему
Ответов
abramcumner
сообщение 14.10.2017, 11:43
Сообщение #14982


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Cossack-HD @ 13.10.2017, 23:43) *
Я тут говорил о важности итеративности разработки и удобстве SDK. Собственно, вот эталонЪ SDK, который работает на дизайнеров.

Мне показалось или ролике долго водили мышкой, много болтали, но так в своем чудесном сдк не поменяли ни одного параметра? biggrin.gif
Перейти в начало страницы
 
Cossack-HD
сообщение 14.10.2017, 13:35
Сообщение #14983


TECHNOSLAV 80 уровня
**********************

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

DOF меняли, например.
То был пример интерактивной разработки полноценного трейлера непосредственно в движке игры, с возможностью перематывать до любого кадра с учётом физики в реальном времени. Показал он меньше, чем рассказал. Он упоминал возможности настройки AI.


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
RedMagic
сообщение 14.10.2017, 18:10
Сообщение #14984


Высший Игровой Бог
************************

Репутация:   1747  
Группа: Супермодератор
Сообщений: 12594
Награды: 15
Регистрация: 05.11.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(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
сообщение 14.10.2017, 19:36
Сообщение #14985


Продвинутый геймер
********

Репутация:   33  
Группа: Участник
Сообщений: 339
Награды: 4
Регистрация: 11.09.2008




Вставить ник Цитировать выделенное в форуму быстрого ответа


То есть, сидит такой постановщик (весь такой режисёр и дизайнер) за компом, ставит сцены (или настраивает а-лайф), а рядом с ним пара скриптеров, и если что они ему инструментик -- ррраз, и он дальше всё ещё лучше ставить начинает...
Если всё правда так -- я то-же люблю Юнити.

Сообщение отредактировал 7.9 - 14.10.2017, 19:38


--------------------
Всё легко, но все хлюпики.
Перейти в начало страницы
 
Р.М.А.
сообщение 15.10.2017, 10:48
Сообщение #14986


Продвинутый геймер
********

Репутация:   157  
Группа: Участник
Сообщений: 377
Награды: 4
Регистрация: 13.08.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(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
сообщение 15.10.2017, 11:40
Сообщение #14987


Высший Игровой Бог
************************

Репутация:   1747  
Группа: Супермодератор
Сообщений: 12594
Награды: 15
Регистрация: 05.11.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

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



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



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

    

PS: наверняка на динамике все смотрелось бы куда интереснее, но у меня даже на статике 2fps с таким спавном biggrin.gif


--------------------
Перейти в начало страницы
 
Cossack-HD
сообщение 15.10.2017, 12:58
Сообщение #14988


TECHNOSLAV 80 уровня
**********************

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

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

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

Сообщение отредактировал Cossack-HD - 15.10.2017, 12:56


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
Xottab_DUTY
сообщение 15.10.2017, 13:17
Сообщение #14989


Продвинутый геймер
********

Репутация:   36  
Группа: Участник
Сообщений: 267
Награды: 3
Регистрация: 09.03.2013




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

Убирать ещё живых? laugh.gif

Сообщение отредактировал Xottab_DUTY - 15.10.2017, 13:19


--------------------
OpenXRay – Ориентир на новое, с памятью о старом. © Collector
Перейти в начало страницы
 
Cossack-HD
сообщение 15.10.2017, 16:46
Сообщение #14990


TECHNOSLAV 80 уровня
**********************

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


STALKER2011x, сократи радиус A-Life до метров 15 для пущего эффекта хоррора naughty.gif


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
RedMagic
сообщение 15.10.2017, 18:13
Сообщение #14991


Высший Игровой Бог
************************

Репутация:   1747  
Группа: Супермодератор
Сообщений: 12594
Награды: 15
Регистрация: 05.11.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


Оф. твиттер GSC оживился totstalkir.gif



--------------------
Перейти в начало страницы
 
Xottab_DUTY
сообщение 15.10.2017, 18:55
Сообщение #14992


Продвинутый геймер
********

Репутация:   36  
Группа: Участник
Сообщений: 267
Награды: 3
Регистрация: 09.03.2013




Вставить ник Цитировать выделенное в форуму быстрого ответа


Начать стримчик, что ли laugh.gif


--------------------
OpenXRay – Ориентир на новое, с памятью о старом. © Collector
Перейти в начало страницы
 
Cossack-HD
сообщение 15.10.2017, 21:19
Сообщение #14993


TECHNOSLAV 80 уровня
**********************

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Прикольный отрывок получился laugh.gif

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

Сообщение отредактировал Cossack-HD - 15.10.2017, 21:20


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
Ruw
сообщение 16.10.2017, 00:22
Сообщение #14994


Игровой Бог первой степени
***********************

Репутация:   432  
Группа: Участник
Сообщений: 8787
Награды: 4
Регистрация: 21.03.2013




Вставить ник Цитировать выделенное в форуму быстрого ответа


Угадайте кому принадлежит эта стена



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

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



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

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

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

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


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











Сообщение отредактировал Ruw - 16.10.2017, 00:29


--------------------
Перейти в начало страницы
 
GoodBadMan
сообщение 16.10.2017, 04:58
Сообщение #14995


Игровой Эксперт
***************

Репутация:   530  
Группа: Участник
Сообщений: 2288
Награды: 3
Регистрация: 25.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

Ого, девушки играют в сталкер, ого, девушки играют в игры, ого, девушки тоже могут любить игры, ого, да как такое вообще возможно?
Перейти в начало страницы
 
Cossack-HD
сообщение 16.10.2017, 09:38
Сообщение #14996


TECHNOSLAV 80 уровня
**********************

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

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

Один одноклассник как-то оговорился на презентации, сказал "люди и женщины" (manniskor och kvinnor) biggrin.gif

Сообщение отредактировал Cossack-HD - 16.10.2017, 09:39


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
1_A
сообщение 16.10.2017, 10:35
Сообщение #14997


Продвинутый геймер
********

Репутация:   104  
Группа: Участник
Сообщений: 336
Награды: 4
Регистрация: 13.12.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Ого, девушки существуют.


--------------------
Перейти в начало страницы
 
Ким
сообщение 16.10.2017, 10:48
Сообщение #14998


В Пальто
**********************

Репутация:   930  
Группа: Участник
Сообщений: 6980
Награды: 8
Регистрация: 18.07.2008




Вставить ник Цитировать выделенное в форуму быстрого ответа


Это ловушка!
Перейти в начало страницы
 
1_A
сообщение 16.10.2017, 11:13
Сообщение #14999


Продвинутый геймер
********

Репутация:   104  
Группа: Участник
Сообщений: 336
Награды: 4
Регистрация: 13.12.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Ким, тык, осторожно маты

Сообщение отредактировал tom-m15 - 16.10.2017, 11:20
Причина редактирования: #FF0000 пререготива администрации.


--------------------
Перейти в начало страницы
 
Loki
сообщение 16.10.2017, 11:15
Сообщение #15000


Кот в сапогах
***************

Репутация:   679  
Группа: Участник
Сообщений: 2236
Награды: 7
Регистрация: 12.05.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Вы вси врёти! Девушки не могут играть в игры!1 Это обман, похожий на синий туман! biggrin.gif


--------------------

Перейти в начало страницы
 
Kontro-zzz
сообщение 16.10.2017, 13:15
Сообщение #15001


Почти Игроман
*********

Репутация:   96  
Группа: Участник
Сообщений: 594
Награды: 3
Регистрация: 26.10.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата
X-Ray SDK очень неудобен

как и ламповый усилок(в процессе сборки), но с тем самым ламповым звуком.
И характеристики у него хреновые. happy.gif А звучит цука лучше, чем современные.
Или всерьез думаешь что кто-то из местных захочет вступить в Юннаты.?

Сообщение отредактировал Kontro-zzz - 16.10.2017, 13:22


--------------------
Будиш маму-папу слушать
Будиш ты канфеты кушать!
© Операция «Ы»
Перейти в начало страницы
 

949 страниц V  « < 748 749 750 751 752 > » 
Ответить в данную темуНачать новую тему
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 25.04.2024, 14:03