FAQ. Рабочая тема — составляем

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

FAQ. Рабочая тема — составляем

Сообщение Zaicheg 04 июн 2010, 18:51

Сами вопросы и ответы во втором сообщении.
Последний раз редактировалось Zaicheg 03 июл 2010, 16:46, всего редактировалось 11 раз(а).
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: FAQ. Рабочая тема — составляем

Сообщение Zaicheg 04 июн 2010, 18:52

Вопросы и ответы по Unity.

Общие вопросы
В.: Как получить доступ к переменной в скрипте на другом ГО?
О.: Сделать эту переменную статической или же воспользоваться методом GameObject.GetComponent<Имя_скрипта>(). Ниже пример для второго способа
Синтаксис:
Используется csharp
ScriptRespawn remoteScript = go.GetComponent<ScriptRespawn>();
float health = remoteScript.health;
// переменная health в ScriptRspawn должна быть public

Форум
ВНИМАНИЕ! Если скрипты на разных языках - необходимо внимательно изучить порядок компиляции скриптов. Тот скрипт, к которому нужно получить доступ должен компилироваться раньше того, из которого нужно получать доступ.
В.: Есть ли уроки на русском?
О.: Полностью переведён один урок — FPS Tutorial (ссылка). Также частично переведена справка (ссылка).

В.: У меня отсутствует часть сообщений в консоли, хотя они точно должны там быть.
О.: Выключите опцию Collapse в консоли.

В.: Как мне реализовать паузу?
О.: Наиболее простой вариант — установить Time.timeScale в ноль.

В.: Как измерить расстояние между двумя объектами?
О.: Vector3.Distance()

В.: Как заставить два меш-коллайдера взаимодействовать?
О.: Включить опцию Convex у обоих.

В.: Как отключить/заблокировать курсор?
О.: Screen.showCursor; Screen.lockCursor.

В.: Как отключить контекстное меню в веб-сборке?
О.: disableContextMenu (ссылка)

В.: Как визуализировать Raycast?
О.: Debug.DrawLine.

В.: Как округлить дробь?
О.: Mathf.Round или Mathf.RoundToInt

В.: Как получить высоту точки террейна?
О.: Terrain.SampleHeight возвращает высоту точки относительно нуля этого террейна.

В.: Как придать телу импульс?
О.: Rigidbody.AddForce с параметром ForceMode.Impulse.

В.: Как изменить громкость всех источников звука в сцене?
О.: AudioListener.volume

В.: Как избавиться от смазывания текстур при отдалении от них камеры?
О.: Отключить генерацию mipmaps в настройках импорта текстуры.

В.: Как отключить вывод предупреждений в консоль?
О.: #pragma warning disable (в справке mdsn даны подробности)

В.: Как спозиционировать Scene View на выбранном объекте?
О.: Edit > Frame Selected или просто клавиша F.

В.: Что делать с файлами .unitypackage?
О.: Assets > Import/Export Packages

В.: Как сделать объект невидимым для Raycast?
О.: Поставить его в стандартный слой Ignore Raycast.

В.: Как создавать GUI (графический пользовательский интерфейс)?
О.: Классы GUI и GUILayout.

В.: Можно ли строить GUI визуальными методами?
О.: Есть следующие решения: GUIX (ссылка), bitverse-unity-gui (ссылка) и XamlToUnityGUI (ссылка).

В.: Как отключить обработку коллизий для коллайдера?
О.: Включить опцию коллайдера isTrigger. Однако, такой коллайдер всё ещё будет принимать Raycast.

В.: Куда сохраняются логи редактора?
О.: C:\Documents and Settings\zaicheg\Local Settings\Application Data\Unity\Editor\Editor.log
Этот же документ можно посмотреть, нажав Open Editor Log в консоли.

В.: Куда сохраняются логи приложения?
О.: Для standalone: _Data\output_log.txt. Для web: C:\Documents and Settings\user\Local Settings\Temp\UnityWebPlayer\log

В.: Где можно посмотреть, какие ресурсы сколько занимают в моём билде?
О.: Там же, в Editor.log (после сборки билда).

В.: Не работает Array.length.
О.: В C# пишите .Length (с большой буквы).

В.: У меня глючит физика.
О.: Проверьте, осущетвляются ли все физические действия в FixedUpdate(). Увеличьте размеры объектов. Избавьтесь от тонких (или безтолщинных) мешей (Plane). Уменьшите FixedTimesetp.

B.: Не получается отредактировать элемент массива mesh.vertices (mesh.normals и прочее).
О.: Редактируйте во временном массиве vertTemp, а потом mesh.vertices = vertTemp.

В.: Я отключил скрипт, но он всё равно частично работает!
О.: Отключение скрипта действует лишь на вызов метода Update(). Start, Awake и прочие будут работать.

В.: Как увеличить частоту физических расчётов?
О.: Edit > Project Settings > Time > Fixed Timestep

В.: Как приостановить выполнение в Editor Mode (поставить на паузу)?
О.: Debug.Break

В.: Могу ли я посмотреть исходники стандартного скина?
О.: Да, конечно (ссылка).

В.: Могу ли я посмотреть исходники стандартных шейдеров?
О.: Да, конечно (ссылка).

В.: Как отобразить кириллицу в GUI?
О.: Назначьте на стиль или скин шрифт с поддержкой кириллицы (импортировать шрифт в проект можно из папки C:/WINDOWS/Fonts). Дополнительно сохраняйте ваши скрипты в кодировке UTF-16 (в VS это Unicode - Codepage 1200).

В.: Как изменить кегль или начертание шрифта?
О.: Кегль — в настройках импорта. Начертание — импортом шрифта соответствующего начертания из вышеназванной системной папки /Fonts/.

В.: Как мне подгружать дополнительные ресурсы в рантайм?
О.: Asset Bundles или папка Resources (ссылка).

В.: Как определить, кликнул ли я по ГУИ-элементу (не баттону)?
О.: rectB.Contains(Event.current.mousePosition); где rectB - ректангл ГУИ-элемента.

В.: Как менять хоткеи редактора?
О.: HKEY_CURRENT_USER\Software\Unity Technologies\Unity Editor

В.: Как разрешить игре работу "в фоне"?
О.: Edit → Project Settings → Player → Run in Background

В.: Какие отличия между Pro-версией и обычной?
О.: http://unity3d.com/unity/licenses.html

В.: Сколько стоит Unity?
О.: https://store.unity3d.com/shop/

Ошибки
Скрытый текст:
В.: Я получаю сообщения об ошибке при открытии проекта или при импорте пакете .unitypackage.
О.: Первая причина — в пути до Unity, до проекта или до пакета присутствуют кириллические символы. Вторая причина —использование взломанной версии Unity.

В.: Пропускаются коллизии (объекты проскакивают друг через друга).
О.: Уменьшите Fixed Timestep, увеличьте размер объектов, уменьшите скорость их движения, используйте физические методы для перемещения (rigidbody.velocity вместо transform.Translate)

В.: Буквы разной ширины!
О.: Используйте моноширный шрифт. Например, Courier New.

В.: Скрипт не компилируется, хотя я в нём ещё ничего не писал.
О.: Имя первого класса в скрипте должно совпадать с именем скрипта (справедливо для C#).

В.: У класса исчезли поля и методы!
О.: Вероятно, вы назвали какой-то из своих скриптов или классов тем же именем. Например, распостраненно именование скриптов как «GUI», что конечно же неприемлимо.

В.: Я ставлю условие if (Input.GetKey("a")), но при нажатии A условие не срабатывает.
О.: Используйте if (Input.GetKey(KeyCode.A))
Последний раз редактировалось Zaicheg 03 июл 2010, 16:47, всего редактировалось 5 раз(а).
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: FAQ. Рабочая тема — составляем

Сообщение Zaicheg 04 июн 2010, 18:53

Зарезервировано.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: FAQ. Рабочая тема — составляем

Сообщение Zaicheg 04 июн 2010, 18:54

Зарезервировано.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: FAQ. Рабочая тема — составляем

Сообщение Zaicheg 04 июн 2010, 18:55

Зарезервировано.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: FAQ. Рабочая тема — составляем

Сообщение Zaicheg 04 июн 2010, 18:56

Зарезервировано.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: FAQ. Рабочая тема — составляем

Сообщение Zaicheg 04 июн 2010, 18:59

Зарезервировано.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: FAQ. Рабочая тема — составляем

Сообщение sp00n 05 июн 2010, 01:01

В.: Как придать телу импульс?
О.: Rigidbody.AddForce.

немного неправильно. для того чтобы именно импульс надо во втором параметре указать ForceMode.Impulse, так как по умолчанию идет ньютоновская сила
ну и опечатка:
В.: Как округлить дробь?
О.: Mathf.Round или Mathf.RountToInt
надо Mathf.RoundToInt :)
Ты молод, креативен, талантлив?
Амбициозен, уверен в себе, полон свежих идей?
А делать хоть что-нибудь умеешь?!
sp00n
UNITрон
 
Сообщения: 254
Зарегистрирован: 27 фев 2010, 20:43

Re: FAQ. Рабочая тема — составляем

Сообщение DbIMok 14 сен 2010, 22:22

В.: Как вывести текст с контуром?
О.: Использовать контурные шрифты

P.S. оффтоп отделил и подклеил
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.5k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: FAQ. Рабочая тема — составляем

Сообщение F_crow 15 сен 2010, 13:55

В.: Как отобразить кириллицу в GUI?
О.: Назначьте на стиль или скин шрифт с поддержкой кириллицы (импортировать шрифт в проект можно из папки C:/WINDOWS/Fonts).


Эммм..не всегда помогает. По умолчанию встроенный редактор юнити сохраняет код не в utf-8. И даже после выбора шрифта с поддержкой кириллицы, вместо текста - пустота. После смены кодировки, всё становится нормально.(File->Encoding->UTF-8)
F_crow
UNец
 
Сообщения: 1
Зарегистрирован: 08 сен 2010, 14:54

Re: FAQ. Рабочая тема — составляем

Сообщение DbIMok 15 сен 2010, 16:29

F_crow писал(а):По умолчанию встроенный редактор юнити сохраняет код не в utf-8.

как задать кодировку по умолчанию для UniSciTE
правильная кодировка UTF-16
You can also use unicode characters if you want to set the displayed text from scripting. The Javascript and C# compilers fully support Unicode based scripts. You simply have to save your scripts with UTF-16 encoding. In Unitron, this can be done by opening the script and choosing Text->Text Encoding->Unicode (UTF 16). Now you can add unicode characters to a string in your script and they will display as expected in UnityGUI, a GUIText, or a Text Mesh. On the PC where UniSciTE is used for script editing save scripts using the UCS-2 Little Endian encoding.

в VS Unicode - Codepage 1200
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.5k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Сообщение Neodrop 15 сен 2010, 18:39

Как открыть второе окно сверху первого?
Элементарная задачка: как открыть окно ПОВЕРХ первого? Оно как я не крутил, появляется под первым, и активируется только по клику.
GUI.depth не помогает (((


GUI.BringWindowToFront
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: FAQ. Рабочая тема — составляем

Сообщение Neodrop 21 сен 2010, 17:43

Как определить, что апликуха запущена в режиме nographics ?


if (SystemInfo.graphicsDeviceVendor == "Unity Technologies")
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: FAQ. Рабочая тема — составляем

Сообщение Paul Siberdt 24 сен 2010, 08:31

Это вовсе не FAQ :)
Пол десятого утра.. спать пора.. но таки напечатаю..... постарайтесь отложить себе куданть в голову на полочку:

Если вам когда-нибудь придется комбайнить меши в общий скинедмеш, переписывать индексы костей и так далее, назначать биндпозу необходимо только последнему куску из комбинируемых мешей. Биндингпозинг всем-кускам-сразу искажает данные, биндингпозинг результирующему мешу все схлопывает, бинддингпозинг от балды схлопывает матричные трансформации после себя. Все. Не пытайтесь понять и покивать. :p

Если это кажется абракадаброй, ничего страшного, просто зафиксируйте в голове: комбайнинг мешей + биндингпозинг -> где-то что-то на форуме мелькало
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: FAQ. Рабочая тема — составляем

Сообщение Paul Siberdt 25 сен 2010, 07:03

Каждый день - небольшой праздник.. жаль, что по утрам, когда ночь прошла в безумной головомойке.

СБОРКА КАСТОМ СКИНЕД МЕША

Верхний пост - дурацкий костыль.. развиваю тему...
Важно!
Это не панацея и очень частный случай. В моей ситуации все компоненты имеют один шейдер и потому в сшивании мешей отсутствует проверка рендереров на сабмеши. Об проверках и сабмешах написано в примерах документации.
Код рассчитан на работу с единичными весами, веса на 2 и 4 кости требуют некоторой добавки буковок и цыферок. :p
Синтаксис подсвечивать не буду из-за перегруженности его обертки. :p
Код перемешан с текстом по причине того что это не готовый скрипт, а методика, которую надо понять, а не заюзать. :p

Итак....

Представим ситуацию, что нам надо смержить голову-торс-ноги-кепку (платформу-турель-башню-ствол), которые хранятся отдельными скинедмешами к их родному скелету.
Для этого нам надо иметь:

- иерархию скелета - массив костей, причем не список Трансформов из сцены, ибо он не факт совпадает с последовательностью индексов косточек в весах.
Код: Выделить всё
   var bones : Transform[];

- биндингпозу - массив, что описывает струтуру скелета для скининга начального меша
Код: Выделить всё
   var bindPoses : Matrix4x4[];

- набор мешей ( голова-торс-ноги, привязанные к нашему скелету ) доступный для обращения.
В примере я налинковал себе меши прямо в скрипт для гибкости тестирования.
Код: Выделить всё
   var meshBody : Mesh;
   var meshHead : Mesh;
   var meshLeg : Mesh;

- шаблон скинедмеш, который, во-первых, облегчит работу с персонажем в редакторе (желтый кубик всяко лучше невидимки ;) ) и послужит ресурсом для получения данных по костям и позе. В примере я экспортнул скелет+4скинедмеша(шаблон и три компонента).
Далее, создавая префаб скелета, удалил компоненты, оставив лишь кости и шаблон. Назвал шаблон "character", чтобы найти его по имени, что не суть важно.
Шаблон можно просто прискинить к root-кости.
Кстати, позу можно выдернуть из любого меша-компонента далее, а вот чтобы получить кости, требуется скинедмеш. Если составные части скелета будут храниться, как чистые меши - нужен шаблон. Если части сядут в префабы со скинедмешами и материалами, шаблон можно удалить и читать кости и позу из первого попавшегося компонента.

Далее, что мы делаем (собственно, функция-сборщик):

- читаем из шаблона кости
Код: Выделить всё
   var character : Transform = transform.Find("character");
   var smr : SkinnedMeshRenderer =   character.GetComponent(SkinnedMeshRenderer);
   bones = smr.bones;

- читаем из шаблона позу
Код: Выделить всё
   bindPoses = smr.sharedMesh.bindposes;

- убиваем шаблон, ибо дело он свое сделал и больше нам ни на что не нужен.
Код: Выделить всё
   Destroy(character.gameObject);

- создаем девственный скинедмеш для будущего заполнения его смыслом:
Код: Выделить всё
   gameObject.AddComponent(SkinnedMeshRenderer);
   var renderer : SkinnedMeshRenderer = GetComponent(SkinnedMeshRenderer);


Подгружаем в CombineInstance все меши и мержим их. В примере все реализовано для быстроты теста, не смотрите на это.
Код: Выделить всё
   var combine : CombineInstance[] = new CombineInstance[num];
   combine[0].mesh = meshBody;
   combine[1].mesh = meshHead;
   combine[2].mesh = meshLeg;

   var res : Mesh = new Mesh();
   res.CombineMeshes (combine, true, false);

Вот тут закралась одна какашка:
Наши меши имеют биндингпозы идентичные с шаблоном, ибо привязаны и меши и шаблон к одному скелету, но комбайнеру на это глубоко наплевать и он логично полагает, что каждый следующий меш имеет собственные косточки и потому индекс 0 второго меша на 4-х костях станет уже индексом 4, этот же индекс третьего меша станет 8 и так далее.
В результате, имея скелет из четырех костей, мы получим новый меш лишь частично к нему прискиненный. Большая часть меша схлопнется в никуда, не имея информации об своих костях выше индекса последней кости в скелете (для скелета на четырех костях - это индекс 3).

Я со вчерашней ночи все никак не мог сообразить, куда пропадают составные части, пока не решил распечатать веса собранного меша. ~x( Вылечить проблему оказалось просто - достаточно пробежать по индексам меша и пересчитать их, взяв остаток от числа костей скелета.
Код: Выделить всё
   var weights : BoneWeight[] = res.boneWeights;

   for( i = 0; i < weights.length; i++ )
      weights[i].boneIndex0 = weights[i].boneIndex0 % bones.length;
   res.boneWeights = weights;

Далее назначаем новому мешу и рендереру скелет и биндингпозу, что вырезали из шаблона.
Код: Выделить всё
   res.bindposes = bindPoses;
   renderer.bones = bones;

И, наконец, вешаем меш в качестве шареда для скинед-меш-рендерера.
Код: Выделить всё
   renderer.sharedMesh = res;


В результате мы имеем уникальный кастомизированный однодравкольный меш, собранный из сколько угодно деталей. Что, собственно я и пытался получить :-bd
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1