Я работаю над новым проектом AllegroVR, в котором я объединяю свою любовь к виртуальной реальности, информатике и музыкальному сочинению, чтобы представить вам мобильное VR-приложение, которое позволяет создавать много шумовой музыки, глядя на разные вещи. в вашей среде и инициализации прикрепленного к нему звукового клипа. Прямо сейчас завершена одна стадия (получившая название Хаос, кодовое название Синестезия), и у меня запланирована вторая. Когда пользователь запускает приложение, он попадает на экран, где может выбрать режим создания музыки или прочитать текст О приложении.

В этом проекте я экспериментирую с Cardboard SDK, и мне довольно быстро удалось настроить и запустить тестовый ввод взгляда. Я много узнал о EventSystems в Unity и о том, какими специфическими могут быть GameObjects, когда их копируют и вставляют, но это история для другого дня. Сегодня я расскажу о другой проблеме, с которой столкнулся, и, как мне кажется, она может быть более глобальной, чем просто VR-проекты, тем более что люди начинают чаще использовать Unity 5.

В Unity есть очень много вещей, которые вы можете редактировать программно, когда речь идет о компонентах GameObject; например, есть свойство Alpha компонента CanvasGroup, которое можно изменить в скрипте, но вы не можете напрямую редактировать дочерний элемент Canvas, получив его компонент Image и изменив значение color.a. Из-за ограничений доступа к компонентам в панелях я пошел дальше и создал два отдельных холста в своей сцене: один для кнопок навигации, а другой для отображения текстовой панели «О программе».

[идентификатор заголовка = ”attachment_2691 align =”aligncenter” ширина =”660]

Два холста перед корректировкой координат для перекрытия[/caption]

Для согласованности я хотел наложить холсты в одних и тех же координатах, чтобы для зрителя нажатие кнопки «О программе» просто отображало новую панель. Как только я поместил две панели внахлест, панели начали перехватывать коллизии raycast друг друга, что привело к нарушению поведения «OnClick()» для каждого из холстов. Установка альфы (прозрачности) неактивного холста не решила эту проблему, поэтому я несколько минут копался и нашел это решение, которое отлично работает, даже если оно кажется немного хакерским. Напишите мне, если я упустил что-то лучшее!

В моем основном сценарии MenuControl.cs я создал две функции, которые служат для отображения/скрытия двух холстов. В дополнение к установке альфа-значений для каждого из них я программно отключаю raycasting для неактивного экрана, чтобы предотвратить взаимодействие с активным:

// Initially hide the information panel
 void HideAboutPanel()
 {
 GameObject.FindGameObjectWithTag ("mainPanel").
            GetComponent<CanvasGroup> ().alpha = 1f;
 GameObject.FindGameObjectWithTag ("aboutPanel").
            GetComponent<CanvasGroup> ().alpha = 0f;
GameObject.FindGameObjectWithTag ("aboutPanel").
            GetComponent<CanvasGroup> ().blocksRaycasts = false;
 GameObject.FindGameObjectWithTag ("mainPanel").
            GetComponent<CanvasGroup> ().blocksRaycasts = true;
}
// Show the 'About' panel
 void ShowAboutPanel()
 {
 GameObject.FindGameObjectWithTag ("aboutPanel").
            GetComponent<CanvasGroup> ().alpha = 1f;
 GameObject.FindGameObjectWithTag ("mainPanel").
            GetComponent<CanvasGroup> ().alpha = 0f;
GameObject.FindGameObjectWithTag ("aboutPanel").
            GetComponent<CanvasGroup> ().blocksRaycasts = true;
 GameObject.FindGameObjectWithTag ("mainPanel").
            GetComponent<CanvasGroup> ().blocksRaycasts = false;
 }
In school, I often got berated by team members for having too many global variables in my code, so my first attempt (above) was a bit wordy and I realized that I didn't have to call
GameObject.FindGameObjectWithTag ("mainPanel").GetComponent<CanvasGroup> ()  as many times as I did - so I polished it up with assigning those two components in the inspector, and changed that hunk of text to something smaller and cleaner.
public CanvasGroup _mainCanvas;
public CanvasGroup _aboutCanvas;
/** Other methods here **/
// Initially hide the information panel
 void HideAboutPanel()
 {
 _mainCanvas.alpha = 1f;
 _aboutCanvas.alpha = 0f;
_aboutCanvas.blocksRaycasts = false;
 _mainCanvas.blocksRaycasts = true;
}
// Show the 'About' panel
 void ShowAboutPanel()
 {
 _aboutCanvas.alpha = 1f;
 _mainCanvas.alpha = 0f;
_aboutCanvas.blocksRaycasts = true;
 _mainCanvas.blocksRaycasts = false;
 }
Note: Don't forget to assign the CanvasGroup objects to their appropriate spots in the inspector when you add in the global variables!
[caption id="attachment_2731" align="aligncenter" width="660"]

The menu is working![/caption]