Getting Started

Table of Contents

  1. Installation
  2. Step 1 – Create a Quest Data Asset
  3. Step 2 – Create a Quest Set
  4. Step 3 – Add a Quest Manager
    1. Player-specific quests (Component)
    2. Party/shared quests (Actor)
  5. Step 4 – Author Quest Logic in StateTree
  6. Step 5 – Start a Quest at Runtime
  7. Step 6 – Implement an Objective
  8. Step 7 – Save and Load
  9. Diagnostics

Installation

  1. Copy the PulseQuest plugin folder into your project’s Plugins/ directory.
  2. Re-generate your project files and compile.
  3. Enable the plugin in Edit > Plugins > Pulse and restart the editor.

The plugin registers:

  • A Runtime module (PulseQuest)
  • An Editor module (PulseQuestEditor) – active only in the Unreal Editor

Step 1 – Create a Quest Data Asset

  1. Right-click in the Content Browser, choose Miscellaneous > Data Asset.
  2. Pick PulseQuest as the class.
  3. Open the asset and configure:
Property Purpose
Tag Unique GameplayTag that identifies this quest. Required.
DisplayName Human-readable quest name
Description Longer quest description
StateTree The StateTree asset holding quest logic (schema: Pulse Quest)
QuestDataClass Optional custom UPulseQuestData subclass
MetaData Optional extra object (icons, reward info, …)
DefaultFlags Bitmask of EPulseQuestFlags applied at start

Validation: The asset will show an error if Tag is empty or the StateTree asset is missing.


Step 2 – Create a Quest Set

  1. Create a PulseQuestSet Data Asset.
  2. Add your UPulseQuest assets to the Quests array.
  3. (Optional) Nest other UPulseQuestSet assets via the QuestSets array.

The Quest Set is the allowed pool of quests a manager may start. The editor validates for circular references in nested sets.


Step 3 – Add a Quest Manager

Player-specific quests (Component)

Add the UPulseQuestManager component to:

  • APlayerController
  • APlayerState
  • Any other Actor

In the component’s Manager Params:

Property Purpose
QuestSet The Quest Set created above
bAllowMultipleQuests Whether multiple quests can run simultaneously
QuestManagerDataClass Optional custom manager data class
QuestManagerViewModelClass Optional MVVM ViewModel class
QuestDirectorClass Optional Director class

bAutoManageAvatarActor = true automatically tracks the owning pawn’s changes when attached to a PlayerController or PlayerState.

Party/shared quests (Actor)

Place an APulseSharedQuestHost actor in the level (or spawn it at runtime). Configure ManagerParams in the same way. Use AddPlayer / RemovePlayer to manage participants.


Step 4 – Author Quest Logic in StateTree

  1. Create a StateTree asset.
  2. Set the Schema to Pulse Quest (UPulseQuestStateTreeSchema).
  3. Configure schema defaults (QuestClass, QuestDataClass, QuestManagerClass, …).
  4. Add states and use the built-in Pulse Quest tasks:
Task Use case
Quest Objective Run an objective class while a state is active
Start Quest Start a sub-quest from within another quest/director
Wait for (Quest Started) Block until a specific quest becomes active
Wait for (Quest Finished) Block until a specific quest finishes
Wait for (Objective Started) Block until an objective class starts
Wait for (Objective Finished) Block until an objective class finishes
  1. Assign the compiled StateTree to your UPulseQuest asset’s StateTree field.

Step 5 – Start a Quest at Runtime

Blueprint:

Quest Manager → StartQuest
  Input: QuestTag (GameplayTag)
  Output: bool (success/fail) + OutReason (failure tags)

C++:

FPulseQuestAddParams Params = FPulseQuestAddParams::FromQuestTag(MyQuestTag);
FGameplayTagContainer OutReason;
QuestManagerComponent->StartQuest(Params, OutReason);

Step 6 – Implement an Objective

Create a Blueprint or C++ subclass of UPulseQuestObjective:

UCLASS()
class UMyFirstObjective : public UPulseQuestObjective
{
    GENERATED_BODY()

    virtual EPulseObjectiveCompletionStatus InitObjective_Implementation(
        const FPulseObjectiveHandle& Handle, const FGameplayTag& QuestTag) override;

    virtual void ObjectiveStarted_Implementation() override;
};

To complete it from inside the objective:

CompleteObjective(EPulseQuestObjectiveCompletionMode::Success);

Step 7 – Save and Load

// Create a save game container
FPulseQuestSaveGame SaveGame;
FPulseQuestSaveGameView SaveView(SaveGame);

// Save
QuestManager->SaveQuestManager(SaveView, /*bAsync=*/true);

// Load (resets manager by default)
FPulseQuestManagerLoadParams Params;
QuestManager->LoadQuestManager(SaveView, Params);

Blueprint Async nodes are available: SaveQuestManagerAsync and LoadQuestManagerAsync.


Diagnostics

  • Console: Stat QUEST – performance stats for quest manager tick and event queue
  • Log category: LogPulseQuest
  • Verbose logging via Unreal Visual Logger (context-aware PULSE_QUEST_VLOG)

Back to top

Copyright © 2026 LuQ Studios. Distributed under the MIT License.

This site uses Just the Docs, a documentation theme for Jekyll.