Files
beyond/Assets/Scripts/NavigationIndicator.cs
2024-11-20 15:21:28 +01:00

147 lines
4.6 KiB
C#
Raw Permalink Blame History

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<6E>ci
[SerializeField] private TextMeshProUGUI distanceText; // Tekst odleg<65>o<EFBFBD>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<65>o<EFBFBD><6F> od kraw<61>dzi ekranu w pionie
[SerializeField] private float edgeBufferWidth = 50f; // Odleg<65>o<EFBFBD><6F> od kraw<61>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<CanvasGroup>();
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;
}
}
}