Миры невиртуальной реальности - Страница 2 - Форум - Все для Unity3d

Все для Unity3d> Миры невиртуальной реальности - Страница 2 - Форум>
Страница 2 из 5«12345»
Архив - только для чтения
Форум » Разработка » Корзина » Миры невиртуальной реальности (игры по новой вселенной)
Миры невиртуальной реальности
devpilgrimДата: Воскресенье, 27.04.2014, 20:29 | Сообщение # 16
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
Цитата Niyana ()
Разберемся.

тогда вот наборчик ссылок на то, что я сам смотрел, качал и т.д. Отсеивать не стал, просто выдрал с торент клиента... Есть и барахло, но 90% - то что нужно для начала...
http://rutracker.org/forum/viewtopic.php?t=4683868
http://rutracker.org/forum/viewtopic.php?t=4653234
http://rutracker.org/forum/viewtopic.php?t=4575384
http://rutracker.org/forum/viewtopic.php?t=4550521
http://rutracker.org/forum/viewtopic.php?t=4549651
http://rutracker.org/forum/viewtopic.php?t=4516680
http://rutracker.org/forum/viewtopic.php?t=4484770
http://rutracker.org/forum/viewtopic.php?t=4476035
http://rutracker.org/forum/viewtopic.php?t=4472330
http://rutracker.org/forum/viewtopic.php?t=4470435
http://rutracker.org/forum/viewtopic.php?t=4297807
http://rutracker.org/forum/viewtopic.php?t=4648379
http://rutracker.org/forum/viewtopic.php?t=4642197
http://rutracker.org/forum/viewtopic.php?t=4641352
http://rutracker.org/forum/viewtopic.php?t=4623116
http://rutracker.org/forum/viewtopic.php?t=4620520
http://rutracker.org/forum/viewtopic.php?t=4475367
http://rutracker.org/forum/viewtopic.php?t=4475357
http://rutracker.org/forum/viewtopic.php?t=4467679
http://rutracker.org/forum/viewtopic.php?t=4460440
http://rutracker.org/forum/viewtopic.php?t=4402306
http://rutracker.org/forum/viewtopic.php?t=4309907
http://rutracker.org/forum/viewtopic.php?t=4138816
http://rutracker.org/forum/viewtopic.php?t=4103356
http://rutracker.org/forum/viewtopic.php?t=4102473
http://rutracker.org/forum/viewtopic.php?t=4093433
http://rutracker.org/forum/viewtopic.php?t=4099966
http://rutracker.org/forum/viewtopic.php?t=4072119
http://rutracker.org/forum/viewtopic.php?t=4072118
http://rutracker.org/forum/viewtopic.php?t=4070875
http://rutracker.org/forum/viewtopic.php?t=4046778
http://rutracker.org/forum/viewtopic.php?t=4046573
http://rutracker.org/forum/viewtopic.php?t=4046562
http://rutracker.org/forum/viewtopic.php?t=3932148
http://rutracker.org/forum/viewtopic.php?t=3932102
http://rutracker.org/forum/viewtopic.php?t=3880176
http://rutracker.org/forum/viewtopic.php?t=3880107
http://rutracker.org/forum/viewtopic.php?t=3880131
http://rutracker.org/forum/viewtopic.php?t=3880081
http://rutracker.org/forum/viewtopic.php?t=3880054
http://rutracker.org/forum/viewtopic.php?t=3880010
http://rutracker.org/forum/viewtopic.php?t=3932007
http://rutracker.org/forum/viewtopic.php?t=4041891


Готов работать за деньги, или за очень большие деньги.
 
devpilgrimДата: Воскресенье, 27.04.2014, 20:46 | Сообщение # 17
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
Ну и то, как я это все умудряюсь смотреть smile
Включаю проигрывание и работаю, если что интересное, переключаюсь на видео, отматываю, просматриваю...


Готов работать за деньги, или за очень большие деньги.
 
NiyanaДата: Воскресенье, 27.04.2014, 22:39 | Сообщение # 18
Новый писатель
Группа: Пользователи
Сообщений: 27
Статус: Offline
Жаль что тебя сегодня чтото задержало однако все таки надеюсь что мы сможем провести конференцию и поговорить. Возможно на неделе. ЗА ссылки спасибо посмотрим что и как.

В каждом из нас спит гений. И с каждым днем все крепче.
 
devpilgrimДата: Воскресенье, 27.04.2014, 22:43 | Сообщение # 19
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
Цитата Niyana ()
Жаль что тебя сегодня чтото задержало

Пробки - будь они не ладны, пока доехал, пока домой зашел...


Готов работать за деньги, или за очень большие деньги.
 
zubalexДата: Понедельник, 28.04.2014, 12:58 | Сообщение # 20
Новый писатель
Группа: Пользователи
Сообщений: 16
Статус: Offline
to devpilgrim:

ссылки посмотрел, уже качаю и смотрю
спасибо за помощь (я работаю над проектом вместе с Niyana)

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

конечно, готов признать, я еще наверное нуб в юнити (но кое что умею), но не нуб в прогграммировании
буду рад пообщаться в менее формальной обстановке аси, скайпа или лс


Реальность существует независимо от вас. До тех пор пока вы с этим согласны

Сообщение отредактировал zubalex - Понедельник, 28.04.2014, 13:08
 
devpilgrimДата: Понедельник, 28.04.2014, 15:02 | Сообщение # 21
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
Цитата zubalex ()
как сделать допустим повреждаеомсть противников
Проще пареной репы smile
Вешаешь на контроллер противника скрипт в котором есть переменная (например hP), при каждом попадании в противника, или при других его повреждениях (например спрыгнул с большой высоты) отнимаешь от этой переменной определенные значения. Так-же на данный скрипт можно навесить дополнительные функции по изменению характеристик противника от значения данной переменной.
Например при hP == maxHP/2 (50% здоровья) меняем анимацию idle на анимацию injuredIdle (анимация раненного), + снижаем скорость передвижения + при передвижении устраиваем рандомную болтанку камеры анимацию хромоты...
Сами же повреждения делаются следующим образом:
Повреждения от пули:
От стреляющего пускаем луч (Ray), луч нужно пускать по баллистике...
Простое вычисление баллистики:
точка от среза ствола - начальная точка Ray
конечная точка рассчитывается исходя из направления прицела +- поправки (если они предусмотрены в игре). По нажатию курка (кнопки мышки):
записываем время нажатия кнопки
рассчитываем расстояние до первого объекта который попал в RaycastHit.collider
проверяем тип объекта (RaycastHit.rigidbody или RaycastHit.transform, лучше последний, так как не нужно будет заморачиваться с rigidbody у статических объектов)
рассчитываем время попадания пули (расстояние / на скорость полета пули)
Если время попадания пули менее 1/30 секунды (~1 кадр), тогда сразу бросаем второй коллайдер, но уже со срез ствола на точку прицеливания с поправками (например на ветер, баллистическую траекторию, показатель меткости и т.д.) Так например поправка на перк sharpshooting (меткость) будет примерно такой
impactpoint.position = new Vector3(aimpoint.position.X + Random.value * sharpshooting, aimpoint.position.Y + Random.value * sharpshooting, Z);
Надеюсь логика понятна...
Ну и проверяем кто у нас попал в этот Ray. Если противник, ищем у него скрипт с переменной hP и отнимаем оттуда значения = значению повреждения пули из данного ствола.
Если на месте попадания не противник (промах), то ресуем в точке попадания декаль с пулевой отметиной...

Вот как-то так smile


Готов работать за деньги, или за очень большие деньги.
 
devpilgrimДата: Понедельник, 28.04.2014, 15:08 | Сообщение # 22
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
Цитата zubalex ()
все-таки запустить анимацию НПС с помощью кода в в скрипте

animation.Play("имя анимации"); biggrin
имя анимации должно быть из списка анимаций данного контроллера.
но запустить ее так можно только если у тебя на объекте висит именно контроллер Animation, с контроллером Animator данный фокус не пройдет, у него все завязано на систему собственных событий...


Готов работать за деньги, или за очень большие деньги.
 
zubalexДата: Понедельник, 28.04.2014, 15:30 | Сообщение # 23
Новый писатель
Группа: Пользователи
Сообщений: 16
Статус: Offline
Цитата devpilgrim ()
animation.Play("имя анимации"); имя анимации должно быть из списка анимаций данного контроллера. но запустить ее так можно только если у тебя на объекте висит именно контроллер Animation, с контроллером Animator данный фокус не пройдет, у него все завязано на систему собственных событий...


Спасибо за оперативный ответ. Какой контроллер предпочтительнее?


Реальность существует независимо от вас. До тех пор пока вы с этим согласны
 
devpilgrimДата: Понедельник, 28.04.2014, 15:34 | Сообщение # 24
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
Цитата zubalex ()
Какой контроллер предпочтительнее?

А тут нет такого понятия smile Хотите универсальный автоматический контроллер с учетом физики и т.д. - Animator, хотите жесткий программный контроль над анимацией - Animation. Это настолько разные вещи, что сравнивать какой лучше, какой хуже - не корректно, все зависит от того подхода к анимации который для Вас более удобен.


Готов работать за деньги, или за очень большие деньги.
 
zubalexДата: Понедельник, 28.04.2014, 16:14 | Сообщение # 25
Новый писатель
Группа: Пользователи
Сообщений: 16
Статус: Offline
Цитата devpilgrim ()
А тут нет такого понятия Хотите универсальный автоматический контроллер с учетом физики и т.д. - Animator, хотите жесткий программный контроль над анимацией - Animation. Это настолько разные вещи, что сравнивать какой лучше, какой хуже - не корректно, все зависит от того подхода к анимации который для Вас более удобен.


В данном случае мне подойдет Animator)
Если честно посмотрел десятки уроков на разные темы - в голове стало ясно.. чего не могу сказать о своем проекте.
Один урок учит делать гуи, один урок учит АИ, один учить создавать вот такой терраин (простите мне русские буквы в терминах, неудобно переключаться smile ), еще другие уроки учат делать фпс-контроллер, уроки АИ. А вот как сделать чтобы это все вместе работало? Например как сделать чтобы игрок стрелял из пистолета, "пуля" (или ее виртуальный аналог) попадла в НПС-солдата, у солдата проигрывался звук повреждения (крик), проигрывалась анимация попадания (отброс назад), отображался сплеш крови на теле, при этом еще у солдата снимались хитпоинты и провералось условие смерти (с соотв.анимацией в случае смерти)? Система получается нетривиальная, даже учитывая такой мощный инструмент, как Юнити.

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

Резюме. Что мы имем? Нет понимания как сочетать это все вместе в игре жанра фпс (шутер от 1 лица), нет идей как этого понимания достичь. Тупик ментальный, 1 штука. smile
Хотя я могу создать сцену с фпс контроллером, сцену с анимацией кубика, сцену с гуи. А вот сделать так, чтобы это все гармонично сопрягалось... тут начинаются танцы с бубном. Ответ сидит где-то у меня в подсознании (чувствую что могу), но не знаю как.... Может быть вы или ваши коллеги сталкивались с такой ситуэйшн... В любом случае, интересно будет узнать ваше мнение по вопросу. Может пошлете на какой нибудь урок или мануал или книгу, после которой "мозг встанет на место", может что еще что нибудь проясните начинающему разработчику игр под Юнити...


Реальность существует независимо от вас. До тех пор пока вы с этим согласны

Сообщение отредактировал zubalex - Понедельник, 28.04.2014, 16:14
 
devpilgrimДата: Понедельник, 28.04.2014, 18:01 | Сообщение # 26
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
Цитата zubalex ()
Нет понимания как сочетать это все вместе

Ага, вот главный вопрос smile
И есть ответ на него у меня smile
Правда ответ будет не маленьким, придется для иллюстрации начертить несколько диаграмм...
Так что буду я это делать вечером, а вы увидите завтра...


Готов работать за деньги, или за очень большие деньги.
 
zubalexДата: Понедельник, 28.04.2014, 22:36 | Сообщение # 27
Новый писатель
Группа: Пользователи
Сообщений: 16
Статус: Offline
Цитата devpilgrim ()
Правда ответ будет не маленьким, придется для иллюстрации начертить несколько диаграмм... Так что буду я это делать вечером, а вы увидите завтра...


С нетерпением ждем.


Реальность существует независимо от вас. До тех пор пока вы с этим согласны
 
devpilgrimДата: Вторник, 29.04.2014, 02:35 | Сообщение # 28
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
И так, поехали, но вначале оговорюсь: Все ниже изложенное относится только к самому игровому приложению.
Логика и абстракция редактора - это совсем другая песня smile

Игровое приложение на Unity отличается от простых консольных или winforms приложений в первую очередь двумя вещами, это работой в цикле и уровнем абстракции. Что в свою очередь накладывает собственные правила на разработку.
Для начала посмотрим на то, как построена архитектура приложения и на его уровни абстракции:

1 уровень - Уровень приложения. Мы имеем доступ к его переменным и методам только в ограниченном диапазоне выделенных разработчиками ресурсов, но он-то и является корнем нашего абстрактного дерева слоев. В этом уровне предопределен главный игровой цикл + отрисовка графики. Ну и связанные с ними настройки. Базовый класс данного уровня абстракции "Application".
Данный уровень естественно вызывается первым. Он запускает приложение, грузит настройки, подгружает компоненты и модули, загружает (частично) контент и после этого запускает игровой цикл

2 уровень - уровень компонентов приложения. Это во первых компоненты физики, эффектов, логики и т.д. встроенные в Unity, а так-же те, которые мы добавляем в проект в виде dll. К компонентам так-же относится и класс "MonoBehaviour" - который и отвечает за обработку всего кода написанного программистом в виде C#/boo/JS скриптов.

3 уровень - Уровень сцены. Данный уровень загружается уже внутри игрового цикла, соответственно он имеет очень ограниченный доступ ко всем остальным уровням абстракции. Данный уровень хранит данные об объектах и их логике, он то как раз и отвечает за логику всего, что происходит в той или иной сцене. При этом, вначале загружается нулевой уровень, который мы прописываем в редакторе, в настройках "Build Settings", в поле списка "Scenes in build". Все остальные сцены загружаются или из нулевого уровня, или из предыдущих загруженных сцен.
Пример: Загружается начальная сцена, в ней прописано меню нашей игры.
Из нее мы можем загрузить сцену №1 при начале новой игры, или загрузить сцену №n при загрузке сохранения, далее мы можем переходить от сцены к сцене не заходя на сцену №0...
На данном уровне абстракции основными являются классы обработки ассетов и префабов (загрузки ресурсов сцены). Они нам не то, чтобы не доступны, но работают в автономном режиме и трогать их не нужно, по крайней мере без особой на то необходимости.

4 уровень - Уровень объектов Это уже наш практически наш уровень, но мы имеем не очень много рычагов для управления им (по крайней мере если нам это не нужно) 90% обработки действий на этом уровне абстракции - манипуляция объектами, которая настраивается и программируется еще в редакторе при создании сцены. Основной класс данного уровня абстракции - GameObject.

5 уровень - Уровень компонентов объектов А вот это 100% наш уровень. Собственно только к нему мы и имеем прямой доступ от начала и до конца (ну если быть честным, не использовать рефлексию и т.д., то имеем доступ всего к 80% всех механизмов данного уровня). На этом уровне мы в принципе и реализуем всю логику, именно с этого уровня мы можем управлять всеми остальными уровнями (естественно в рамках того, что нам позволено).
Каждый компонент объекта - это скрипт который висит на одном из объектов сцены. По сути, если в сцене №0 не будет ни одного объекта на который мы можем повесить компонент, мы не сможем даже создать ни одного объекта, или запустить другую сцену - у нас просто нет прямого доступа к более низким уровням...
По этой-же причине, мы не можем объявлять собственные глобальные переменные, кроме как объявив их статичными (static)...

Веселая иерархия, не правда ли? Если сравнивать с WinForms, то нам для управления приложением дается доступ только из дочернего окна открытого в дочернем окне дочернего окна базовой формы приложения smile

Как-же с этим со всем работать? А просто, не заморачиваться и пилить гири - они золотые...
Собственно мой подход (наверное не самый оптимальный, но достаточно удобный и подходит именно тем, кто имеет груз в виде опыта программирования обычных приложений для Win).

1. Обустраиваем себе гнездышко, на костылях, но почти привычное:
Главная проблема - отсутствие глобальных переменных, точнее возможности нам самим определять эти самые переменные. Для решения данной проблемы я использую пустой объект, который передаю в качестве параметра во все остальные скрипты сцены. На него вешаю скрипты:
а) Скрипт содержащий набор переменных к которым желательно получать доступ из любого скрипта.
б) Скрипт содержащий коллекцию всех элементов сцены в List<GameObject> причем все компоненты добавляют себя в этот лист сами. Эта коллекция очень помогает потом сохранять объекты, или загружать их, ну и для других извращений может пригодится...
в) Скрипт содержащий статические методы необходимые для обработки определенной логики за пределами отдельного компонента.

2. Учимся работать от объекта:
Например, нам нужно из скрипта (компонента - привыкаем к правильной терминологии) висящего на объекте а, передать данные во все скрипты определенного типа находящиеся в радиусе 10 единиц от нас...
Проще это сделать на примере из игры:
Есть охранник, при нападении на него, или при обнаружении им противника, наш доблестный воин должен поднять тревогу, но так как он сиплый, то орет тихо и его услышат только те охранники, которые находятся в радиусе 10 метров...
Пусть охранник будет объектом с именем Guard, на нем висит скрипт Alarm который должен передать сигнал тревоги всем объектам Guard имеющим скрипт MutualAid находящимся в радиусе 10 метров. При этом скрипт
MutualAid должен отреагировать на призыв в зависимости от того, как эта реакция прописана в его настройках...
Если думать с точки зрения программиста windows приложений - задачка еще та, но вот с точки зрения нашего абстрактного слоя - плевое дело...
Итак алгоритм:
1. В компоненте Alarm прописываем условие, если напали или если заметил что-то непонятное - поднимаем тревогу. Поднятие тревоги прописываем в процедуре, в которую передаем всего 2 параметра:
Текущие координаты охранника
Тип охранника (ма-ло ли у нас несколько противоборствующих группировок)
2. Процедура начинает поиск союзников в доступном радиусе. Для этого она перебирает все компоненты MutualAid полученные из GameObject.Find("Guard").GetComponent(MutualAid), проверяет их на значение поля отвечающего за "Тип охранника", если поле тип совпадает с типом охранника - пишет в поле MutualAid координаты нашего зовущего на помощь, если нет, то тут от фантазии, например если другой охранник принадлежит к противоборствующей группировке, то соответственно он может попытаться убить противника, который к тому-же завет на помощь... Тут опять передаем параметры координат охранника и ссылку на его объект Guard, но только в другой скрипт, например в Atack...
Заметь, все это делается из компонента висящего на отдельном охраннике... То-есть, частично логика ИИ других НПС управляется не из их компонентов, не из общей логики прописанной где-то там, а из логики того объекта который первым начинает действие. Так например может сработать цепочка:
Охранник красных увидел противника -> начал звать на помощь своих -> Его услышал охранник синих -> для атаки у него прописана команда вызвать подкрепление и атаковать -> Он вызывает своих на подмогу и атакует охранника красных...
Ситуационный ИИ - просто потрясающая штука, например персонаж управляющий игроком может вызвать свалку бойню между двумя группами охранников просто попавшись одному из противников на глаза...
3. Далее меняем у всех компонентов которые прошли по условиям переменную отвечающую за местонахождение охранника и запускаем процедуру заставляющую бежать на помощь...
gameObject.SendMessage ("Act", Vector3Coordinates);
Здесь стоит заметить, что процедура Act находящаяся в скрипте MutualAid или в скрипте Atack сработают одинаково для gameObject которому мы посылаем SendMessage, если-же такой процедуры нет, ни в одном компоненте объекта, то и не произойдет ничего...

Понимаю, что все немного сумбурно, но я не писатель smile
В общем, я думаю главное тут понять, что у тебя нет единной точки приложения усилий. Ты не можешь управлять логикой всего приложения из одного места, ты управляешь логикой одного объекта, который в свою очередь может влиять на логику других объектов по средством компонентов (скриптов), которые на нем висят...

Ну и для того, чтобы тебя совсем запутать, или наоборот, советую почитать статью с хабра: Порядок событий в Unity3D, она как раз показывает то, как и когда события из разных уровней абстракции игры выполняются...

Фух, на этом пока все, дальше задавай вопросы... Надеюсь хоть чуть чуть развеял туман smile


Готов работать за деньги, или за очень большие деньги.
 
zubalexДата: Вторник, 29.04.2014, 07:37 | Сообщение # 29
Новый писатель
Группа: Пользователи
Сообщений: 16
Статус: Offline
Цитата devpilgrim ()
Понимаю, что все немного сумбурно, но я не писатель


Почему? Очень понятно и внятно все описал, причем "с ходу". Супер!

Цитата devpilgrim ()
у тебя нет единной точки приложения усилий. Ты не можешь управлять логикой всего приложения из одного места, ты управляешь логикой одного объекта, который в свою очередь может влиять на логику других объектов по средством компонентов (скриптов), которые на нем висят


Ох, ёжкин кот..... У меня нет цензурных слов. Я-то наивный привык контролировать (непосредсвтвенно или опосредовано) практически все ресурсы. Придется учится с нуля новому стилю программирования (от объекта), причем достатчно извращенному с точки зрения программиста c опытом WinForms, Asp.net, assembler и C.
Да я даже не знаю где найти аналоги этому.... Разве что веб-страницы на javasctipt+php. Там работаешь "от объекта", но возможности правда другие, не так тесно.

Резюме. Мой вопрос: Как быть с глобальными таймерами (например таймер день/ночь меняющий не только освещенность сцены, но и наличие хищников на улице), фоновой музыкой и т.п.? Возможно, стоит создать объект SceneController (или несколько мелких BlueGuardsController, RedGiuardController, TurretController и т.д.) который будет управлять другими объектами сцены ? Стоит ли? Или это вызовет сильные тормоза - низкий frame rate?

P.S. Наверняка мировым сообществом (программистов unity smile )уже наработаны некоторые приемы, изобретать велосипед не хотелось бы.


Реальность существует независимо от вас. До тех пор пока вы с этим согласны
 
devpilgrimДата: Вторник, 29.04.2014, 08:05 | Сообщение # 30
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
Так и не нужно ничего изобретать. Все уже изобретено smile
http://docs.unity3d.com/Documentation/ScriptReference/Time.html
А вот то, как ты его применшь, уже другой вопрос.
Ну и советую глянуть вот сюда:
https://www.assetstore.unity3d.com/#/content/4608

ну и на закуску, как добавка Array Utilities for C# - Lite - это для того, чтобы было не так мучительно больно разбираться с ограничениями Mono по работе с массивами smile

Кстати, по аналогам, если хоть раз сталкивался с 1С - подумай о проводках... Если нет - мне тебя жаль - многое потерял, вот где изврат так изврат... Я только увидел этот бред - к продуктам 1С перестал подходить даже на пушечный выстрел, сколько-бы за это не платили...


Готов работать за деньги, или за очень большие деньги.

Сообщение отредактировал devpilgrim - Вторник, 29.04.2014, 08:09
 
Форум » Разработка » Корзина » Миры невиртуальной реальности (игры по новой вселенной)
Страница 2 из 5«12345»
Поиск:
Свернуть
Развернуть
Необходима авторизация
0
ТОП-5 САЙТА
НОВЫЕ ИГРЫ
ГОРЯЧИЕ ТЕМЫ
СЛУЧАЙНЫЕ ФАЙЛЫ