Mini demo with all features

This commit is contained in:
2026-02-23 14:10:46 +01:00
parent 5b1bdaeb90
commit d9326e48cc
176 changed files with 32668 additions and 564 deletions
@@ -2,6 +2,7 @@ using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using Unheimlich.Gameplay.DetectiveBoard;
using Unheimlich.Gameplay.Player;
using System.Collections.Generic;
using UnityEngine.EventSystems;
@@ -14,35 +15,38 @@ namespace Unheimlich.UI.DetectiveBoard
/// </summary>
public class DetectiveBoardInteraction : MonoBehaviour
{
[Header("References")]
[SerializeField] private Camera _camera;
[SerializeField] private Canvas _boardCanvas;
[SerializeField] private RectTransform _boardArea;
[SerializeField] private LayerMask _boardLayer;
[SerializeField] private DetectiveBoardController _boardController;
[Header("Settings")]
[SerializeField] private LayerMask _boardLayer;
[SerializeField] private float _minInteractionDistance = 0.1f;
[SerializeField] private float _maxInteractionDistance = 10f;
private Camera _camera;
private Canvas _boardCanvas;
private RectTransform _boardArea;
private DetectiveBoardController _boardController;
private DetectiveBoardCanvas _canvasManager;
private PostItNode _hoveredNode;
private PostItNode _selectedNode;
private ConnectionLine _hoveredLine;
private bool _isDragging;
private Plane _canvasPlane;
private Vector3 _dragOffset;
private void Start()
{
_boardCanvas = GetComponent<Canvas>();
_canvasManager = GetComponent<DetectiveBoardCanvas>();
_boardController = DetectiveBoardController.Instance;
if (_canvasManager != null && _canvasManager.BoardArea != null)
_boardArea = _canvasManager.BoardArea;
if (PlayerController.Instance != null)
_camera = PlayerController.Instance.PlayerCamera;
if (_camera == null)
_camera = Camera.main;
if (_boardController == null)
_boardController = FindFirstObjectByType<DetectiveBoardController>();
if (_canvasManager == null)
_canvasManager = GetComponent<DetectiveBoardCanvas>();
UpdateCanvasPlane();
}
@@ -63,6 +67,7 @@ namespace Unheimlich.UI.DetectiveBoard
else
{
HandleHover();
HandleLineHover();
}
HandleClick();
@@ -70,7 +75,9 @@ namespace Unheimlich.UI.DetectiveBoard
private bool IsInBoardInteractionMode()
{
return _boardController != null && _boardController.IsBoardActive;
bool isActive = _boardController != null && _boardController.IsBoardActive;
return isActive;
}
private void ClearInteractionState()
@@ -81,6 +88,12 @@ namespace Unheimlich.UI.DetectiveBoard
_hoveredNode = null;
}
if (_hoveredLine != null && _canvasManager != null)
{
_canvasManager.SetHoveredLine(null);
_hoveredLine = null;
}
if (_selectedNode != null && _isDragging)
{
_selectedNode.SetSelected(false);
@@ -119,6 +132,59 @@ namespace Unheimlich.UI.DetectiveBoard
}
}
private void HandleLineHover()
{
if (_canvasManager == null || Mouse.current == null)
return;
if (_hoveredNode != null)
{
if (_hoveredLine != null)
{
_canvasManager.SetHoveredLine(null);
_hoveredLine = null;
}
return;
}
ConnectionLine hitLine = RaycastForLine();
if (hitLine != _hoveredLine)
{
_canvasManager.SetHoveredLine(hitLine);
_hoveredLine = hitLine;
}
}
private ConnectionLine RaycastForLine()
{
if (_camera == null || Mouse.current == null)
return null;
Vector2 mousePos = Mouse.current.position.ReadValue();
GraphicRaycaster raycaster = _boardCanvas?.GetComponent<GraphicRaycaster>();
if (raycaster != null && EventSystem.current != null)
{
var pointerEventData = new PointerEventData(EventSystem.current)
{
position = mousePos
};
var results = new List<RaycastResult>();
raycaster.Raycast(pointerEventData, results);
foreach (var result in results)
{
ConnectionLine line = result.gameObject.GetComponentInParent<ConnectionLine>();
if (line != null)
return line;
}
}
return null;
}
private void HandleClick()
{
if (Mouse.current == null)
@@ -128,7 +194,18 @@ namespace Unheimlich.UI.DetectiveBoard
if (Mouse.current.leftButton.wasPressedThisFrame)
{
HandleLeftClick(hitNode);
if (hitNode != null)
{
HandleLeftClick(hitNode);
}
else
{
ConnectionLine hitLine = RaycastForLine();
if (hitLine != null && _canvasManager != null)
{
_canvasManager.OnLineClicked(hitLine);
}
}
}
else if (Mouse.current.rightButton.wasPressedThisFrame && hitNode != null && _canvasManager != null)
{