private void X_FingerDown(Finger finger) { // Early out if (GameManager.Instance.CurrentMenu != GameManager.MenuMode.Interaction || !_canSpawnDesc) { return; } // Mit Screen Ray ersten Hit bestimmen var screenRay = _ARCam.ScreenPointToRay(finger.screenPosition); if (Physics.Raycast(screenRay, out RaycastHit hit, Mathf.Infinity, _tridifyMask)) { // Layer anpassen if (_lastHit) { _lastHit.layer = LayerMask.NameToLayer("Tridify"); } // GameObjekt des Hits holen _lastHit = hit.transform.gameObject; // Layer anpassen _lastHit.layer = LayerMask.NameToLayer("Outline"); // Description setzen GameManager.Instance.UIController.ShowDescription(TridifyQuery.GetTitle(_lastHit), TridifyQuery.GetDescription(_lastHit)); // Vorheriges Explodable einklappen _explodable?.ExitExplosionMode(); // ggf. Explodable ausklappen if (hit.transform.TryGetComponent(out _explodable)) { _explodable.EnterExplosionMode(hit.normal); _lastNormal = hit.normal; } }
private IEnumerable <Object> X_BindPanel() { // Root cachen var root = _UIRenderer.visualTree; #region Placement & Edit // Animation Setup var animation = root.Q("placement-animation"); _animationScheduler = animation?.schedule.Execute(() => { if (_animationFrames.Count == 0) { return; } // Frame update _currentFrame = (_currentFrame + 1) % _animationFrames.Count; var frame = _animationFrames[_currentFrame]; animation.style.backgroundImage = frame; // 100ms Schritte bis Flag gesetzt wird }).Every(100).Until(() => { return(_stopAnimation); }); // Zunaechst pausieren _animationScheduler.Pause(); // Placement Mode Free Button binden root.Q <Button>("placement-select-free").clickable.clicked += () => { root.Q("placement-mode-select").style.display = DisplayStyle.None; root.Q("placement-free-info").style.display = DisplayStyle.Flex; #if UNITY_IOS if (_session.subsystem is ARKitSessionSubsystem sessionSubsystem) { sessionSubsystem.coachingGoal = ARCoachingGoal.HorizontalPlane; sessionSubsystem.SetCoachingActive(true, ARCoachingOverlayTransition.Animated); } #else // Animation ausfuehren root.Q("animation-area").style.display = DisplayStyle.Flex; _animationScheduler.Resume(); #endif GameManager.Instance.SetPlacementMode(GameManager.PlacementMode.Free); }; // Placement Mode QR Code Button binden root.Q <Button>("placement-select-qr").clickable.clicked += () => { root.Q("placement-mode-select").style.display = DisplayStyle.None; root.Q("placement-qr-info").style.display = DisplayStyle.Flex; GameManager.Instance.SetPlacementMode(GameManager.PlacementMode.QR); }; // Placement Accept Button binden root.Q <Button>("placement-accept").clickable.clicked += () => { // Modus wechseln (Placement -> Interaction) GameManager.Instance.SwitchMenu(GameManager.MenuMode.Interaction); }; // Placement Edit Button binden root.Q <Button>("placement-edit").clickable.clicked += () => { root.Q("placement-panel").style.display = DisplayStyle.None; root.Q("placement-edit-panel").style.display = DisplayStyle.Flex; }; // Edit Accept Button binden root.Q <Button>("placement-edit-accept").clickable.clicked += () => { root.Q("placement-edit-panel").style.display = DisplayStyle.None; root.Q("placement-panel").style.display = DisplayStyle.Flex; }; // Scale Edit Button binden root.Q <Button>("scale-obj").clickable.clicked += () => { root.Q("placement-edit-panel").style.display = DisplayStyle.None; root.Q("placement-edit-scale-panel").style.display = DisplayStyle.Flex; // Scale Slider Callback speichern root.Q <Slider>("scale-edit-slider").RegisterCallback(_floatChange, GameManager.Instance.ChangeScaling); }; // Scale Accept Button binden root.Q <Button>("scaling-accept").clickable.clicked += () => { root.Q("placement-edit-panel").style.display = DisplayStyle.Flex; root.Q("placement-edit-scale-panel").style.display = DisplayStyle.None; }; // Rotation Edit Button binden root.Q <Button>("rotate-obj").clickable.clicked += () => { root.Q("placement-edit-panel").style.display = DisplayStyle.None; root.Q("placement-edit-rotate-panel").style.display = DisplayStyle.Flex; // Rotation Slider Callback root.Q <Slider>("rotate-edit-slider").RegisterCallback(_floatChange, GameManager.Instance.ChangeRotation); }; // Rotation Accept Button binden root.Q <Button>("rotation-accept").clickable.clicked += () => { root.Q("placement-edit-panel").style.display = DisplayStyle.Flex; root.Q("placement-edit-rotate-panel").style.display = DisplayStyle.None; }; // Move Edit Button binden root.Q <Button>("move-obj").clickable.clicked += () => { root.Q("placement-edit-panel").style.display = DisplayStyle.None; root.Q("placement-edit-position-panel").style.display = DisplayStyle.Flex; }; // Move Accept Button binden root.Q <Button>("move-accept").clickable.clicked += () => { root.Q("placement-edit-panel").style.display = DisplayStyle.Flex; root.Q("placement-edit-position-panel").style.display = DisplayStyle.None; }; // Move Up Callbacks root.Q <Button>("move-up").RegisterCallback(_moveStart, Vector2.up); root.Q <Button>("move-up").RegisterCallback(_moveStop, Vector2.up); // Move Down Callbacks root.Q <Button>("move-down").RegisterCallback(_moveStart, Vector2.down); root.Q <Button>("move-down").RegisterCallback(_moveStop, Vector2.down); // Move Right Callbacks root.Q <Button>("move-right").RegisterCallback(_moveStart, Vector2.right); root.Q <Button>("move-right").RegisterCallback(_moveStop, Vector2.right); // Move Left Callbacks root.Q <Button>("move-left").RegisterCallback(_moveStart, Vector2.left); root.Q <Button>("move-left").RegisterCallback(_moveStop, Vector2.left); #endregion #region Options // Optionen Button binden root.Q <Button>("interaction-options").clickable.clicked += () => { GameManager.Instance.SwitchMenu(GameManager.MenuMode.Options); root.Q("interaction-panel").style.display = DisplayStyle.None; root.Q("options-panel").style.display = DisplayStyle.Flex; }; // Options Exit Button binden root.Q <Button>("options-exit").clickable.clicked += () => { GameManager.Instance.SwitchMenu(GameManager.MenuMode.Interaction); root.Q("desc-area").style.display = DisplayStyle.None; root.Q("hideSections-area").style.display = DisplayStyle.None; root.Q("options-panel").style.display = DisplayStyle.None; root.Q("create-section-panel").style.display = DisplayStyle.None; root.Q("switch-daytime-panel").style.display = DisplayStyle.None; root.Q("interaction-panel").style.display = DisplayStyle.Flex; root.Q <Button>("options-storeys-edit").RemoveFromClassList("clicked-button"); }; // Ghost Mode Button binden root.Q <Button>("options-switch-ghosted").clickable.clicked += () => { // Ghosted umschalten var newVis = GameManager.Instance.CameraController.GetVisualization() == CameraController.Visualization.Normal ? CameraController.Visualization.Ghosted : CameraController.Visualization.Normal; if (newVis == CameraController.Visualization.Ghosted) { root.Q <Button>("options-switch-ghosted").AddToClassList("clicked-button"); } else { root.Q <Button>("options-switch-ghosted").RemoveFromClassList("clicked-button"); } GameManager.Instance.CameraController.SetVisualization(newVis); }; // Storey Button binden root.Q <Button>("options-storeys-edit").clickable.clicked += () => { var area = root.Q("hideSections-area"); area.style.display = area.style.display == DisplayStyle.Flex ? DisplayStyle.None : DisplayStyle.Flex; if (area.style.display == DisplayStyle.Flex) { root.Q <Button>("options-storeys-edit").AddToClassList("clicked-button"); } else { root.Q <Button>("options-storeys-edit").RemoveFromClassList("clicked-button"); } }; // Description Box erstellen var listView = root.Q <ListView>("desc-box"); // Werte Anpassen listView.selectionType = SelectionType.None; listView.makeItem = X_MakeLine; listView.bindItem = X_BindLine; listView.itemsSource = _currentDesc; // Storey Toggles erstellen foreach (string storey in _storeyNames) { // Toggle erstellen Toggle storeyToggle = new Toggle(storey); // Stylesheets hinzufuegen foreach (var sheet in _UIRenderer.stylesheets) { storeyToggle.styleSheets.Add(sheet); } // Werte anpassen storeyToggle.name = "toggle-" + storey; storeyToggle.value = true; // Dem Container hinzufuegen root.Q("toggle-area").Add(storeyToggle); // Callback speichern storeyToggle.RegisterCallback <ChangeEvent <bool> >(evt => TridifyQuery.SetStoreyActive(GameManager.Instance.PlacedIFC.transform, storey, evt.newValue)); } // Reset Button binden root.Q <Button>("reset-btn").clickable.clicked += () => { foreach (string storey in _storeyNames) { // Storey aktivieren root.Q <Toggle>("toggle-" + storey).value = true; TridifyQuery.SetStoreyActive(GameManager.Instance.PlacedIFC.transform, storey, true); } }; // Section Edit Button binden root.Q <Button>("options-sections-create").clickable.clicked += () => { root.Q("options-panel").style.display = DisplayStyle.None; root.Q("create-section-panel").style.display = DisplayStyle.Flex; // Section Slider Callback speichern root.Q <Slider>("move-section-slider").RegisterCallback(_floatChange, GameManager.Instance.CameraController.SetCutPlane); }; // Sections Accept Button binden root.Q <Button>("create-section-panel-exit").clickable.clicked += () => { GameManager.Instance.CameraController.SetCutPlane(0f); root.Q("create-section-panel").style.display = DisplayStyle.None; root.Q("options-panel").style.display = DisplayStyle.Flex; }; // Scale Mode Button binden root.Q <Button>("options-scale").clickable.clicked += () => { // Size umschalten var newSize = GameManager.Instance.CurrentSize == GameManager.SizeMode.Scaled ? GameManager.SizeMode.Normal : GameManager.SizeMode.Scaled; if (newSize == GameManager.SizeMode.Scaled) { root.Q <Button>("options-scale").AddToClassList("clicked-button"); } else { root.Q <Button>("options-scale").RemoveFromClassList("clicked-button"); } GameManager.Instance.SwitchSize(newSize); }; // TOD Edit Button binden root.Q <Button>("options-switch-daytime").clickable.clicked += () => { root.Q("options-panel").style.display = DisplayStyle.None; root.Q("switch-daytime-panel").style.display = DisplayStyle.Flex; // TOD Slider Callback speichern root.Q <Slider>("daytime-slider").RegisterCallback <ChangeEvent <float> >(evt => { int hours = (int)evt.newValue / 60; int minutes = (int)evt.newValue % 60; _sunCalculator.SetTime(hours, minutes); }); }; // TOD Accept Button binden root.Q <Button>("switch-daytime-exit").clickable.clicked += () => { root.Q("switch-daytime-panel").style.display = DisplayStyle.None; root.Q("options-panel").style.display = DisplayStyle.Flex; }; #endregion #region Initialisierung root.Q("placement-mode-select").style.display = DisplayStyle.Flex; root.Q("placement-free-info").style.display = DisplayStyle.None; root.Q("placement-qr-info").style.display = DisplayStyle.None; root.Q("placement-panel").style.display = DisplayStyle.None; root.Q("options-panel").style.display = DisplayStyle.None; root.Q("interaction-panel").style.display = DisplayStyle.None; root.Q("animation-area").style.display = DisplayStyle.None; root.Q("desc-area").style.display = DisplayStyle.None; root.Q("hideSections-area").style.display = DisplayStyle.None; root.Q("placement-edit-panel").style.display = DisplayStyle.None; root.Q("placement-edit-scale-panel").style.display = DisplayStyle.None; root.Q("placement-edit-rotate-panel").style.display = DisplayStyle.None; root.Q("placement-edit-position-panel").style.display = DisplayStyle.None; root.Q("create-section-panel").style.display = DisplayStyle.None; root.Q("switch-daytime-panel").style.display = DisplayStyle.None; #endregion // Kein return notwendig return(null); }