> 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-subsystem.md).

# indicator subsystem

| Field        | Value                                         |
| ------------ | --------------------------------------------- |
| Header       | `IndicatorSystem/Public/IndicatorSubsystem.h` |
| Module       | `IndicatorSystem`                             |
| Parent       | `UGameInstanceSubsystem`                      |
| Display Name | `Indicator Manager Subsystem`                 |
| Specifiers   | `Blueprintable`                               |

***

## Overview

`UIndicatorSubsystem` is the **global registry** for all active indicators in the running game session. It is a `UGameInstanceSubsystem`, meaning:

* **One instance per game session** — shared across all worlds in the session.
* **Automatically created and destroyed** by the engine alongside `UGameInstance` — no manual initialization needed.
* **Accessible from anywhere** that has access to a `UWorld` or `UGameInstance`.

Every `UIndicatorManagerComponent` calls `AddIndicatorForActor` during `BeginPlay` and `RemoveIndicatorForActor` during `EndPlay`, keeping the subsystem's registry in sync with the currently live actors.

The subsystem maintains a single `TMap<AActor*, UIndicatorDescriptor*>` (`ActiveIndicators`) as its source of truth.

***

### Lookup Methods

#### `IsIndicatorActiveForActor`

```cpp
UFUNCTION(BlueprintPure, Category = "Indicator Manager Subsystem")
bool IsIndicatorActiveForActor(AActor* InActor);
```

Returns `true` if the subsystem has a registered descriptor for `InActor`.

#### `FindIndicatorDescriptorByActor`

```cpp
UFUNCTION(BlueprintCallable, Category = "Indicator Manager Subsystem")
UIndicatorDescriptor* FindIndicatorDescriptorByActor(AActor* InActor);
```

Returns the `UIndicatorDescriptor` registered for `InActor`, or `nullptr` if none exists. The primary way to reach a descriptor when you only have a reference to the actor.

#### `FindIndicatorActorByDescriptor`

```cpp
UFUNCTION(BlueprintCallable, Category = "Indicator Manager Subsystem")
AActor* FindIndicatorActorByDescriptor(UIndicatorDescriptor* InDescriptor);
```

Reverse lookup — iterates `ActiveIndicators` and returns the `AActor` whose descriptor matches `InDescriptor`. Returns `nullptr` if not found. O(n) over the number of registered actors.

#### `GetActiveIndicators`

```cpp
UFUNCTION(BlueprintPure, Category = "Indicator Manager Subsystem")
TMap<AActor*, UIndicatorDescriptor*> GetActiveIndicators() const;
```

Returns a **copy** of the full registry map. Useful in Blueprint for iterating all active indicators. For C++ hot-paths, prefer the `const` reference accessor instead:

```cpp
// C++ — no copy, direct read-only access
const TMap<AActor*, UIndicatorDescriptor*>& Map =
    IndicatorSub->GetRegisteredIndicatorsMap();
```

***

## See Also

* [UIndicatorManagerComponent](/dante-docs/indicator-system-plugin/indicator-manager-component.md) — component that feeds this subsystem
* [UIndicatorDescriptor](/dante-docs/indicator-system-plugin/indicator-descriptor.md) — the data object stored per actor
* [SActorCanvas & Projection](/dante-docs/indicator-system-plugin/projection.md) — the Slate widget that reads from this subsystem to render indicators
