sevas55 Posted January 16, 2025 Posted January 16, 2025 Помогите разобраться с ГУИ. Добавил в мир ObjectGui В коде создаю кнопку и функцию нажатия к ней: using System.Collections; using System.Collections.Generic; using Unigine; [Component(PropertyGuid = "e43a1cf25fa271dca1f387fe5604fdeab4d5ec2c")] public class MyGuiTest : Component { Gui gui; WidgetButton widget_buttonSonarMode; void Init() { gui = (node as ObjectGui).GetGui(); widget_buttonSonarMode = new WidgetButton(gui, "Sonar Mode"); widget_buttonSonarMode.Arrange(); widget_buttonSonarMode.SetPosition(10,100); widget_buttonSonarMode.FontSize = 50; widget_buttonSonarMode.ButtonColor = vec4.BLUE; // устанавливаем лямбда-функцию для обработки события CLICKED (щелчок мыши) widget_buttonSonarMode.EventClicked.Connect(BtnSonarMode); widget_buttonSonarMode.Enabled = true; gui.AddChild(widget_buttonSonarMode, Gui.ALIGN_OVERLAP); // Input.MouseGrab = true; } void BtnSonarMode(Widget sender) { Log.MessageLine("BTN SONAR"); } } Кнопка создается и отображается как положено, но при попытке нажать на неё ничего не происходит, функция нажатия не вызывается, курсор просто исчезает.
bmyagkov Posted January 17, 2025 Posted January 17, 2025 Добрый день! Попробуйте также использовать метод setControlDistance https://developer.unigine.com/en/docs/2.19.1/api/library/objects/class.objectgui?rlang=cpp&autotranslate=en#setControlDistance_float_void Наиболее вероятно, что это может решить вашу проблему: obj_gui_distance.mp4 Спасибо!
sevas55 Posted January 17, 2025 Author Posted January 17, 2025 Спасибо за разъяснение! В тестовом проекте все заработало. Но проблема пока решена частично и, возможно, я нашел то ли баг, то ли нужно для gui тип переменной Control Distance сменить с float на double для проектов double. В моем рабочем проекте (double) большие расстояния, > 20 км. Район где должен работать симулятор от начала мировой системы координат >20 км. Если выставить в GUI Control Distance = 100 км, то он начинает как то реагировать и захватывать мышь. Но курсор мыши резко меняет положение и попасть в кнопку не получается, как будто появляется ошибка округления для float. Такое ощущение, что Control Distance отсчитывается почему-то не от текущей камеры, а от начала мировой системы координат. Прикрепляю свой очищенный рабочий проект (755 Мб), где проблема воспроизводится 100% В проекте находится водный мотоцикл на котором gui эхолота дочерний к нему. Как можно решить проблему? Вариант перенести область симуляции ближе к началу координат понятен, но хотелось бы чтобы gui работал везде в мире. И тогда нелогичен параметр Control Distance, если он не привязан к текущей камере.
bmyagkov Posted January 20, 2025 Posted January 20, 2025 Добрый день! On 1/18/2025 at 2:27 AM, sevas55 said: Но проблема пока решена частично и, возможно, я нашел то ли баг, то ли нужно для gui тип переменной Control Distance сменить с float на double для проектов double. Похоже, возникли небольшие внутренние проблемы с ObjectGui, но можно попытаться обойти это ограничение, использовав другой режим мыши — MOUSE_VIRTUAL, в котором необходимо самостоятельно передавать позиции, кнопки и отображение курсора. В приведенном примере мышь обновляется с помощью метода setMouse: https://developer.unigine.com/en/docs/2.19.1/api/library/objects/class.objectgui?rlang=cs#setMouse_Vec3_Vec3_int_int_void 2025-01-20 16-36-49.mp4 Скажите, вам может подойти это решение с примером кода, который приведен во вложении к этому сообщению? Спасибо! GUI_Sonar.cs 1
sevas55 Posted January 20, 2025 Author Posted January 20, 2025 Да, Ваш код работает и в рабочем проекте. Спасибо за помощь от меня и студентов! 1
bmyagkov Posted January 20, 2025 Posted January 20, 2025 13 minutes ago, sevas55 said: Да, Ваш код работает и в рабочем проекте. Спасибо за помощь от меня и студентов! Пожалуйста!
Recommended Posts