fBlah
                (fBlah)
              
                
              
                  
                  
              1
              
             
            
              I wanted to automate adding some float keys for my actor in the sequencer. How do I go about this?
void TestBlueprintFunctionLibrary::SetFloatKey(ULevelSequence* LevelSequence, UObject* Object, float Value, float Time)
{
	float Fps = DisplayRate.AsDecimal();
	FFrameNumber Frame;		
	Frame.Value = Fps * Time;
	UMovieSceneTrack* MovieSceneTrack = LevelSequence->MovieScene->FindTrack(UMovieSceneFloatTrack::StaticClass(), Guid);
	TArray <UMovieSceneSection*> MovieSceneSections = MovieSceneTrack->GetAllSections();
	UMovieSceneFloatSection* FloatSection = Cast<UMovieSceneFloatSection>(MovieSceneSections[0]);
	FMovieSceneFloatChannel FloatChannel = FloatSection->GetChannel();
	TArray <FFrameNumber> Frames;
	TArray <FMovieSceneFloatValue> Values;
	Frames.Add(Frame);
	Values.Add(FMovieSceneFloatValue(Value));		
	FloatChannel.AddKeys(Frames, Values);
}
When I try this nothing gets added in.
             
            
              
              
              
            
            
           
          
            
            
              You can check F3DTransformTrackEditor::ImportAnimSequenceTransforms method.
This methods create some root motion keys for the sequence actor
this method can be launched from here:
Hope this helps
             
            
              
              
              
            
            
           
          
            
              
                fBlah
                (fBlah)
              
              
                  
                  
              3
              
             
            
              Solution:
#include "Editor/MovieSceneTools/Public/KeyframeTrackEditor.h"
#include "LevelSequence.h"
#include "MovieScene.h"
#include "MovieSceneFloatSection.h"
#include "MovieSceneFloatTrack.h"
bool UMyBlueprintFunctionLibrary::SetFloatKey(ULevelSequence* LevelSequence, UObject* Object, float Value, float Time, const FName Name)
{
#if WITH_EDITOR
	if (LevelSequence && Object)
	{
		FGuid Guid;
		if (FindBinding(LevelSequence, Object, Guid))
		{
			UMovieSceneFloatTrack* MovieSceneTrack = LevelSequence->MovieScene->FindTrack<UMovieSceneFloatTrack>(Guid, Name);
			if (MovieSceneTrack)
			{
				TArray <UMovieSceneSection*> MovieSceneSections = MovieSceneTrack->GetAllSections();
				if (MovieSceneSections.Num())
				{
					UMovieSceneFloatSection * FloatSection = nullptr;
					FloatSection = CastChecked<UMovieSceneFloatSection>(MovieSceneSections[0]);
					if (FloatSection)
					{
						if (FloatSection->TryModify(true))
						{
							TArrayView <FMovieSceneFloatChannel*> Channels = FloatSection->GetChannelProxy().GetChannels<FMovieSceneFloatChannel>();
							FFrameNumber Frame;
							Frame.Value = Time * 1000;
							Frame++;
							Channels[0]->GetData().UpdateOrAddKey(Frame, FMovieSceneFloatValue(Value));
						}
						return true;
					}
				}
			}
		}
	}
#endif	
	return false;
}
bool UMyBlueprintFunctionLibrary::FindBinding(ULevelSequence *LevelSequence, UObject *Object, FGuid & Guid)
{
	if (LevelSequence && Object)
	{
		for (auto b : LevelSequence->MovieScene->GetBindings())
		{
			FGuid ObjectGuid = b.GetObjectGuid();
			if (ObjectGuid.IsValid())
			{
				TArray<UObject*, TInlineAllocator<1>> Objects;
				LevelSequence->LocateBoundObjects(ObjectGuid, GWorld, Objects);
				if (Objects.Num())
				{
					if (Object == Objects[0])
					{
						Guid = ObjectGuid;
						return true;
					}
				}
			}
		}
	}
	return false;
}
             
            
              
              
              3 Likes