Files
FORT-BO/Assets/CONTENT/FEATURES/MapRadar/MapTarget.cs

88 lines
2.9 KiB
C#

using UnityEngine;
[DisallowMultipleComponent]
public class MapTarget : MonoBehaviour
{
[Header("Target State (Runtime)")]
[SerializeField] private TargetConfig config;
[SerializeField] private int targetId = -1;
[SerializeField] private float timeUntilAttack;
[SerializeField] private Vector2 mapCoordinates;
[SerializeField] private int currentHealth;
[SerializeField] private MissileType requiredMissileType;
private MapCoordinateSystem coordinateSystem;
private MapPlayer player;
private Renderer[] targetRenderers;
private Collider[] targetColliders;
public int TargetId => targetId;
public Vector2 MapCoordinates => mapCoordinates;
public MapCoordinateSystem CoordinateSystem => coordinateSystem;
public TargetConfig Config => config;
public MapPlayer Player => player;
public float TimeUntilAttack => timeUntilAttack;
public int CurrentHealth => currentHealth;
public MissileType RequiredMissileType => requiredMissileType;
public void Configure(
TargetConfig newConfig,
MapCoordinateSystem newCoordinateSystem,
MapPlayer newPlayer)
{
config = newConfig;
coordinateSystem = newCoordinateSystem;
player = newPlayer;
}
public void ApplyNetworkState(MapTargetNetworkState state)
{
targetId = state.TargetId;
timeUntilAttack = state.AttackTimeRemaining;
currentHealth = state.Health;
requiredMissileType = config != null
? config.RequiredMissileType
: MissileType.None;
SetMapCoordinates(state.Coordinates);
}
public void SetMapCoordinates(Vector2 coordinates)
{
mapCoordinates = coordinateSystem != null
? coordinateSystem.ClampCoordinates(coordinates)
: new Vector2(
Mathf.Clamp(coordinates.x, 0f, MapCoordinateSystem.CoordinateMaximum),
Mathf.Clamp(coordinates.y, 0f, MapCoordinateSystem.CoordinateMaximum));
if (coordinateSystem != null && coordinateSystem.HasValidCorners())
transform.position = coordinateSystem.CoordinatesToWorldPosition(mapCoordinates);
}
public Vector2 GetMapCoordinates() => mapCoordinates;
public void SetVisualsVisible(bool isVisible)
{
if (targetRenderers == null)
targetRenderers = GetComponentsInChildren<Renderer>(true);
if (targetColliders == null)
targetColliders = GetComponentsInChildren<Collider>(true);
foreach (Renderer targetRenderer in targetRenderers)
{
if (targetRenderer != null)
targetRenderer.enabled = isVisible;
}
// Map targets are presentation objects, never physical world objects.
foreach (Collider targetCollider in targetColliders)
{
if (targetCollider != null)
targetCollider.enabled = false;
}
}
protected virtual void TickMovement(float deltaTime)
{
}
}