ПрограммированиеФорумОбщее

Unity - архитектура и алгоритмика приложения

#0
11:43, 19 мар 2013

Добрый день, товарищи.
Я не уверен что название темы адекватно, поэтому начну с начала.

Задача
Итак, планируется сделать трёхмерный онлайн музей. Чтобы по нему можно было ходить и всё это чудо в онлайне.
Ну, как онлайн 3D плеер себя уже давно и крепко зарекомендовал юнити. Его и планируется использовать.
Что такое музей? Это помещение (скорее всего большое и многокомнатное/многозальное), возможно многоэтажное.
В помещении есть места для экспонатов. Юзер может ходить по музею и смотреть на экспонаты.
Как-то вот так...теперь вопросы.

Вопросы
1. Как организовать подгрузку экспонатов?
Я знаю что в юнити есть нечто что называется стриминг. Но честно говоря, я не очень знаю что это.
Я думаю что здание надо грузить сразу, а экспонаты подгружать. Вообще, если тупо вручную расставить экспонаты по музею, юнити будет понимать где я нахожусь и подгружать экспонаты по мере моего движения по музею?

2. Как лучше расположить модели? Самый тупой вариант это просто взять трёхмерную сцену помещения, расставить в ней модели и сохранить как одну модель =)
Есть более адекватный подход. Создать в модели помещения слоты (условно говоря кубики на месте экспонатов) и читая из внешнего файла соответствие номер слота-модель располагать модели. Этот вариант хорошо совместим заодно и с ручной реализацией стриминга. Ну то есть, смотрим где находится игрок, ищем ближайшие к нему слоты и подгружаем модели.

Я сделал небольшую демку, там экспонаты и помещение упакованы в одну модель. Но что-то мне подсказывает что при увеличении размеров музей и количества моделей это будет уже не смешно. Линк: http://cloud.karonator.ru/unity/new/index.html

Честно говоря, у меня в голове полнейший сумбур по этим двум вопросам, поэтому если я что-то написал в корне неверное...в общем посоветуйте пожалуйста что и как сделать чтобы это работало адекватно. (Кстати ручная расстановка экспонатов меня ещё пугает потому что если в музее 500 экспонатов то мне кажется хранить всё это в одной 3д модели это как-то бредово.)

3. Миникарта. Сложно ли сделать миникарту на которой бы отображались другие люди в музее? Я так понимаю, тут нужен будет простенький сервер, который будет хавать и транслировать всем позиции пользователей.

4. Какой ещё прикольный функционал можно добавить?

Заранее всем ответившим большое спасибо.

#1
17:07, 19 мар 2013

up =)

#2
18:19, 19 мар 2013

1. Музей упаковывай в сцену.
2. Экспонаты в префабы и ассет-бандлы. Это позволит их легко обновлять.
3. На сцене расставь маркеры, это не отображаемые GameObject-ы с специальным скриптом, который на месте каждого маркера инстанциирует экспонат из префаба.
4. Миникарту сделать легко, только тебе потребуется реализовать сетевую часть. Разберись с компонентом NetworkView или технологией Photon.
5. Прикольного функционала можно добавить много, например дать возможность игроку покакать в углу.

#3
20:36, 19 мар 2013

Dufrenite
Во первых, спасибо за адекватный ответ.
Если можно пара уточнений:

Имеется ввиду что само здание пакуется в сцену, потом в юнити расставляются метки, верно?
А скажем на камеру вешается скрипт, который ищет эти невидимые метки в некотором радиусе от игрока и подгружает, ну а неактуальные соответственно уничтожает.
Всё верно?

#4
16:11, 20 мар 2013

Всегда рад помочь :)
Да, здание в сцене.

Самое простое:
1. Создаешь префаб с одним GameObject-ом, на котором висит (компонент) скрипт. Это будет твоя метка.
2. Расставляешь эти префабы по сцене.
3. У компонента метки должно быть строковое поле, где ты пишешь название префаба из которого метка должна загрузить объект.
4. В функции Start() компонента начинаешь асинхронную загрузку объект из префаба. Вызываешь что-то типа Resources.LoadAsync(). Все префабы объектов должны быть в ассет бандлах.
5. После того, как префаб загрузился вызываешь GameObject.Instantiate(prefab, ...).
6. Добавляешь инстанциированный объект в качестве дочернего к метке (что-то типа transform.addChild(obj)).
7. Через некоторое время после загрузки на месте меток появляются объекты.
8. PROFIT.

#5
17:23, 20 мар 2013

KaronatoR
Если экспонаты уже расставлены по музею в трёхмерном редакторе, посмотри на событие AssetPostprocessor.OnPostprocessModel.
Во момент импорта модели музея в Unity в обработчике этого события можно просканировать импортируемые объекты и заменить все экспонаты на пустые GameObject, с какими-нибудь пометками, какой именно экспонат должен стоять в этом месте. Это позволит отделить геометрию музея от экспонатов, запомнив при этом их положения.

Я так никогда не делал, но несколько раз слышал, что люди использовали подобный подход.

#6
21:36, 20 мар 2013

alexzzzz
> какой именно экспонат должен стоять в этом месте
В каком месте? При импорте моделей никакое место не указывается. Куда на сцену бросишь  - там и будет. В-общем тут Вы что-то не то написали.

#7
22:56, 20 мар 2013

В файле под названием Test.c4d есть три модели: Terrain, Cube и Sphere, расставленные в нужном порядке. При импорте в Unity я получаю родительский объект Test без компонента Transform и 3 дочерних: Terrain, Cube и Sphere, у каждого из которых есть Transform, задающий их положение относительно родительского объекта.

+ Показать

Я сейчас пробую написать пример, который объект Terrain оставит как есть, а вместо Cube и Sphere влепит заглушки.

#8
23:18, 20 мар 2013

Получилось:

Piccy.info - Free Image Hosting

+ Показать
#9
11:50, 21 мар 2013

alexzzzz
Спасибо большое. Один маленький вопрос, а не сойдёт с ума 3д макс если в нём будет сцена и 500 экспонатов?
Или это для него нормальные нагрузки?

Dufrenite
Вроде всё ясно, thanks a lot =)

ПрограммированиеФорумОбщее

Тема в архиве.