147 lines
4.6 KiB
C#
147 lines
4.6 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|