> For the complete documentation index, see [llms.txt](https://dante-3.gitbook.io/dante-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dante-3.gitbook.io/dante-docs/indicator-system-plugin/indicator-descriptor.md).

# Indicator Descriptor

**Header:** `IndicatorSystem/Public/IndicatorDescriptor.h`\
**Module:** `IndicatorSystem`\
**Parent:** `UObject`\
**Specifiers:** `BlueprintType`

***

## Overview

`UIndicatorDescriptor` is the **runtime state object** for a single active indicator. It holds every piece of data the rendering pipeline (`SActorCanvas`) needs to project a world-space target onto the screen and display the correct widget.

One descriptor corresponds to one indicator. Descriptors are:

* **Created automatically** by `UIndicatorManagerComponent::BeginPlay` for the owning actor.
* **Created manually** if you need dynamic indicators that are not tied to a component lifecycle.
* Stored in both the owning `UIndicatorManagerComponent` and the global `UIndicatorSubsystem`.

***

## Default Property Values

| Property                                  | Default           |
| ----------------------------------------- | ----------------- |
| `bVisible`                                | `true`            |
| `bClampToScreen`                          | `false`           |
| `bShowClampToScreenArrow`                 | `false`           |
| `bAutoRemoveWhenIndicatorComponentIsNull` | `false`           |
| `bOverrideDesiredSize`                    | `false`           |
| `ProjectionMode`                          | `ComponentPoint`  |
| `HAlignment`                              | `HAlign_Center`   |
| `VAlignment`                              | `VAlign_Center`   |
| `Priority`                                | `0`               |
| `BoundingBoxAnchor`                       | `(0.5, 0.5, 0.5)` |
| `ScreenSpaceOffset`                       | `(0, 0)`          |
| `WorldPositionOffset`                     | `(0, 0, 0)`       |
| `DesiredSize`                             | `(100, 100)`      |
| `Scale`                                   | `1.0`             |
| `Scale2D`                                 | `(1.0, 1.0)`      |
| `MaxVisibleDistance`                      | `0` (unlimited)   |
| `MinVisibleDistance`                      | `0` (none)        |
| `OverlapPadding`                          | `(5, 5)`          |

***

## EActorCanvasProjectionMode

```cpp
enum class EActorCanvasProjectionMode : uint8
{
    ComponentPoint,
    ComponentBoundingBox,
    ComponentScreenBoundingBox,
    ActorBoundingBox,
    ActorScreenBoundingBox
};
```

| Mode                         | Description                                                                     | Best For                            |
| ---------------------------- | ------------------------------------------------------------------------------- | ----------------------------------- |
| `ComponentPoint`             | Projects the `SceneComponent`'s pivot (+ socket if set) + `WorldPositionOffset` | Simple markers, props               |
| `ComponentBoundingBox`       | Projects from the component's world bounding box using `BoundingBoxAnchor`      | Characters, skeletal meshes         |
| `ComponentScreenBoundingBox` | Computes screen-space bounds of the component and anchors within them           | Precise UI fitting on a single mesh |
| `ActorBoundingBox`           | Projects from the combined bounding box of all actor components                 | Multi-component actors              |
| `ActorScreenBoundingBox`     | Full actor bounding box resolved in screen space                                | Full-actor screen precision         |

### How `ComponentPoint` projection works

```
WorldLocation = Component->GetComponentLocation()
             (or socket transform if ComponentSocketName != NAME_None)

ProjectWorldLocation = WorldLocation + WorldPositionOffset

ScreenPos = ULocalPlayer::GetPixelPoint(ProjectWorldLocation)
ScreenPos.X += ScreenSpaceOffset.X  (flipped if behind camera)
ScreenPos.Y += ScreenSpaceOffset.Y

Depth = Distance(CameraOrigin, ProjectWorldLocation)
```

***

## Internal Fields (C++ only)

These fields are `private` and not directly accessible; use the getter/setter API above.

| Field                  | Type                                         | Notes                                                     |
| ---------------------- | -------------------------------------------- | --------------------------------------------------------- |
| `DataObject`           | `TObjectPtr<UObject>`                        | The payload passed to the widget                          |
| `Component`            | `TObjectPtr<USceneComponent>`                | World-space anchor                                        |
| `ComponentSocketName`  | `FName`                                      | Socket override (default `NAME_None`)                     |
| `IndicatorWidgetClass` | `TSoftClassPtr<UUserWidget>`                 | Widget to spawn                                           |
| `ManagerPtr`           | `TWeakObjectPtr<UIndicatorManagerComponent>` | Back-pointer to owning manager                            |
| `Content`              | `TWeakPtr<SWidget>`                          | The instantiated Slate widget (managed by `SActorCanvas`) |
| `CanvasHost`           | `TWeakPtr<SWidget>`                          | The canvas slot holding the widget                        |
| `ArrowBrush`           | `FSlateBrush`                                | Arrow image for screen-edge clamping                      |

`SActorCanvas` is declared a `friend` class and has direct access to `Content` and `CanvasHost` for widget lifecycle management.

***

## See Also

* [UIndicatorManagerComponent](/dante-docs/indicator-system-plugin/indicator-manager-component.md) — creates and owns descriptors
* [UIndicatorSubsystem](/dante-docs/indicator-system-plugin/indicator-subsystem.md) — global registry that stores descriptors
* [Setup Actions](/dante-docs/indicator-system-plugin/indicator-setup-action.md) — data-driven way to configure descriptor properties
* [SActorCanvas & Projection](/dante-docs/indicator-system-plugin/projection.md) — the rendering layer that consumes descriptors
