![]() |
Вопросы от новичка
Задумал значит сделать игру FPS, отказавшись от Blitz3D. Вчера установил Unity 3 / C#, потыкал немного и почитал FAQ. В связи с чем несколько вопросов.
1. Я правильно понимаю, что Prefab и Game Object соотносятся примерно так же как переменная и тип или класс и объект? 2. Импортнул 3ds модель коридора. Есть какая то возможность, чтобы Unity не давал ходить через стены и предметы на полу? 3. Планируется много элементов, которые должны по клику выдать надпись на экран. Каждый объект - это фактически кубик. Для этого надо сделать отдельный prefab или просто написать Component и прикрутить его ко всем объектам? 4. Пример полноэкранного фильтра кто-нить может привести? 5. В игре будут cut-сцены с другим окружением, напр. игрок вспоминает что было. Как это лучше сделать? Насколько я понял в Unity есть Scene и Layout. Первые надо использовать, если наборы объектов различны; вторые, если есть общая часть (например местность та же). Верно? |
Ответ: Вопросы от новичка
1.GameObject это обьект. Prefab это ссыдка на обьект.
2.Добавить обьекту коллайдер. Component->Physics->Mesh Collider 3.Создать префаб и его клонировать/дублировать в сцене 5.Использовать отдельные сцены.Layout имеет отношение к GUI,Если сцена та же можно думик засунуть всю логику сцуны и в нужный момент его инстансить.По окончанию кат сцены дестроить думик. |
Ответ: Вопросы от новичка
1. Префаб - это GameObject, находящийся в ресурсах и преднозначенный для копирования. Может иметь сложную структуру.
4. Импортируй стандартные ассеты с Image эффектами. 5. Тут можно работать со слоями. Например основная камера не визуализаирует слой катсцены, а камера катсцены не визуализирует слои основной камеры. |
Ответ: Вопросы от новичка
Lestar, pax, спасибо.
1. Ссылка на объект? На указатель вроде не похоже. Может рассматривать, как шаблон? 2. Добавил. Только такое впечатление, что теперь объект считается параллепипедом, т.е. если я снаружи, то он не впустит внутрь; если снутри, то не выпустит. Внутри можно пересекать объекты, напр. стол. Т.е. вопрос в том, можно ли сделать так, чтобы тело было не физическим кубом, а сложной геометрией, через которую нельзя ходить (в Blitz всего пара команд нужна была). 3. Не совсем точно выразился: каждый объект может иметь свой меш, напр. стул или стол. Но должны иметь общее поведение - при клике выдавать надпись и останавливать общий поток. 4. Пока не понятно. Надо побольше с движкой посидеть. 5. Аналогично. Буду маны смотреть и много думать :) |
Ответ: Вопросы от новичка
1. Да шаблон.
2. MeshCollider. 3. Все правильно. Создаешь префаб, настраиваешь (вешаешь скрипты с нужным поведением). Потом кидаешь этот объект в сцену несколько раз. 4. http://unity3d.com/support/documenta...geEffects.html импортируй пакадж из Assets->Import Package->Image Effects (работаеют только в про версии). |
Ответ: Вопросы от новичка
pax,
2. Я сразу же как Lestar это добавил. Только все равно проходит. Вполне возможно потому что Mesh был импортирован из 3ds-файла, который был не единым, а разбит пообъектно. Надо потыкать еще. 3. Понятно. 4. А на последний Unity Pro уже кряк есть? Может кто поделится тестовыми небольшими проектами? Нужны, чтобы посмотреть как в Unity то или иное реализуется. Огромные демки слишком сложны для разбора, да и большая их часть под Unity 2 и нифига не работают после конвертации :( (или у меня руки кривые) |
Ответ: Вопросы от новичка
Тестовые проекты http://unity3d.com/support/resources/example-projects/
Чтобы не проходило коллайдер должен быть как на стенах,так и на персонаже.На стенах лучше использовать коллайдеры примитивов.С mesh коллайдером не всегда все гладко.Если меш составной варианта два-или на всю иерархию повесить один box коллайдер например или на каждого чалда отдельный коллайдер. |
Ответ: Вопросы от новичка
Lestar, с официального сайта демки я уже посмотрел. Слишком наворочено.
Скачал Ball Collector Просто и понятно. Хочется такого же :) Только вот никак не пойму, как сделать шаблонную модельку и из нее уже сделать два GameObject с разными мешами. Может кто пример покажет? |
Ответ: Вопросы от новичка
Открой ассет стор через меню Window, там найдешь что нужно.
|
Ответ: Вопросы от новичка
pax, у меня free-версия. В меню Windows в группе ярлыков Unity "Asset store" нет :(
Видимо для изучения лучше pro крякнутую скачать. P.S. Unity последний, взят с сайта. |
Ответ: Вопросы от новичка
Я не писал про Windows, я писал про меню Window в Unity.
|
Ответ: Вопросы от новичка
Спасибо! Вот почему оказывается так мало примеров на форумах - они все в Store :)
|
Ответ: Вопросы от новичка
А не подскажете как сделать следующее:
Есть кучка объектов. Тыкается на любой, выводится текст. Все остальное прекращает обсчитываться, в том числе отключается поворот камеры, управляемой игроком (MouseLook). Ожидается пока повторно кликнут на экран. Тогда надпись убирается и все продолжается дальше. Насколько понимаю, тут требуется корутины, только вот как их прикрутить? Пока прикидываю так: Скрипт, который вешается на объекты имеет обрабочик OnMouseDown, который вызывает статический метод вывести текст. Скрипт, который вешается на основной объект, содержит корутин, который смотрит, выведен ли текст. Если выведен, то стопится и ожидается пока он уберется. Правильно? (описал как мог) |
Ответ: Вопросы от новичка
Обьявить булевую переменную.Сделать ее статик.По клику менять флаг . Логику засунуть в
PHP код:
|
Ответ: Вопросы от новичка
Еще вариант - найти все работающие объекты и выключить, а потом включить.
PHP код:
|
Ответ: Вопросы от новичка
pax, спасибо. Это больше похоже на правду :)
А как же пауза в играх реализуется? (по сути мне глобальная пауза и нужна) |
Ответ: Вопросы от новичка
Time.timeScale=0
|
Ответ: Вопросы от новичка
Цитата:
|
Ответ: Вопросы от новичка
И..? Нужна безгеморойная пауза работайте с классом Time.Хотите изобретать велосипед -искать все обьекты в сцене и работать с каждой группой отдельно,ваше право.
|
Ответ: Вопросы от новичка
Через тайм не заблокируешь
PHP код:
PHP код:
|
Ответ: Вопросы от новичка
Надо подумать. Кажется комбинирование двух подходов поможет мне решить задачу.
Со вторым пунктом разобрался: оказалось при импорте модели из 3ds надо было поставить галку Generate Colliders. |
Ответ: Вопросы от новичка
Еще пара вопросов.
На сцене несколько предметов, игрок может тыкнуть по любому (на всех висит один и тот же скрипт обработки) и будет отображен диалог, где игрок может выбрать один из вариантов. У каждого предмета свой диалог (варианты задаются в редакторе). Как реализовать: 1. Допустим выбрали предмет sphere и вариант 2. Как вызвать заранее неизвестную процедуру sphere_2, т.е. Имя_НомерВарианта? Совсем хорошо, если для каждого предмета обработку ответов можно будет в отдельном файле. Как лучше сделать? (вопрос скорее всего по С#) 2. Использую Screen.cursorLock = true, но есть необходимость отслеживать, что пользователь шевелит мышью по горизонтали. Через Input.mousePosition не получается, поскольку курсор фиксированный. Попробовал через Input.GetAxis("Mouse X"), получилось не очень. Какие еще есть способы отследить мышь? |
1. http://unity3d.com/support/documenta...ndMessage.html
2. http://unity3d.com/support/documenta...howCursor.html обычно курсор не лочат если он двигаться должен UPD: А с другой стороны про движение по горизонтали: PHP код:
|
Ответ: Вопросы от новичка
1. Оно, спасибо :)
2. Курсор залочен и скрыт, поскольку мышка используется для передвижения (не WASD, а по центру, куда игрок смотрит). Объект выбирается, если игрок на него в упор смотрит и кликает. Кроме GetAxis и GetAxisRaw, насколько я понял, вариантов больше нет? |
Ответ: Вопросы от новичка
Ну если лочить курсор, то получить - двигалась ли мышка можно только через оси.
|
Ответ: Вопросы от новичка
Рейкаст матерится на объект,вернее что его нет,код такой
Код:
RaycastHit hit; Цитата:
|
Ответ: Вопросы от новичка
Проверь имеет ли камера в сцене тег "MainCamera". иначе свойство Camera.main не найдет нужную камеру.
|
Ответ: Вопросы от новичка
Вложений: 1
Вот что я смутил(не без помощи)Вложение 15605
|
Ответ: Вопросы от новичка
Еще вопрос:
Нужно событие OnMouseDown, т.е. определять, что мышкой кликнули, а не просто держат. Событие надо отлавливать вне зависимости от того, где находится курсор. Судя по справке OnMouseDown посылается для GUIElement или Collider. Добавляю GUITexture, который наследник GUIElement, покрывающее весь экран, и вешаю на него скрипт. Код:
using UnityEngine; |
Ответ: Вопросы от новичка
Event
Вот так можно отлавливать любые нажатия клавиши/мыши и т.п. |
Ответ: Вопросы от новичка
|
Ответ: Вопросы от новичка
Спасибо, помогло :)
|
Ответ: Вопросы от новичка
Всплыли еще вопросы:
1. Можно программно как то передвинуть курсор, т.е. изменить Input.mousePosition? Поиск по форуму Unity3d привел только к решению с помощью WinAPI, что разумеется не очень. 2. Может кто привести код, как выбирать объекты из под курсора с помощью RayCast (я правильно понимаю, что надо использовать ScreenPointToRay)? Через OnMouseDown() криво работает, потому хочу по менять. |
Ответ: Вопросы от новичка
1. Стандартными средствами - Нет
2. Например тут |
Ответ: Вопросы от новичка
Спасибо.
1. Жаль :( 2. Воспользовался, работает. Примерно так же, как и OnMouseDown получилось. Видимо ошибка, где то в применении. На 3D сцене объекты, игрок ходит и нажимает на них, учитывая расстояние от от глаз игрока до пересечения с коллайдером. С разных мест объект по разному кликается. Видимо стоит поиграться с изменением расстояния. Еще вопрос: А можно как то колесо прокрутки отслеживать? Не в GUI, а в наследнике MonoBehaviour? В справке про скролл только по GUI нашел. |
Ответ: Вопросы от новичка
Input.GetAxis ("Mouse ScrollWheel")
|
Ответ: Вопросы от новичка
И снова я тут :)
1. У меня на камеру накладывается пост-эффект, а хочется, чтобы на некоторые объекты его не было. Насколько я понимаю надо их рендерить во вторую камеру, а потом как то добавлять? Можно принцип действий расписать или кодом кинуть? 2. Есть ли в Unity возможность эмулировать жидкие и вязкие тела, напр. стекающую по стене слизь? 3. На GUIText нельзя наложить никакой эффект? (размазать буквы, добавить тень) 4. Можно как то передать параметры в следующую сцену, вызываемую через Application.LoadLevel, кроме как записать их в файл, а при старте прочитать? Наверно можно попробовать в каждой сцене создать Dummy, на который навесить скрипт, содержащий static переменные + set + get на них (или массив) и передавать все через него, но что-то мне кажется, что это не очень правильно. |
Ответ: Вопросы от новичка
1.В с цене две камеры .Создаем слой IgnorePostEffect.Обьектам,которые рендеряться без постэффектов назначаем этот слой.Для камеры с постэффектами в настройках Culling Mask снимаем галку с нашего слоя,теперь она не видит эти обьекты,а для второй камеры в том же поле ставим флаг только напротив нашего слоя-она у нас будет рендерить теперь только эти обьекты.Дублируем трансформ с одной камеры на другую,парентим,профит.
2.Нет 3.Создать соответствующий стиль (с размазанными буквами и прочим)и применить 4.Создаем думик Main,на него вешаем скрипт в который пишем наши переменные,в скрипт добавляем PHP код:
|
Ответ: Вопросы от новичка
Добавлю:
3. Тень можно добавить вторым GUIText'ом. Вот на счет размыть не знаю. Стили тут не помогут, так как это не GUI 4. Если параметры - не объекты Unity (Текстуры, ГеймоОбжекты и т.д.) то статические переменные любого класса, не обязательно скрипта на каком-то объекте нормальный выход. Есть еще PlayerPrefs - данные сохраняются между запусками игры. |
Ответ: Вопросы от новичка
Lestar, спасибо за подробный 1. Буду пробовать, должно получиться :)
pax, в очередной раз спасибо :) PlayerPrefs то, что нужно. Заодно порешил вопрос с сохранением прогресса игрока (думал нужно будет класс писать). 3. Наверно попробую исхитриться и отрендерить в текстуру (с применением технологии п.1), а уже потом на нее эффект кидать. |
Ответ: Вопросы от новичка
Цитата:
Хотя если так и делать, то уж проще вообще весь размывающийся гуй вынести в отдельный слой на эту вот камеру с размытием и отрендерить ей поверх главной камеры. Надо будет только поэкспериментировать с тем, куда вставлять те элементы гуя, которые размывать не надо.. |
Ответ: Вопросы от новичка
Lestar, у меня главная камера с эффектами, вторая - без эффектов, обе повесил дочерними на Collider-игрока. Transform у обоих одинаков, так что с позиционированием проблем нет (думаю можно будет поиграться с позиционированием и сделать еще эффект :))
Добавил Layers - IgnoreMainCamera. Добавил кубик, у которого задал Layer = IgnoreMainCamera. Для главной камеры в Culling Mask снял с IgnoreMainCamera (кубик в окошке предпросмотра пропал). Для дочерней камеры в Culling Mask убрал все флаги, кроме IgnoreMainCamera (в окошке предпросмотра только кубик). Однако, когда запускаю сцену - идет рендер только главной камеры, а вот кубика нет. Может надо еще и слой дочерней камеры задать? Taugeshtu, я подумал, да мне это надо всего для двух экранов - стартового скина с названием игры и надписи - "Вы околели". Так что наверно ручками сделаю надписи, повешу их как текстуры на кубик в ортогональной проекции и забью. Надо еще 3D Text попробовать. |
Ответ: Вопросы от новичка
У камеры также есть параметр глубины отрисовки Depth, попробуй поменять его для одной из камер
+Поиграться с ClearFlags |
Ответ: Вопросы от новичка
У главной камеры было Depth = 1 (осталось от скрипта по смене суток), у дочерней 0. Поставил у дочерней Depth = 1.1 и ClearFlags = Depth Only - теперь кубик стал отрисовываться, но возникла другая проблема - кубик затирает объекты с главной камеры, которые стоят перед кубиком.
На самом деле, я использовал не кубик, а стол, на котором лежит книга. Стол рендерится второй камерой, а книга и остальное окружение - главной. Так вот при изменении глубины - книга перестает отрисовываться. Насколько я понимаю Depth - это просто Z-буффер, т.е. когда мы выводим данные со второй камеры, то все точки лежат как бы сверху, поскольку у нее значение Depth больше. |
Ответ: Вопросы от новичка
Цитата:
И проблема решиться ;) |
Ответ: Вопросы от новичка
pax, пробовал для второй выставлять - ClearFlags = Don't Clear
Если у второй камеры Depth <= главной, то кубик (=стол) не будет показан. Если у второй камеры Depth > главной, то кубик (=стол) рисуется, но часть его кусков выпадает при движении камеры, как при Z-файтинге. |
Ответ: Вопросы от новичка
если тебе нужен весь кубик, тогда очищай глубину второй камерой (Depth Only)
Параметр Depth влияет на очередь отрисовки, а не на глубину. Глубину можно стереть (Depth Only), или использовать буфер глубины предыдущей камеры(Don't Clear). |
Ответ: Вопросы от новичка
pax, мне нужен кубик, но так, чтобы он не был поверх объектов с главной камеры, а был вписан в сцену с главной камеры, т.е. если перед кубиком поставить шарик (отображаемый, главной камерой), то шарик будет показан, а за ним кубик, отображаемый второй камерой.
Хм, интересно, а вообще это реализуемо? |
Ответ: Вопросы от новичка
Это Don't Clear и камеры должны быть на одной и той же позиции. Проще всего вторую камеру поставить дочерней к первой и установить ей трансформ в ноль, кроме скейла
|
Ответ: Вопросы от новичка
pax, так и сделал уже. Результат описан выше.
По логике вещей: для двух камер надо указать одинаковое расположение + Depth + для второй Don't Clear. Отрисовка должна быть так: первая камера вывела изображение в буффер, а потом вторая туда нагадила в соответствии с Depth. Вот у меня только подозрение, что сначала генерит вторая камера, а потом уже выводит первая и все затирает, поскольку у нее флаг Culling Mask = Skybox. Может быть где то можно указать порядок рендера с камер? |
Ответ: Вопросы от новичка
По порядку:
Первая камера - SkyBox, включены все слои, кроме слоя второй камеры. Depth по умолчанию -1. Вторая камера - Don't Clear. Включен только слой с кубиком. Глубина 0. У обоих камер одинаковые FOV и плейны. Камеры совмещены. Все работает. Проверил. Снова повторю, что порядок рендеринга устанавливается параметром Depth. Камеры выводят картинку начиная с меньшего Depth, заканчивая большим. Т.е. в данном случае сначала -1, потом 0. Если указать 0 и 1 или 10 и 100 то будет то же самое. Как работает: 1. Первая камера рендерит всю сцену со скайбоксом, но без кубика. 2. Вторая камера использует буфер глубины первой камеры, т.к. не очищает его. Следовательно все что она нарисует будет перекрываться геометрией, выданной первой камерой. |
Ответ: Вопросы от новичка
Вот сделал тестовый проект: на сцене две камеры, у главной Depth = -1, у дочерней depth = 0. На главную повешен эффект GrayScale. Вторая камера рендерит только слой Ignore MainCamera, в котором распложен кубик с цветной текстурой.
Спереди кубика шарик, сзади цилиндр. На главную камеру повешен скрипт MouseLook, чтобы можно посмотреть, как все себя ведет в движении. А ведет оно себя говнисто :( Архив с сырцами для Unity 3.4.2 -http://files.mail.ru/B5D5Z7 (5.3мб) P.S. Если второй камере поставить Rendering Path = Deferred Lighting, который выставляется на главную камеру, если необходимо отображать тени, то куб начинает вписываться в сцену, однако при этом пост-эффекты, накладываемые на главную камеру, отваливаются. |
Ответ: Вопросы от новичка
Виноват во всем GrayScale эффект. Если его выключить, то все работает нормально.
|
Ответ: Вопросы от новичка
pax, получается, что либо пост-эффекты на все, либо рендер с двух камер.
Все вместе не будет работать :( Фигня какая то. |
Ответ: Вопросы от новичка
Это вероятно баг. Отправь баг репорт с этой тестовой сценой.
|
Ответ: Вопросы от новичка
pax, я думаю, что это из-за реализации так: когда постэффект накладывается на отрендеренную схему, то данные Z-буфера теряются.
Отправить не могу, так как у меня Pro-версия из-за таблетки, а не $$$. И мне стыдно :) |
Ответ: Вопросы от новичка
Отправил (хоть тоже не имею лицензии), вдруг смогут исправить.
|
Ответ: Вопросы от новичка
Как можно камере background сделать из картинки, а не скайбокса?
Не знаю может так надо или баг, но вчера заметил, что если во время плея переключиться из Game в Scene, то у mainCamera меняется aspect. |
Ответ: Вопросы от новичка
Цитата:
Вторая камера, рендерит перед главной, у неё в слоях рендера только один-единственный растянутый на всю морду GUITexture или GUI.Label (смотря что тебе больше нравится), у главной камеры Clear flags: Depth only. Как-то так) Можно извращаться с GL-классом наверное.. И с порядком рендера объектов тоже можно было бы поиграться, но решение со второй камерой будет работать на инди-версии тоже (GL-класс вроде недоступен в инди). |
Ответ: Вопросы от новичка
Поставить плейник,на плейник натянуть текстуру.Это буде экономнее чем класс GUI.
|
Ответ: Вопросы от новичка
Lestar, что за плейник?
C# не очень хорошо знаю и возникает одна проблема. Есть метод который по координате курсора находит позицию на карте. Если позиция найдена то возвращаю ее в Vector2, а если не найдена, то хочу написать return null, но на это ругается компилятор. Как такое правильно сделать? |
Ответ: Вопросы от новичка
Плейник - Plane
Vector2 не может быть null, так как это не ссылочный тип. Можно поступить следующим образом: PHP код:
|
Ответ: Вопросы от новичка
pax, спасибо. В Unity нету классов векторов с integer? А то позицию на карте мне было бы лучше хранить как два инта т.к. карта тайловая.
Насчет Plane, зачем там так много треугольников? Не могли двумя обойтись( Теперь, если надо что-то сделать оптимизировано, то надо свой Plane рисовать. |
Ответ: Вопросы от новичка
Цитата:
|
Часовой пояс GMT +4, время: 15:22. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot