Map mehanic ready to multiplayer

This commit is contained in:
2026-08-18 17:17:48 +03:00
parent c01ff800f6
commit bb2f4a3b16
20 changed files with 4691 additions and 1648 deletions
@@ -1,90 +1,56 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
[DisallowMultipleComponent]
public sealed class MapRadarController : MonoBehaviour
{
[Header("Radar Settings")]
[SerializeField, Min(0f)] private float cooldown = 5f;
[SerializeField] private bool useKeyboardInput = true;
[Header("Radar State (Runtime)")]
[SerializeField] private float cooldownRemaining;
private readonly List<GameObject> radarMarks = new();
private MapCoordinateSystem coordinateSystem;
private MapTargetController targetController;
private MapTarget radarMarkPrefab;
private float nextActivationTime;
private bool isConfigured;
public float Cooldown => Mathf.Max(0f, cooldown);
public float CooldownRemaining => cooldownRemaining;
public bool IsReady => cooldownRemaining <= 0f;
private void OnValidate()
{
cooldown = Mathf.Max(0f, cooldown);
}
private void OnValidate() => cooldown = Mathf.Max(0f, cooldown);
public void Configure(
MapCoordinateSystem newCoordinateSystem,
MapTargetController newTargetController,
MapTarget newRadarMarkPrefab)
{
coordinateSystem = newCoordinateSystem;
targetController = newTargetController;
radarMarkPrefab = newRadarMarkPrefab;
isConfigured = coordinateSystem != null &&
coordinateSystem.HasValidCorners() &&
targetController != null &&
radarMarkPrefab != null;
if (targetController != null)
targetController.SetTargetVisualsVisible(false);
}
private void Update()
{
cooldownRemaining = Mathf.Max(0f, nextActivationTime - Time.time);
public void SetCooldownRemaining(float seconds) =>
cooldownRemaining = Mathf.Max(0f, seconds);
if (!useKeyboardInput)
public void ApplyRadarMarks(IReadOnlyList<Vector2> coordinates)
{
if (coordinateSystem == null || !coordinateSystem.HasValidCorners() ||
radarMarkPrefab == null)
{
return;
}
Keyboard keyboard = Keyboard.current;
if (keyboard != null && keyboard.oKey.wasPressedThisFrame)
ActivateRadar();
}
public bool ActivateRadar()
{
if (!isConfigured || Time.time < nextActivationTime)
return false;
PlaceRadarMarks();
nextActivationTime = Time.time + Mathf.Max(0f, cooldown);
cooldownRemaining = Mathf.Max(0f, nextActivationTime - Time.time);
return true;
}
private void PlaceRadarMarks()
{
int targetCount = targetController.Targets.Count;
EnsureRadarMarkCount(targetCount);
EnsureRadarMarkCount(coordinates.Count);
for (int index = 0; index < radarMarks.Count; index++)
{
bool hasTarget = index < targetCount && targetController.Targets[index] != null;
bool active = index < coordinates.Count;
GameObject radarMark = radarMarks[index];
radarMark.SetActive(hasTarget);
if (!hasTarget)
continue;
MapTarget target = targetController.Targets[index];
radarMark.name = $"Radar Mark - {target.name}";
radarMark.transform.position =
coordinateSystem.CoordinatesToWorldPosition(target.MapCoordinates);
radarMark.SetActive(active);
if (active)
{
radarMark.name = $"Radar Mark {index + 1}";
radarMark.transform.position =
coordinateSystem.CoordinatesToWorldPosition(coordinates[index]);
}
}
}
@@ -100,9 +66,9 @@ public sealed class MapRadarController : MonoBehaviour
private static void PrepareRadarMark(GameObject radarMark)
{
MapTarget targetMovement = radarMark.GetComponent<MapTarget>();
if (targetMovement != null)
targetMovement.enabled = false;
MapTarget target = radarMark.GetComponent<MapTarget>();
if (target != null)
target.enabled = false;
foreach (Collider targetCollider in radarMark.GetComponentsInChildren<Collider>(true))
targetCollider.enabled = false;