Объединение C# и Unity GameObjectsC#

Место общения программистов C#
Ответить
Anonymous
 Объединение C# и Unity GameObjects

Сообщение Anonymous »

Мне нужна была помощь с чем-то, связанным с C# и Unity. Я разрабатываю симуляцию в Unity, которая включает в себя представление биологических систем, таких как система кровообращения человека. В данном контексте мне приходится заниматься моделированием и организацией различных графических элементов, таких как артерии, вены, сердце.
В нашем случае я имею трехмерную модель человеческого тела на экране компьютера. Все еще на том же экране, с правой стороны, у меня есть меню с названиями всех объектов модели, которые я вижу на экране. Для визуализации модели, созданной в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»