Цитата(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;
}
}
}
Файл не удаётся прикрепить, поэтому скинул код...