UnityTowerDefense/Assets/_Project/Scripts/Gameplay/ISelectable.cs

46 lines
1.8 KiB
C#

// Assets/_Project/Scripts/Gameplay/ISelectable.cs
using UnityEngine;
namespace TD.Gameplay
{
/// <summary>
/// Categorizes the kind of selectable object so HUD can decide which command
/// buttons (tower-build vs upgrade/sell vs none) to show without doing
/// type-tests against every concrete component.
/// </summary>
public enum SelectableKind
{
Builder,
Tower,
Enemy,
BuildSite, // tower in queued / constructing / paused / shelved state
}
/// <summary>
/// Anything the local player can click to select. Implementers expose a
/// display name for the HUD portrait, a kind for context-aware UI, and the
/// position + size hints the <see cref="SelectionVisualizer"/> needs to draw
/// the selection ring.
/// </summary>
/// <remarks>
/// Selection is a local UI concept — implementers don't need to be
/// NetworkBehaviours (though Builder and TowerInstance happen to be).
/// </remarks>
public interface ISelectable
{
string DisplayName { get; }
SelectableKind Kind { get; }
/// <summary>Transform whose XZ position the scene-wide selection ring
/// follows. The visualizer projects Y to the buildable plane regardless
/// of where this transform sits, so implementers can simply return
/// <c>this.transform</c>.</summary>
Transform SelectionTransform { get; }
/// <summary>Half-width of the selection ring in world units. The visualizer
/// scales its base 1-unit-diameter ring mesh to <c>2 * SelectionRadius</c>.
/// Computed on every selection change, so implementers may derive it from
/// runtime state (e.g., tower footprint, collider bounds).</summary>
float SelectionRadius { get; }
}
}