Ollo integrates directly into Unreal Engine as a ready-to-use plugin exposing real-time blink and attention signals to both Blueprint and C++ gameplay systems.
UE 5.3+
Windows
Webcam or external frame source
Extract the SDK to:
<YourProject>/Plugins/Ollo/
Then place your license key in:
<YourProject>/Plugins/Ollo/ThirdParty/ollo/bin
Enable the plugin:
Restart the editor.
| Setting | Value |
|---|---|
| CameraIndex | 0 |
| Width | 640 |
| Height | 480 |
| FPS | 30 |
| Enable Pose Normalization | Enabled |
| Telemetry Enabled | Enabled |
Leave ModelPath empty to use the built-in runtime model.
Start() so startup failures and early events are not missed.Deinitialize() automatically performs a safe shutdown when the game exits, but explicit stopping is recommended for controlled runtime teardown.// MyBlinkActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "OlloTypes.h"
#include "MyBlinkActor.generated.h"
UCLASS()
class AMyBlinkActor : public AActor
{
GENERATED_BODY()
protected:
virtual void BeginPlay() override;
virtual void EndPlay(const EEndPlayReason::Type Reason) override;
private:
UFUNCTION() // Required for dynamic delegates
void OnBlink(const FOlloBlinkEvent& Event);
};
// MyBlinkActor.cpp
#include "MyBlinkActor.h"
#include "OlloSubsystem.h"
void AMyBlinkActor::BeginPlay()
{
Super::BeginPlay();
UOlloSubsystem* Ollo = UOlloSubsystem::Get(this);
if (!Blinkd) return;
// Bind before Start so you don't miss startup_failed
Ollo->OnBlinkDetected.AddDynamic(this, &AMyBlinkActor::OnBlink);
Ollo->OnStartupFailed.AddDynamic(this, &AMyBlinkActor::HandleStartupFailed);
// Empty string = use built-in model, camera 0, defaults
Ollo->Start(FString(), 0, 640, 480, 30, true, true);
}
void AMyBlinkActor::EndPlay(const EEndPlayReason::Type Reason)
{
if (UOlloSubsystem* Ollo = UOlloSubsystem::Get(this))
{
Ollo->OnBlinkDetected.RemoveDynamic(this, &AMyBlinkActor::OnBlink);
Ollo->Stop();
}
Super::EndPlay(Reason);
}
void AMyBlinkActor::OnBlink(const FOlloBlinkEvent& Event)
{
UE_LOG(LogTemp, Log,
TEXT("Blink #%lld | %.1f ms | quality: %d"),
Event.Sequence, Event.DurationMs, (int)Event.Quality);
// Do whatever: trigger animation, spawn effect, etc.
}
// Also add this to the header and implement it:
UFUNCTION()
void HandleStartupFailed(const FString& Error)
{
UE_LOG(LogTemp, Error, TEXT("[Ollo SDK] Could not start: %s"), *Error);
}
Key rule: Any function you bind to a DYNAMIC delegate must itself be a UFUNCTION otherwise the binding silently does nothing at runtime.
Ollo is implemented as a UGameInstanceSubsystem.
This means:
Typical usage:
Ollo processes tracking data asynchronously and dispatches gameplay events safely on the game thread.
Internal flow:
OnBlinkDetectedis always broadcast on the game thread and is safe to use directly in gameplay systems, animation logic and Blueprint graphs.
UPROPERTY(BlueprintAssignable)
FOlloBlinkDelegate OnBlinkDetected;
Fired whenever a blink is detected.
| Field | Description |
|---|---|
| Sequence | Incrementing blink event ID |
| Timestamp | Detection timestamp |
| DurationMs | Blink duration |
| Quality | Confidence/quality classification |
For systems that prefer polling instead of delegates:
IsBlinkDetected()
GetBlinkCount()
GetLastBlinkTime()
Useful for:
bool Start(...)
Starts:
Returns:
true on successful startupvoid Stop()
Stops:
Safe to call multiple times.
Ollo can process externally managed frame sources using:
FeedFrameRGBA(...)
Use cases:
This bypasses Ollo-managed camera capture and allows the runtime to operate on externally supplied RGBA frames.
OnStartupFailed
Triggered if:
Retrieve additional details with:
| Function | Description |
|---|---|
GetLastErrorCode() | Returns the last runtime error code. |
GetLastErrorString() | Returns the last runtime error message. |
Recommended:
Avoid repeatedly starting/stopping between levels unless necessary.
Always bind delegates before calling Start().
This ensures:
Blink delegates execute on the game thread.
Keep handlers lightweight and defer expensive work when possible.
Main runtime subsystem used to start tracking, receive blink events and query runtime state.
Accessible globally through:
UOlloSubsystem::Get(WorldContextObject)
Because Ollo is implemented as a UGameInstanceSubsystem, the runtime persists across level transitions unless explicitly stopped.
| Function | Description |
|---|---|
| Start(...) | Starts camera capture and the Ollo runtime. |
| Stop() | Stops tracking and shuts down the runtime safely. |
| IsRunning() | Returns whether the runtime is currently active. |
| GetVersion() | Returns the current Ollo runtime version string. |
bool Start(
const FString& ModelPath,
int32 CameraIndex = 0,
int32 Width = 640,
int32 Height = 480,
int32 FPS = 30,
bool bEnablePoseNormalization = true,
bool bTelemetryEnabled = true
)
Starts the Ollo tracking runtime.
| Parameter | Description |
|---|---|
ModelPath | Path to a custom model. Leave empty to use the built-in model. |
CameraIndex | Webcam device index. |
Width | Capture resolution width. |
Height | Capture resolution height. |
FPS | Target camera framerate. |
bEnablePoseNormalization | Stabilizes tracking under head movement. |
bTelemetryEnabled | Enables local runtime telemetry. |
| Value | Meaning |
|---|---|
true | Runtime initialized successfully. |
false | Startup failed. Use GetLastErrorString() for details. |
| Function | Description |
|---|---|
IsBlinkDetected() | Returns whether a blink is currently detected. |
GetBlinkCount() | Returns total detected blink count. |
GetLastBlinkTime() | Returns timestamp of the most recent blink. |
UPROPERTY(BlueprintAssignable)
FOlloBlinkDelegate OnBlinkDetected;
Broadcast whenever a blink is detected.
FOlloBlinkEvent)| Field | Description |
|---|---|
Sequence | Incrementing blink event identifier. |
Timestamp | Detection timestamp in seconds. |
DurationMs | Blink duration in milliseconds. |
Quality | Detection quality classification. |
UPROPERTY(BlueprintAssignable)
FOlloStartupFailedDelegate OnStartupFailed;
Triggered when the runtime fails to initialize.
Common causes:
bool FeedFrameRGBA(
const TArray<uint8>& Pixels,
int32 Width,
int32 Height,
double TimestampSec
)
Feeds externally managed RGBA frames into the Ollo runtime.
Use this when:
| Value | Meaning |
|---|---|
true | Frame accepted successfully. |
false | Runtime rejected the frame or is not active. |
static UOlloSubsystem* Get(UObject* WorldContextObject);
Retrieves the active Ollo subsystem from any valid world context.
Common usage locations:
Ollo automatically shuts down during subsystem deinitialization.
Recommended usage pattern:
Start once during application startup
Keep runtime persistent during gameplay
Stop only when tracking is no longer needed
For most projects, starting Ollo once and keeping the subsystem active across level transitions is the recommended approach.