commit428243f4a6Author: AsanoRema <asanorema2036@gmail.com> Date: Sat Aug 29 13:43:13 2026 +0300 Squashed commit of the following: commit68e78fa464Author: AsanoRema <asanorema2036@gmail.com> Date: Sat Aug 29 13:41:49 2026 +0300 Updated .gitignore commit9f87122a34Author: AsanoRema <asanorema2036@gmail.com> Date: Sat Aug 29 13:34:57 2026 +0300 Added Dohya commitf6a7547e84Author: AsanoRema <asanorema2036@gmail.com> Date: Fri Aug 21 17:59:13 2026 +0300 Fixed commitb98901c366Author: AsanoRema <asanorema2036@gmail.com> Date: Tue Aug 18 17:37:22 2026 +0300 Added new particle Package commitbb2f4a3b16Author: AsanoRema <asanorema2036@gmail.com> Date: Tue Aug 18 17:17:48 2026 +0300 Map mehanic ready to multiplayer commitc01ff800f6Author: AsanoRema <asanorema2036@gmail.com> Date: Tue Aug 18 16:16:19 2026 +0300 Squashed commit of the following: commit173bbb165cAuthor: henjkey <henjkey@gmail.com> Date: Fri Aug 14 18:51:23 2026 +0500 Mappp commitd559ab338aAuthor: henjkey <henjkey@gmail.com> Date: Thu Aug 13 18:42:41 2026 +0500 Map Controller Coordinates Target System Crosshair System Radar System
130 lines
4.2 KiB
C#
130 lines
4.2 KiB
C#
using UnityEngine;
|
|
|
|
[DisallowMultipleComponent]
|
|
public sealed class MapCrosshairController : MonoBehaviour
|
|
{
|
|
[Header("Nearest Target (Runtime)")]
|
|
[SerializeField] private MapTarget nearestTarget;
|
|
[SerializeField] private float distanceToNearestTarget = -1f;
|
|
|
|
private MapCoordinateSystem coordinateSystem;
|
|
private MapTargetController targetController;
|
|
private Transform relayX;
|
|
private Transform relayY;
|
|
private Transform crosshairVisual;
|
|
private Vector2 crosshairCoordinates;
|
|
private Vector3 relayXOffset;
|
|
private Vector3 relayYOffset;
|
|
private bool isConfigured;
|
|
|
|
public MapCoordinateSystem CoordinateSystem => coordinateSystem;
|
|
public Vector2 Coordinates => crosshairCoordinates;
|
|
|
|
public void Configure(
|
|
MapCoordinateSystem newCoordinateSystem,
|
|
Transform newRelayX,
|
|
Transform newRelayY,
|
|
Transform newCrosshairVisual,
|
|
MapTargetController newTargetController)
|
|
{
|
|
coordinateSystem = newCoordinateSystem;
|
|
relayX = newRelayX;
|
|
relayY = newRelayY;
|
|
crosshairVisual = newCrosshairVisual;
|
|
targetController = newTargetController;
|
|
isConfigured = CalibrateObjects();
|
|
}
|
|
|
|
public void SetCoordinates(Vector2 coordinates)
|
|
{
|
|
if (!isConfigured)
|
|
return;
|
|
|
|
crosshairCoordinates = coordinateSystem.ClampCoordinates(coordinates);
|
|
ApplyCoordinates();
|
|
UpdateNearestTarget();
|
|
}
|
|
|
|
public Vector2 GetCrosshairCoordinates() => crosshairCoordinates;
|
|
public MapTarget GetNearestTarget() => nearestTarget;
|
|
public float GetDistanceToNearestTarget() => distanceToNearestTarget;
|
|
|
|
public bool TryGetNearestTarget(out MapTarget target, out float distance)
|
|
{
|
|
target = nearestTarget;
|
|
distance = distanceToNearestTarget;
|
|
return target != null;
|
|
}
|
|
|
|
private void ApplyCoordinates()
|
|
{
|
|
crosshairVisual.position =
|
|
coordinateSystem.CoordinatesToWorldPosition(crosshairCoordinates);
|
|
|
|
if (relayX != null)
|
|
{
|
|
relayX.position = coordinateSystem.CoordinatesToWorldPosition(
|
|
new Vector2(crosshairCoordinates.x, 0f)) + relayXOffset;
|
|
}
|
|
|
|
if (relayY != null)
|
|
{
|
|
relayY.position = coordinateSystem.CoordinatesToWorldPosition(
|
|
new Vector2(0f, crosshairCoordinates.y)) + relayYOffset;
|
|
}
|
|
}
|
|
|
|
private bool CalibrateObjects()
|
|
{
|
|
if (coordinateSystem == null || crosshairVisual == null ||
|
|
!coordinateSystem.HasValidCorners())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Vector3 origin = coordinateSystem.CoordinatesToWorldPosition(Vector2.zero);
|
|
Vector3 horizontalDirection = coordinateSystem.CoordinatesToWorldPosition(
|
|
new Vector2(MapCoordinateSystem.CoordinateMaximum, 0f)) - origin;
|
|
Vector3 verticalDirection = coordinateSystem.CoordinatesToWorldPosition(
|
|
new Vector2(0f, MapCoordinateSystem.CoordinateMaximum)) - origin;
|
|
if (horizontalDirection.sqrMagnitude <= Mathf.Epsilon ||
|
|
verticalDirection.sqrMagnitude <= Mathf.Epsilon)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
horizontalDirection.Normalize();
|
|
verticalDirection.Normalize();
|
|
if (relayX != null)
|
|
relayXOffset = Vector3.ProjectOnPlane(relayX.position - origin, horizontalDirection);
|
|
if (relayY != null)
|
|
relayYOffset = Vector3.ProjectOnPlane(relayY.position - origin, verticalDirection);
|
|
return true;
|
|
}
|
|
|
|
private void UpdateNearestTarget()
|
|
{
|
|
nearestTarget = null;
|
|
distanceToNearestTarget = -1f;
|
|
if (targetController == null)
|
|
return;
|
|
|
|
float nearestSqrDistance = float.PositiveInfinity;
|
|
foreach (MapTarget target in targetController.Targets)
|
|
{
|
|
if (target == null)
|
|
continue;
|
|
|
|
float sqrDistance = (target.MapCoordinates - crosshairCoordinates).sqrMagnitude;
|
|
if (sqrDistance >= nearestSqrDistance)
|
|
continue;
|
|
|
|
nearestSqrDistance = sqrDistance;
|
|
nearestTarget = target;
|
|
}
|
|
|
|
if (nearestTarget != null)
|
|
distanceToNearestTarget = Mathf.Sqrt(nearestSqrDistance);
|
|
}
|
|
}
|