В нашем случае я имею трехмерную модель человеческого тела на экране компьютера. Все еще на том же экране, с правой стороны, у меня есть меню с названиями всех объектов модели, которые я вижу на экране. Для визуализации модели, созданной в Blender, я использую Unity и генерирую исполняемый файл, который запускается в браузере (google chrome или iexplorer).
Чтобы сделать представление этой системы более организованным, мне нужно сгруппировать эти элементы в иерархический и логический путь. Например, я хочу сгруппировать верхнюю брыжеечную артерию с другими артериями в группе артерий пищеварительной системы. Затем я хочу сгруппировать эту группу с группами артерий дыхательной системы и артерий мочевыделительной системы в рамках более крупной группы, называемой артериями. Поэтому я хочу объединить группу артерий с группой вен и сердце в более крупную группу, называемую сердечно-сосудистой системой. Организация в меню справа должна выглядеть следующим образом:
- Элемент списка
Код: Выделить всё
-Heart
-Right atrium
-Left atrium
-...
-Veins
-Digestive system veins
-D vein
-...
-Veins of the urinary system
-V vein
-...
-Veins of the respiratory system
-Z vein
-Vein...
-Arteries
-Digestive system arteries
-Superior mesenteric artery
-Inferior mesenteric artery
-...
-Urinary system arteries
-Artery X
-...
-Arteries of the respiratory system
-Artery Y
-...
Она предназначена для управления игровыми объектами. наравне с теми, кто находится внутри групп. Я не могу получить доступ к объектам, которые находятся в другой группе внутри другой группы. Я использую следующий скрипт:
Код: Выделить всё
// Método chamado a cada frame
void Update()
{
// Obtém os painéis do objeto principal
panels = principalObject.GetComponent().listpanel.ToArray();
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// Verifica se o bisturi não está ativo
if (!bisturi)
{
open = true;
cursorBisturi.SetActive(false);
// Verifica se há colisão com um objeto
if (Physics.Raycast(ray, out hit))
{
Nome = hit.collider.name;
Debug.Log(Nome);
// Verifica se o painel não está ativo e se ocorreu um clique do mouse
if (painel.activeSelf == false && Input.GetMouseButtonDown(0))
{
nomeObjeto.text = Nome;
painel.SetActive(true);
painel.transform.position = new Vector3(Input.mousePosition.x + painel.GetComponent().sizeDelta.x / 2 + 5, Input.mousePosition.y, 0);
}
else if (painel.activeSelf == true && Input.GetMouseButtonDown(0))
{
painel.SetActive(false);
}
// Atualiza a posição do painel
if (painel.activeSelf == false)
{
painel.transform.position = new Vector3(Input.mousePosition.x + painel.GetComponent().sizeDelta.x, Input.mousePosition.y, 0);
}
}
else if (painel.activeSelf == true && Input.GetMouseButtonDown(0))
{
painel.SetActive(false);
}
}
// Verifica se o bisturi está ativo
if (bisturi)
{
open = false;
cursorBisturi.SetActive(true);
// Lança um raio a partir do centro da tela
if (Physics.Raycast(ray, out hit) && Input.GetMouseButtonDown(0))
{
// Realiza operações relacionadas ao objeto atingido
// hit.collider.gameObject.GetComponent().valor = 0;
for (int i = 0; i < principalObject.GetComponent().sliderList.Length; i++)
{
if (hit.collider.gameObject.GetComponent().reference == principalObject.GetComponent().sliderList[i].GetComponent().reference)
{
principalObject.GetComponent().sliderList[i].GetComponent().value = 0;
}
}
}
// Adiciona um listener para o evento de mudança de valor nos sliders
for (int i = 0; i < principalObject.GetComponent().sliderList.Length; i++)
{
principalObject.GetComponent().sliderList[i].GetComponent().onValueChanged.AddListener(delegate { SliderModificado(); });
}
}
// Atualiza a posição do cursor do bisturi
cursorBisturi.transform.position = new Vector3(Input.mousePosition.x + cursorBisturi.GetComponent().sizeDelta.x / 2 + 2, Input.mousePosition.y - cursorBisturi.GetComponent().sizeDelta.y / 2 - 2);
}
// Método para controlar o bisturi
void buttonBisturiControler()
{
if (bisturi)
{
bisturi = false;
Cursor.visible = true;
}
else if (!bisturi && open)
{
bisturi = true;
Cursor.visible = false;
}
}
// Método chamado quando um slider é modificado
void SliderModificado()
{
// Aqui você pode adicionar a lógica relacionada à modificação do slider
}
// Método para fazer um botão aparecer ou desaparecer
void aparece(GameObject botao)
{
if (botao.GetComponent().Active == false)
{
botao.GetComponent().Active = true;
botao.GetComponent().image.transform.Rotate(0, 0, -90);
}
else
{
botao.GetComponent().Active =`your text` false;
botao.GetComponent().image.transform.Rotate(0, 0, 90);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... ameobjects
Мобильная версия