Разговоры у барной стойки |
Здравствуйте, гость ( Авторизация | Регистрация )
Разговоры у барной стойки |
10.01.2011, 06:08
Сообщение
#14981
|
|
СССР Репутация: 760 Группа: Участник Сообщений: 4400 Регистрация: 28.12.2008 |
Дорогие друзья, хочу немного прояснить Вам ситуацию, во избежание превращения бара в "Филиал СП на 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 парализованный мальчик встал и вышел =) Безалкогольное пиво - первый шаг к резиновой женщине. "...если человек не курит, не пьет... поневоле возникает вопрос - а не сволочь ли он…" А.П.Чехов |
 
|
|
|
|
14.10.2017, 11:43
Сообщение
#14982
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
|
 
|
|
14.10.2017, 13:35
Сообщение
#14983
|
|
TECHNOSLAV 80 уровня Репутация: 379 Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
Я тут говорил о важности итеративности разработки и удобстве SDK. Собственно, вот эталонЪ SDK, который работает на дизайнеров. Мне показалось или ролике долго водили мышкой, много болтали, но так в своем чудесном сдк не поменяли ни одного параметра? DOF меняли, например. То был пример интерактивной разработки полноценного трейлера непосредственно в движке игры, с возможностью перематывать до любого кадра с учётом физики в реальном времени. Показал он меньше, чем рассказал. Он упоминал возможности настройки AI. -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
 
|
|
14.10.2017, 18:10
Сообщение
#14984
|
|
Высший Игровой Бог Репутация: 1747 Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Я тут говорил о важности итеративности разработки и удобстве SDK. Собственно, вот эталонЪ SDK, который работает на дизайнеров. Так это же Unity Естественно он один из самых удобных (если вообще не самый удобный) движков. Я уже давно говорил что при желании можно даже С2 сделать на нем (с бесшовной зоной, алайфом и прочим), ничуть не хуже оригинальных игр (кроме производительности, все имеет свою цену ). X-Ray SDK очень неудобен. Он хорошо выполнял свои функции в свое время, но сейчас все то же самое можно сделать в сотни раз удобнее и быстрее. Отключить лайтмапинг/настроить освещение - одна галочка во вкладке управления освещением в Unity. Нужно сделать WYSYWYG редактор НПС? Пожалуйста, сделали один скрипт и теперь в отдельной вкладке редактора можно в реалтайме менять все характеристики. Редактор погоды? Аналогично - делаем скрипт редактора и можем сразу все посмотреть и настроить. АИ сетка? Чик-чик и готово, а если что - можно за несколько секунд все поправить ручками (добавить зону укрытий, прыжков и т.д.). Добавлять и редактировать диалоги всех НПС с заданием условий для квестов? Пожалуйста, можно даже настроить автоматический экспорт сгенерированных строк в вашу любимую систему перевода (а заодно и проверкой орфографии), синхронизацией с игрой и переключением языка прямо во время игры, для тестирования (чтобы не было как в ТЧ в одном из первых диалогов с Волком "Нло" вместо "Но"). Быстрое прототипирование задач - без проблем. Например, взбрело в голову посмотреть что видят НПС во время симуляции в реалтайме - создаем новый скрипт который добавляет каждому НПС камеру, собираем их вместе и выводим изображение с них (в Unity это называется рендер в текстуру) на большой телевизор в центральном зале (а поверх изображения можно еще телеметрию наложить. Здоровье, список предметов в инвентаре и т.д.). Зачем? Просто так. Потому что можем А еще смотреть перестрелку НПС одновременно с разных точек зрения может быть довольно занятно. Про такие мелочие как настройка пост-эффектов камеры я даже даже говорить не буду. Как все уже поняли, это был пост человека которому нравится Unity -------------------- |
 
|
|
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 |
он дальше всё ещё лучше ставить начинает Удобно. Я так себе скрипт для редактора юнити писал, который читал настройки карт из 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; } } } Файл не удаётся прикрепить, поэтому скинул код... -------------------- |
 
|
|
15.10.2017, 11:40
Сообщение
#14987
|
|
Высший Игровой Бог Репутация: 1747 Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
В CoC баг со спавном в режиме виживания (survival mode), никто не знает? После сна спавнится ~80-100+ зомбированных рядом с ГГ. Похоже, настройки спавна монстров/НПС и радиус запрета спавна вокруг ГГ вообще не работает в этом режиме. Специально даже их применял, перезапускал игру и начинал новую игру.
И второй вопрос - можно как-то отключить коллизию трупов и НПС в ЗП/CoC? У меня жуткие лаги (~2fps) после такого спавна. Или логику им упростить (но, похоже, именно физика все нагружает). Забавно, но даже с такой частотой кадров сама игра более-менее работает (помимо частоты кадров все остальное особо не замедлилось) и даже вполне интересно играть. Почти как в Super Hot - хедшот, хедшот, побежал и подобрал новое оружие, хедшот, уворот и т.д., только мир не замирает если не двигаться и пару вещей не работают (бросание гранат, удар ножом). Просто скриншот из Мертвого Города После рабочего дня (на скриншоте плохо видно, но зомби спускаются по лестнице и покидают здание) Party Hard На самом деле зомби просто прибежали ко мне (я в комнате слева, на последнем этаже), но зайти не могут (видимо, аи сетки в ту комнату нет). На первых скриншотах еще видно как зомби буквально стоят друг на друге. PS: наверняка на динамике все смотрелось бы куда интереснее, но у меня даже на статике 2fps с таким спавном -------------------- |
 
|
|
15.10.2017, 12:58
Сообщение
#14988
|
|
TECHNOSLAV 80 уровня Репутация: 379 Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
То есть, сидит такой постановщик (весь такой режисёр и дизайнер) за компом, ставит сцены (или настраивает а-лайф), а рядом с ним пара скриптеров, и если что они ему инструментик -- ррраз, и он дальше всё ещё лучше ставить начинает... Если всё правда так -- я то-же люблю Юнити. Эмм, рядом никто не сидит. Они первую игру сделали практически не встречаясь друг с другом в реале - большинство разрабов встретились вместе уже на первом показе их игры на E3 - там уже была готова вся основная механика и минимум тредь игрового мира в почти финальном оформлении. У них там разрабы из Европы, Австралии, США... но всё равно игра получилась очень целостной, как будто один человек всё сделал. Оказалось, композитор их всех вдохновил. Т.е. игру написали/нарисовали по музыке, а музыка - это язык эмоций. Так что они добились вполне предсказуемого вау эффекта Вместо разгребания XRAY-подобных палок в колёсах, они пользовались творческой свободой и удобным SDK. И второй вопрос - можно как-то отключить коллизию трупов и НПС в ЗП/CoC? У меня жуткие лаги (~2fps) после такого спавна. Поставь скриптовый уборщик трупов для зомбарей или настрой уже существующий уборщик (наверняка есть) на более агрессивную уборку Сообщение отредактировал Cossack-HD - 15.10.2017, 12:56 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
 
|
|
15.10.2017, 13:17
Сообщение
#14989
|
|
Продвинутый геймер Репутация: 36 Группа: Участник Сообщений: 267 Награды: 3 Регистрация: 09.03.2013 |
И второй вопрос - можно как-то отключить коллизию трупов и НПС в ЗП/CoC? У меня жуткие лаги (~2fps) после такого спавна. Поставь скриптовый уборщик трупов для зомбарей или настрой уже существующий уборщик (наверняка есть) на более агрессивную уборку Убирать ещё живых? Сообщение отредактировал Xottab_DUTY - 15.10.2017, 13:19 -------------------- OpenXRay – Ориентир на новое, с памятью о старом. © Collector
|
 
|
|
15.10.2017, 16:46
Сообщение
#14990
|
|
TECHNOSLAV 80 уровня Репутация: 379 Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
STALKER2011x, сократи радиус A-Life до метров 15 для пущего эффекта хоррора
-------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
 
|
|
15.10.2017, 18:13
Сообщение
#14991
|
|
Высший Игровой Бог Репутация: 1747 Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
-------------------- |
 
|
|
15.10.2017, 18:55
Сообщение
#14992
|
|
Продвинутый геймер Репутация: 36 Группа: Участник Сообщений: 267 Награды: 3 Регистрация: 09.03.2013 |
Начать стримчик, что ли
-------------------- OpenXRay – Ориентир на новое, с памятью о старом. © Collector
|
 
|
|
15.10.2017, 21:19
Сообщение
#14993
|
|
TECHNOSLAV 80 уровня Репутация: 379 Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
Прикольный отрывок получился
Это у меня там радиатор водяного охлаждения проца плавает в водке со льдом. Сообщение отредактировал Cossack-HD - 15.10.2017, 21:20 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
 
|
|
16.10.2017, 00:22
Сообщение
#14994
|
|
Игровой Бог первой степени Репутация: 432 Группа: Участник Сообщений: 8787 Награды: 4 Регистрация: 21.03.2013 |
Угадайте кому принадлежит эта стена
правильный ответ Стена принадлежит этой симпатичной тян на минуточку отбросим подозрения, что это фей аккаунт действительно существуют девушки фанатеющие по сталкеру? С этим вопросом я пошёл изучать базу подписчиков больших сталкерских групп и судя по всему да..существуют вот они, типичные фанатки сталкера Сообщение отредактировал Ruw - 16.10.2017, 00:29 -------------------- |
 
|
|
16.10.2017, 04:58
Сообщение
#14995
|
|
Игровой Эксперт Репутация: 530 Группа: Участник Сообщений: 2288 Награды: 3 Регистрация: 25.09.2010 |
|
 
|
|
16.10.2017, 09:38
Сообщение
#14996
|
|
TECHNOSLAV 80 уровня Репутация: 379 Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
действительно существуют девушки фанатеющие по сталкеру? и судя по всему да..существуют Ого, девушки играют в сталкер, ого, девушки играют в игры, ого, девушки тоже могут любить игры, ого, да как такое вообще возможно? Ого, девушки - тоже люди! Сколько есть косплеерш всяких там Fallout'ов, TES'ов и прочих Warcraft'ов? Один одноклассник как-то оговорился на презентации, сказал "люди и женщины" (manniskor och kvinnor) Сообщение отредактировал Cossack-HD - 16.10.2017, 09:39 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
 
|
|
16.10.2017, 10:35
Сообщение
#14997
|
|
Продвинутый геймер Репутация: 104 Группа: Участник Сообщений: 336 Награды: 4 Регистрация: 13.12.2011 |
Ого, девушки существуют.
-------------------- |
 
|
|
16.10.2017, 10:48
Сообщение
#14998
|
|
В Пальто Репутация: 930 Группа: Участник Сообщений: 6980 Награды: 8 Регистрация: 18.07.2008 |
Это ловушка!
|
 
|
|
16.10.2017, 11:13
Сообщение
#14999
|
|
Продвинутый геймер Репутация: 104 Группа: Участник Сообщений: 336 Награды: 4 Регистрация: 13.12.2011 |
Ким,
Сообщение отредактировал tom-m15 - 16.10.2017, 11:20
Причина редактирования: #FF0000 пререготива администрации.
-------------------- |
 
|
|
16.10.2017, 11:15
Сообщение
#15000
|
|
Кот в сапогах Репутация: 679 Группа: Участник Сообщений: 2236 Награды: 7 Регистрация: 12.05.2010 |
Вы вси врёти! Девушки не могут играть в игры!1 Это обман, похожий на синий туман!
-------------------- |
 
|
|
16.10.2017, 13:15
Сообщение
#15001
|
|
Почти Игроман Репутация: 96 Группа: Участник Сообщений: 594 Награды: 3 Регистрация: 26.10.2012 |
Цитата X-Ray SDK очень неудобен как и ламповый усилок(в процессе сборки), но с тем самым ламповым звуком. И характеристики у него хреновые. А звучит цука лучше, чем современные. Или всерьез думаешь что кто-то из местных захочет вступить в Юннаты.? Сообщение отредактировал Kontro-zzz - 16.10.2017, 13:22 -------------------- Будиш маму-папу слушать
Будиш ты канфеты кушать! © Операция «Ы» |
 
|
|
Текстовая версия | Сейчас: 25.04.2024, 14:03 |