heos666 Posted April 4, 2023 Share Posted April 4, 2023 (edited) Только начал изучать Unigine, и есть проблема. У меня есть модель из множества объектов Я хочу сделать информацию при выборе объекта. (Клика погибает на объекте и при выборе объекта с текстом) Как это можно сделать Edited April 4, 2023 by heos666 Link to comment
bmyagkov Posted April 4, 2023 Share Posted April 4, 2023 Добрый день! Подобный функционал есть в "Oil Refinery" демо, который можно скопировать как проект прямо в SDK Browser и посмотреть как это было реализовано. Спасибо! Link to comment
heos666 Posted April 5, 2023 Author Share Posted April 5, 2023 А есть ли такой функционал на C#? Link to comment
fox Posted April 5, 2023 Share Posted April 5, 2023 Здравствуйте! В качестве простого примера отображения информации о ноде на C# можно попробовать такую компоненту: using System; using System.Collections; using System.Collections.Generic; using Unigine; #if UNIGINE_DOUBLE using Vec3 = Unigine.dvec3; #else using Vec3 = Unigine.vec3; #endif [Component(PropertyGuid = "AUTOGEN_GUID")]//<-- Здесь должен быть GUID вашей новой компоненты public class SelectedNodeInfo : Component { private Unigine.Object selected_object = null; [MethodInit(Order=2)] private void Init() { // переключаем режим работы с курсором мыши, чтобы он не исчезал при клике Input.MouseHandle = Input.MOUSE_HANDLE.SOFT; // включаем Visualizer Visualizer.Mode = Visualizer.MODE.ENABLED_DEPTH_TEST_ENABLED; } private void Update() { // проверяем, состояние левой кнопки мыши if(Input.IsMouseButtonDown(Input.MOUSE_BUTTON.LEFT)) { Player player = Game.Player; // задаем начало отрезка (p0) в позиции камеры и конец (p1) - в точке, направление в которую указывает курсор мыши ivec2 mouse = Input.MousePosition; Vec3 p0 = player.WorldPosition; Vec3 p1 = p0 + new Vec3(player.GetDirectionFromMainWindow(mouse.x, mouse.y)) * 100; // создаем экземпляр класса WorldIntersection для хранения информации о пересечении WorldIntersection intersection = new WorldIntersection(); // пускаем луч из точки p0 в точку p1 чтобы найти первый пересеченный объект Unigine.Object obj = World.GetIntersection(p0, p1, 1, intersection); // если объект обнаружен, запоминаем как выделенный if(obj) selected_object = obj; else selected_object = null; } // если есть выделенный объект if (selected_object) { // формируем строку для отображения информации об объекте String message = String.Format("{0}\n Этот объект ...\nТекущие координаты:\n ({1}, {2}, {3})", selected_object.Name, selected_object.WorldPosition.x, selected_object.WorldPosition.y, selected_object.WorldPosition.z); // отрисовываем баунд для объекта Visualizer.RenderNodeBoundBox(selected_object, new vec4(0.0f, 1.0f, 0.0f, 1.0f)); // отрисовываем полупрозрачный бокс по баунду и выводим информационный текст Visualizer.RenderSolidBox(new vec3(selected_object.WorldBoundBox.maximum - selected_object.WorldBoundBox.minimum), MathLib.Translate(selected_object.WorldBoundBox.Center), new vec4(0.0f, 1.0f, 0.0f, 0.3f)); Visualizer.RenderMessage3D(selected_object.WorldPosition,new Vec3(0.0f), message, new vec4(1.0f), 1, 20); } } } Чтобы проверить ее в работе: Создайте компоненту SelectedNodeInfo и откройте ее в IDE. Вставьте в нее приведенный выше код. Вернитесь в редактор и назначьте компоненту на какую-либо ноду в сцене Нажмите Play. Работает она примерно так: Спасибо! 2 Link to comment
Recommended Posts