Ajude me com Unity Lista e Manipulação de objetos na Hierarquia.

C#

Unity 3D

12/04/2024

Queria ajuda com algo relacionado a C# e Unity. Estou desenvolvendo uma simulação em Unity que envolve a representação de sistemas biológicos, como o sistema circulatório humano. Neste contexto, tenho que lidar com a modelagem e organização de diversos elementos gráficos, como artérias, veias, coração.
No nosso caso, tenho um modelo tridimensional de um corpo humano na tela do computador. Ainda na mesma tela, do lado direito, tenho um menu com os nomes de todos os objetos modelo que estou vendo na tela. Para visualizar o modelo, feito no Blender, utilizo Unity e gero um executável que roda no navegador (google chrome ou iexplorer).
Para tornar a representação desse sistema mais organizada, preciso agrupar esses elementos de forma hierárquica e lógica. Por exemplo, quero agrupar a artéria mesentérica superior com outras artérias do grupo de artérias do sistema digestivo. Depois quero agrupar esse grupo com os grupos de artérias do sistema respiratório, artérias do sistema urinário dentro de um grupo maior chamado artérias. Então, quero agrupar o grupo das artérias com o grupo das veias e o coração em um grupo maior chamado sistema cardiovascular. A organização no menu à direita deve ficar assim:

- Item da lista

Sistema circulatório

-Coração
-Átrio direito
-Átrio esquerdo
-...
-Veias
-Veias do sistema digestivo
-Veia D
-...
-Veias do sistema urinário
-V veia
-...
-Veias do sistema respiratório
-Veia Z
-Veia...
-Artérias
-Artérias do sistema digestivo
-Artéria mesentérica superior
-Artéria mesentérica inferior
-...
-Artérias do sistema urinário
-Artéria X
-...
-Artérias do sistema respiratório
-Artéria Y
-...

No menu do lado direito haverá um botão que, ao ser clicado, mostrará os subgrupos que existem dentro dos grupos. Ao visualizar os subgrupos, haverá outro botão para cada subgrupo que, ao ser clicado, exibirá os elementos (artérias, veias) que estão dentro dos subgrupos.
É manipular os GameObjects igualmente como aqueles que estão dentro dos Grupos. Não consigo acessar objetos que estão dentro de outro Grupo dentro de outro Grupo. Estou usando o seguinte script:

```
// Método chamado a cada frame
void Update()
{
// Obtém os painéis do objeto principal
panels = principalObject.GetComponent<listadeObjetos>().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<RectTransform>().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<RectTransform>().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<ColorMaterial>().valor = 0;

for (int i = 0; i < principalObject.GetComponent<listadeObjetos>().sliderList.Length; i++)
{
if (hit.collider.gameObject.GetComponent<ReferenceName>().reference == principalObject.GetComponent<listadeObjetos>().sliderList[i].GetComponent<ReferenceName>().reference)
{
principalObject.GetComponent<listadeObjetos>().sliderList[i].GetComponent<Slider>().value = 0;
}
}
}

// Adiciona um listener para o evento de mudança de valor nos sliders
for (int i = 0; i < principalObject.GetComponent<listadeObjetos>().sliderList.Length; i++)
{
principalObject.GetComponent<listadeObjetos>().sliderList[i].GetComponent<Slider>().onValueChanged.AddListener(delegate { SliderModificado(); });
}
}

// Atualiza a posição do cursor do bisturi
cursorBisturi.transform.position = new Vector3(Input.mousePosition.x + cursorBisturi.GetComponent<RectTransform>().sizeDelta.x / 2 + 2, Input.mousePosition.y - cursorBisturi.GetComponent<RectTransform>().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<boolO>().Active == false)
{
botao.GetComponent<boolO>().Active = true;
botao.GetComponent<buttonImage>().image.transform.Rotate(0, 0, -90);
}
else
{
botao.GetComponent<boolO>().Active =`your text` false;
botao.GetComponent<buttonImage>().image.transform.Rotate(0, 0, 90);
}
}
}
```
Tentei fazer essa lista e conseguir interagir com o cursor em modo Bisturi com os objetos que estão agrupados dentro de outros grupos, mas não tive sucesso.
Kauãn Costa

Kauãn Costa

Curtidas 0
POSTAR