> 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-setup-action/creating-a-custom-setup-action.md).

# Creating a Custom Setup Action

## Creating a Custom Setup Action

{% tabs %}
{% tab title="Blueprint" %}

* Create a Blueprint class derived from **Indicator Setup Action**.

<figure><img src="https://4216330531-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYsGXprPiDJ68FN8HnOaN%2Fuploads%2FTorkuzWzr0yPJv7RJdzk%2FEkran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-03-28%20102348.png?alt=media&amp;token=9170d693-f9e3-433f-bc7f-6628817852f2" alt=""><figcaption></figcaption></figure>

* Override the **On Indicator Setup Activated** event.<br>

  <figure><img src="https://4216330531-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYsGXprPiDJ68FN8HnOaN%2Fuploads%2FlJN4DV0WoYWkQ7Hn5v7t%2FEkran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-03-28%20102522.png?alt=media&amp;token=6b60bde5-cfa9-4d27-a422-8c6fcaee7848" alt=""><figcaption></figcaption></figure>

* Drag off the `Descriptor` pin and call any setter on `UIndicatorDescriptor`.

* Add the Blueprint action class to a `UIndicatorSetupConfig` asset.

<figure><img src="https://4216330531-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYsGXprPiDJ68FN8HnOaN%2Fuploads%2FFIYTAMwfrK4v3XaUDSS8%2FEkran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-03-28%20102619.png?alt=media&amp;token=6ed61a29-33fe-43e0-bd08-09c27127f099" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="C++" %}

```cpp
// MyIndicatorAction_SetScale.h
#pragma once
#include "IndicatorSetupActions.h"
#include "MyIndicatorAction_SetScale.generated.h"

UCLASS(DisplayName = "Set Scale")
class UMyIndicatorAction_SetScale : public UIndicatorSetupActions
{
    GENERATED_BODY()

public:
    virtual void OnIndicatorSetupActivated_Implementation(
        UIndicatorManagerComponent* IndicatorManager,
        UIndicatorDescriptor* Descriptor) override;

    UPROPERTY(EditAnywhere, Category = "Scale")
    float Scale = 1.5f;
};
```

```cpp
// MyIndicatorAction_SetScale.cpp
#include "MyIndicatorAction_SetScale.h"

void UMyIndicatorAction_SetScale::OnIndicatorSetupActivated_Implementation(
    UIndicatorManagerComponent* IndicatorManager,
    UIndicatorDescriptor* Descriptor)
{
    Super::OnIndicatorSetupActivated_Implementation(IndicatorManager, Descriptor);
    if (Descriptor)
    {
        Descriptor->SetScale(Scale);
    }
}
```

{% endtab %}
{% endtabs %}

***

## Typical Config Composition

The following action stack produces a screen-space enemy indicator with a clamp arrow:

| # | Action                  | Key Setting                                                |
| - | ----------------------- | ---------------------------------------------------------- |
| 1 | **Indicator Class**     | `WBP_EnemyIndicator`                                       |
| 2 | **Projection Mode**     | Character: `ComponentBoundingBox`, Other: `ComponentPoint` |
| 3 | **Bounding Box Anchor** | Character: `(0.5, 0.5, 1.0)`                               |
| 4 | **Set Align**           | `HAlign_Center`, `VAlign_Bottom`                           |
| 5 | **Clamp To Screen**     | `true`                                                     |
| 6 | **Arrow Brush**         | `T_Arrow`, show arrow: `true`                              |

***

## Action Ordering

Actions execute in array order. If one action depends on another's output, place it after:

```
Configs[0] = UIndicatorAction_IndicatorClass      ← set widget class first
Configs[1] = UIndicatorAction_ProjectionMode       ← set projection
Configs[2] = UIndicatorAction_ClampToScreen        ← enable clamping
Configs[3] = UIndicatorAction_ArrowStyle           ← arrow needs clamping already set
Configs[4] = UMyIndicatorAction                   ← custom logic last
```
