using UnityEngine; using UnityEngine.UI; using TMPro; namespace Beyond { public class NavigationIndicator : MonoBehaviour { [Header("UI Elements")] [SerializeField] private Image indicatorImage; // Sprite na ekranie [SerializeField] private CanvasGroup canvasGroup; // Kontrola widoczno�ci [SerializeField] private TextMeshProUGUI distanceText; // Tekst odleg�o�ci [SerializeField] private Sprite defaultSprite; [SerializeField] private Sprite edgeSpriteLeft; [SerializeField] private Sprite edgeSpriteRight; [SerializeField] private Sprite edgeSpriteTop; [SerializeField] private Sprite edgeSpriteBottom; [Header("Settings")] [SerializeField] private float edgeBufferHeight = 50f; // Odleg�o�� od kraw�dzi ekranu w pionie [SerializeField] private float edgeBufferWidth = 50f; // Odleg�o�� od kraw�dzi ekranu w poziomie private Camera mainCamera; private Transform targetTransform; private float distanceToTarget; private bool isActive; private void Awake() { if (indicatorImage != null) indicatorImage.sprite = defaultSprite; canvasGroup = GetComponent(); if (canvasGroup != null) canvasGroup.alpha = 0f; mainCamera = Camera.main; } private void Update() { if (targetTransform != null && isActive) { UpdateIndicator(); } } public void SetTargetTransform(Transform target) { targetTransform = target; isActive = true; if (canvasGroup != null) canvasGroup.alpha = 1f; } public void Deactivate() { isActive = false; if (canvasGroup != null) canvasGroup.alpha = 0f; } private void UpdateIndicator() { if (mainCamera == null || targetTransform == null) return; Vector3 targetPosition = targetTransform.position; Vector3 screenPos = mainCamera.WorldToScreenPoint(targetPosition); distanceToTarget = Vector3.Distance(mainCamera.transform.position, targetPosition); if (distanceText != null) { distanceText.text = $"[ {(int)distanceToTarget} m ]"; } // Handle indicator position on screen edge Vector2 clampedPosition = ClampToScreenEdge(screenPos); transform.position = clampedPosition; // Change sprite based on screen edge position if (indicatorImage != null) { if (clampedPosition.x <= edgeBufferWidth) { indicatorImage.sprite = edgeSpriteLeft; } else if (clampedPosition.x >= Screen.width - edgeBufferWidth) { indicatorImage.sprite = edgeSpriteRight; } else if (clampedPosition.y <= edgeBufferHeight) { indicatorImage.sprite = edgeSpriteTop; } else if (clampedPosition.y >= Screen.height - edgeBufferHeight) { indicatorImage.sprite = edgeSpriteBottom; } else { indicatorImage.sprite = defaultSprite; } } } private Vector2 ClampToScreenEdge(Vector3 screenPos) { if (screenPos.z < 0f) { if (screenPos.x > 0) { screenPos.x = 0; } else { screenPos.x = Screen.width; } screenPos.y = Screen.height - screenPos.y; } Vector2 screenPosEdgeClamp = screenPos; if (screenPos.x < edgeBufferWidth) { screenPosEdgeClamp.x = edgeBufferWidth; } else if (screenPos.x > Screen.width - edgeBufferWidth) { screenPosEdgeClamp.x = Screen.width - edgeBufferWidth; } if (screenPos.y < edgeBufferHeight) { screenPosEdgeClamp.y = edgeBufferHeight; } else if (screenPos.y > Screen.height - edgeBufferHeight) { screenPosEdgeClamp.y = Screen.height - edgeBufferHeight; } return screenPosEdgeClamp; } } }