How to get current frame in current Level Sequence?

I’m trying to make an Editor Utility Widget for helping to set keyframes on the control rig. I can get hold of the current Level Sequence, and can use, for example, ‘Set Local Control Rig Vector 2D’ to set the correct value, but it needs a frame to be specified.
I can’t seem to find any function for finding the current frame in the sequence. There are functions for getting start or end frames, but I just don’t see any way to get the current frame. Am I missing something?

Is this what your looking for?

currentFrame = unreal.LevelSequenceEditorBlueprintLibrary.get_current_time()

https://docs.unrealengine.com/5.0/en-US/PythonAPI/class/LevelSequenceEditorBlueprintLibrary.html

Thanks. I’d rather avoid Python if possible. It’s definitely possible in C++ but I guess not implemented in Blueprint.

Hey there @steve_kuva! If we’re trying to get the current level sequences current frame in blueprints, I think the only way is through this node, but I’ve never used/researched it before myself, so excellent question!

It’s part of Vcams themselves and that threw me off a bit.

In case the node did not work, you can use this snippet. I am using it in my plugin as well.

int32 GetCursorFrameNumber(ULevelSequence* LevelSequence)
{
  auto toolKit = FToolkitManager::Get().FindEditorForAsset(LevelSequence);
  if (toolKit)
  {
    IToolkit* toolKit_p = toolKit.Get();
    if (auto levelSequenceEditorToolkit = static_cast<ILevelSequenceEditorToolkit*>(toolKit_p))
    {
      if (auto sequencer = levelSequenceEditorToolkit->GetSequencer())
      {
        return ConvertFrameTime(sequencer->GetGlobalTime().Time, sequencer->GetFocusedTickResolution(), sequencer->GetFocusedDisplayRate()).FloorToFrame().Value;
      }
    }
  }

  return -1;
}

2 Likes

It seems like that node has been removed in one of the more recent version of the plugin.

This didn’t work for me, as I couldn’t get the project to find ILevelSequenceEditorToolkit. It seems like it’s an editor-only component, not sure if it would work in a build.

Here’s an alternative solution that takes a Level Sequence Actor:

#pragma once

#include "CoreMinimal.h"
#include "LevelSequenceActor.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "LevelSequenceExt.generated.h"

UCLASS()
class [PROJECT_API] ULevelSequenceExt : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

public:
	UFUNCTION(BlueprintCallable)
	static float GetSequenceActorCurrentTime(const ALevelSequenceActor* SequenceActor);
};
#include "LevelSequenceExt.h"


float ULevelSequenceExt::GetSequenceActorCurrentTime(const ALevelSequenceActor* SequenceActor)
{
  if (!IsValid(SequenceActor)) return -1;

  const auto Player = SequenceActor->SequencePlayer;
  FLevelSequencePlayerSnapshot Snapshot;
  Player->TakeFrameSnapshot(Snapshot);
  return  Snapshot.MasterTime.AsSeconds();
}
1 Like