first commit
This commit is contained in:
commit
0f9619fef0
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"FileVersion": 3,
|
||||
"Version": 1,
|
||||
"VersionName": "0.2",
|
||||
"FriendlyName": "AdvancedMovieTracks",
|
||||
"Description": "",
|
||||
"Category": "Other",
|
||||
"CreatedBy": "",
|
||||
"CreatedByURL": "",
|
||||
"DocsURL": "",
|
||||
"MarketplaceURL": "",
|
||||
"SupportURL": "",
|
||||
"CanContainContent": true,
|
||||
"IsBetaVersion": false,
|
||||
"IsExperimentalVersion": false,
|
||||
"Installed": false,
|
||||
"Modules": [
|
||||
{
|
||||
"Name": "AdvancedMovieTracks",
|
||||
"Type": "Runtime",
|
||||
"LoadingPhase": "Default"
|
||||
},
|
||||
{
|
||||
"Name": "AdvancedMovieTracksEditor",
|
||||
"Type": "Editor",
|
||||
"LoadingPhase": "Default"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
[FilterPlugin]
|
||||
; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and
|
||||
; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively.
|
||||
;
|
||||
; Examples:
|
||||
; /README.txt
|
||||
; /Extras/...
|
||||
; /Binaries/ThirdParty/*.dll
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
|
|
@ -0,0 +1,53 @@
|
|||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
using UnrealBuildTool;
|
||||
|
||||
public class AdvancedMovieTracks : ModuleRules
|
||||
{
|
||||
public AdvancedMovieTracks(ReadOnlyTargetRules Target) : base(Target)
|
||||
{
|
||||
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
|
||||
|
||||
PublicIncludePaths.AddRange(
|
||||
new string[] {
|
||||
// ... add public include paths required here ...
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
PrivateIncludePaths.AddRange(
|
||||
new string[] {
|
||||
// ... add other private include paths required here ...
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
PublicDependencyModuleNames.AddRange(
|
||||
new string[]
|
||||
{
|
||||
"Core","MovieSceneTracks","MovieScene","CinematicCamera"
|
||||
// ... add other public dependencies that you statically link with here ...
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
PrivateDependencyModuleNames.AddRange(
|
||||
new string[]
|
||||
{
|
||||
"CoreUObject",
|
||||
"Engine",
|
||||
"Slate",
|
||||
"SlateCore", "LevelSequence",
|
||||
// ... add private dependencies that you statically link with here ...
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
DynamicallyLoadedModuleNames.AddRange(
|
||||
new string[]
|
||||
{
|
||||
// ... add any modules that your module loads dynamically here ...
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "CameraCutCameraCompHook.h"
|
||||
|
||||
#include "LevelSequence.h"
|
||||
#include "LevelSequencePlayer.h"
|
||||
#include "Camera/CameraComponent.h"
|
||||
#include "Sections/MovieSceneCameraCutSection.h"
|
||||
#include "Tracks/MovieSceneCameraCutTrack.h"
|
||||
|
||||
|
||||
// Sets default values for this component's properties
|
||||
UCameraCutCameraCompHook::UCameraCutCameraCompHook()
|
||||
{
|
||||
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
|
||||
// off to improve performance if you don't need them.
|
||||
PrimaryComponentTick.bCanEverTick = true;
|
||||
|
||||
// ...
|
||||
}
|
||||
|
||||
|
||||
// Called when the game starts
|
||||
void UCameraCutCameraCompHook::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
// ...
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Called every frame
|
||||
void UCameraCutCameraCompHook::TickComponent(float DeltaTime, ELevelTick TickType,
|
||||
FActorComponentTickFunction* ThisTickFunction)
|
||||
{
|
||||
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
|
||||
|
||||
if (!MyLevelSequencePlayer) return;
|
||||
|
||||
// 获取 CameraCut 轨道
|
||||
ULevelSequence* LevelSequence = Cast<ULevelSequence>(MyLevelSequencePlayer->GetSequence());
|
||||
if (!LevelSequence) return;
|
||||
UMovieSceneCameraCutTrack* CameraCutTrack = Cast<UMovieSceneCameraCutTrack>(LevelSequence->GetMovieScene()->GetCameraCutTrack());
|
||||
if (!CameraCutTrack) return;
|
||||
|
||||
|
||||
//FQualifiedFrameTime CurrentTime = MyLevelSequencePlayer->GetCurrentTime(); // 获取当前时间
|
||||
//auto CurrentFrame = CurrentTime.Time.FrameNumber*800;//不够精确
|
||||
|
||||
// 获取当前播放帧
|
||||
FFrameRate TickResolution = LevelSequence->GetMovieScene() ->GetTickResolution();
|
||||
FQualifiedFrameTime QualifiedTime = MyLevelSequencePlayer->GetCurrentTime();
|
||||
FFrameTime TimeInTick = ConvertFrameTime(QualifiedTime.Time, QualifiedTime.Rate, TickResolution);
|
||||
FFrameNumber CurrentTickFrame = TimeInTick.GetFrame();
|
||||
// 查找当前激活的 CameraCut 段
|
||||
UCameraComponent* ActiveCamComp = nullptr;
|
||||
for (UMovieSceneSection* Section : CameraCutTrack->GetAllSections())
|
||||
{
|
||||
if (UMovieSceneCameraCutSection* CamSection = Cast<UMovieSceneCameraCutSection>(Section))
|
||||
{
|
||||
auto StartFrame = CamSection->GetInclusiveStartFrame();
|
||||
auto EndFrame = CamSection->GetExclusiveEndFrame();
|
||||
if (CurrentTickFrame >= StartFrame && CurrentTickFrame < EndFrame)
|
||||
{
|
||||
// 获取绑定的对象
|
||||
TArray<UObject*> BoundObjs = MyLevelSequencePlayer->GetBoundObjects(CamSection->GetCameraBindingID());
|
||||
for (UObject* Obj : BoundObjs)
|
||||
{
|
||||
if (AActor* Actor = Cast<AActor>(Obj))
|
||||
{
|
||||
ActiveCamComp = Actor->FindComponentByClass<UCameraComponent>();
|
||||
}
|
||||
else if (UCameraComponent* CamComp = Cast<UCameraComponent>(Obj))
|
||||
{
|
||||
ActiveCamComp = CamComp;
|
||||
}
|
||||
if (ActiveCamComp) break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
FoundCamera = nullptr;
|
||||
// 如果找到摄像机组件,就可以获取其位置
|
||||
if (ActiveCamComp)
|
||||
{
|
||||
FoundCamera = ActiveCamComp;
|
||||
FVector CamLocation = ActiveCamComp->GetComponentLocation();
|
||||
FString CamName = ActiveCamComp->GetOwner()-> GetName();
|
||||
if(bNeedDebug)
|
||||
{
|
||||
UE_LOG(LogTemp, Log, TEXT("Current Camera position: %s,Name: %s"), *CamLocation.ToString(), *CamName);
|
||||
GEngine->AddOnScreenDebugMessage(-1, 2.f, FColor::Orange, FString::Printf(TEXT("Current Camera position: %s,Name: %s"), *CamLocation.ToString(), *CamName));
|
||||
DrawDebugSphere(GetOwner()->GetWorld(), CamLocation, 36.f, 12, FColor::Cyan, false, 0.2f, 0, 1.f);
|
||||
}
|
||||
// 可以在这里对相机位置进行处理
|
||||
}
|
||||
}
|
||||
|
||||
bool UCameraCutCameraCompHook::FoundCameraComp(UCameraComponent*& FoundCameraComp)
|
||||
{
|
||||
FoundCameraComp = FoundCamera;
|
||||
return IsValid(FoundCamera);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Components/ActorComponent.h"
|
||||
#include "CameraCutCameraCompHook.generated.h"
|
||||
|
||||
|
||||
class UCameraComponent;
|
||||
class ULevelSequencePlayer;
|
||||
|
||||
/**
|
||||
* This Component Must Tick while you're using FoundCameraComp()
|
||||
*/
|
||||
UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
|
||||
class ADVANCEDMOVIETRACKS_API UCameraCutCameraCompHook : public UActorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
// Sets default values for this component's properties
|
||||
UCameraCutCameraCompHook();
|
||||
|
||||
protected:
|
||||
// Called when the game starts
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite,VisibleAnywhere,meta=(AllowPrivateAccess=true))
|
||||
ULevelSequencePlayer* MyLevelSequencePlayer;
|
||||
UPROPERTY()
|
||||
UCameraComponent* FoundCamera;
|
||||
public:
|
||||
// Called every frame
|
||||
virtual void TickComponent(float DeltaTime, ELevelTick TickType,
|
||||
FActorComponentTickFunction* ThisTickFunction) override;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, meta = (AllowPrivateAccess = true))
|
||||
bool bNeedDebug = false;
|
||||
|
||||
UFUNCTION(BlueprintPure)
|
||||
bool FoundCameraComp(UCameraComponent*& FoundCameraComp);
|
||||
|
||||
};
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "CineCustomedCameraActor.h"
|
||||
//#include "CineCameraActor.h"
|
||||
|
||||
|
||||
|
||||
ACineCustomedCameraActor::ACineCustomedCameraActor(const FObjectInitializer& ObjectInitializer)
|
||||
:Super(ObjectInitializer)
|
||||
{
|
||||
PrimaryActorTick.bCanEverTick = true;
|
||||
}
|
||||
|
||||
// Called when the game starts or when spawned
|
||||
void ACineCustomedCameraActor::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
}
|
||||
|
||||
void ACineCustomedCameraActor::NotifyCameraCut()
|
||||
{
|
||||
FString a(FString::Printf(TEXT("CameraCutIn:%s"),*GetName()));
|
||||
if (GEngine)
|
||||
{
|
||||
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Cyan, a);
|
||||
}
|
||||
UE_LOG(LogTemp, Warning, TEXT("%s"),*a);
|
||||
|
||||
Super::NotifyCameraCut();
|
||||
}
|
||||
|
||||
// Called every frame
|
||||
void ACineCustomedCameraActor::Tick(float DeltaTime)
|
||||
{
|
||||
Super::Tick(DeltaTime);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "CineCameraActor.h"
|
||||
|
||||
#include "CineCustomedCameraActor.generated.h"
|
||||
|
||||
|
||||
|
||||
UCLASS()
|
||||
class ADVANCEDMOVIETRACKS_API ACineCustomedCameraActor : public ACineCameraActor
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
// Sets default values for this actor's properties
|
||||
|
||||
ACineCustomedCameraActor(const FObjectInitializer& ObjectInitializer);
|
||||
protected:
|
||||
// Called when the game starts or when spawned
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
virtual void NotifyCameraCut() override;
|
||||
public:
|
||||
// Called every frame
|
||||
virtual void Tick(float DeltaTime) override;
|
||||
|
||||
|
||||
};
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "CustomAudioTrack.h"
|
||||
|
||||
|
||||
|
||||
|
||||
void UCustomAudioTrack::Serialize(FArchive& Ar)
|
||||
{
|
||||
Super::Serialize(Ar);
|
||||
}
|
||||
|
||||
bool UCustomAudioTrack::Rename(const TCHAR* NewName, UObject* NewOuter, ERenameFlags Flags)
|
||||
{
|
||||
RuntimeName = NewName;
|
||||
return Super::Rename(NewName, NewOuter, Flags);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool UCustomAudioTrack::SupportsType(TSubclassOf<UMovieSceneSection> SectionClass) const
|
||||
{
|
||||
return Super::SupportsType(SectionClass);
|
||||
}
|
||||
|
||||
void UCustomAudioTrack::RemoveAllAnimationData()
|
||||
{
|
||||
Super::RemoveAllAnimationData();
|
||||
}
|
||||
|
||||
bool UCustomAudioTrack::HasSection(const UMovieSceneSection& Section) const
|
||||
{
|
||||
return Super::HasSection(Section);
|
||||
}
|
||||
|
||||
void UCustomAudioTrack::AddSection(UMovieSceneSection& Section)
|
||||
{
|
||||
Super::AddSection(Section);
|
||||
}
|
||||
|
||||
void UCustomAudioTrack::RemoveSection(UMovieSceneSection& Section)
|
||||
{
|
||||
Super::RemoveSection(Section);
|
||||
}
|
||||
|
||||
void UCustomAudioTrack::RemoveSectionAt(int32 SectionIndex)
|
||||
{
|
||||
Super::RemoveSectionAt(SectionIndex);
|
||||
}
|
||||
|
||||
bool UCustomAudioTrack::IsEmpty() const
|
||||
{
|
||||
return Super::IsEmpty();
|
||||
}
|
||||
|
||||
const TArray<UMovieSceneSection*>& UCustomAudioTrack::GetAllSections() const
|
||||
{
|
||||
return Super::GetAllSections();
|
||||
}
|
||||
|
||||
bool UCustomAudioTrack::SupportsMultipleRows() const
|
||||
{
|
||||
return Super::SupportsMultipleRows();
|
||||
}
|
||||
|
||||
UMovieSceneSection* UCustomAudioTrack::CreateNewSection()
|
||||
{
|
||||
return Super::CreateNewSection();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
//"CustomAudioTrack.h"
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Evaluation/MovieSceneEvalTemplate.h"
|
||||
|
||||
#include "Tracks/MovieSceneAudioTrack.h"
|
||||
|
||||
#include "CustomAudioTrack.generated.h"
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
class ADVANCEDMOVIETRACKS_API UCustomAudioTrack : public UMovieSceneAudioTrack
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
// ... 之前的代码 ...
|
||||
|
||||
// 重写显示名称
|
||||
#if WITH_EDITOR
|
||||
virtual FText GetDisplayName() const override
|
||||
{
|
||||
if (!RuntimeName.IsNone())
|
||||
{
|
||||
return FText::FromName(RuntimeName);
|
||||
}
|
||||
return Super::GetDisplayName();
|
||||
}
|
||||
#endif
|
||||
#if WITH_EDITORONLY_DATA
|
||||
virtual FText GetDefaultDisplayName() const override { return FText::FromString(TEXT("CustomAudioTrack")); };
|
||||
virtual void SetDisplayName(const FText& NewDisplayName)override {
|
||||
RuntimeName = *NewDisplayName.ToString();
|
||||
Super::SetDisplayName(NewDisplayName);
|
||||
}
|
||||
#endif
|
||||
// UMovieSceneTrack interface
|
||||
virtual bool SupportsType(TSubclassOf<UMovieSceneSection> SectionClass) const override;
|
||||
virtual void RemoveAllAnimationData() override;
|
||||
virtual bool HasSection(const UMovieSceneSection& Section) const override;
|
||||
virtual void AddSection(UMovieSceneSection& Section) override;
|
||||
virtual void RemoveSection(UMovieSceneSection& Section) override;
|
||||
virtual void RemoveSectionAt(int32 SectionIndex) override;
|
||||
virtual bool IsEmpty() const override;
|
||||
virtual const TArray<UMovieSceneSection*>& GetAllSections() const override;
|
||||
virtual bool SupportsMultipleRows() const override;
|
||||
virtual UMovieSceneSection* CreateNewSection() override;
|
||||
// 支持序列化
|
||||
virtual void Serialize(FArchive& Ar) override;
|
||||
|
||||
virtual bool Rename(const TCHAR* NewName = nullptr, UObject* NewOuter = nullptr, ERenameFlags Flags = REN_None)override;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Identification", meta = (DisplayName = "Track Name"))
|
||||
FName RuntimeName;
|
||||
|
||||
/*UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Identification", meta = (DisplayName = "Track Name"))
|
||||
FName RuntimeNameA;*/
|
||||
};
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
#include "AdvancedMovieTracks.h"
|
||||
|
||||
|
||||
|
||||
#define LOCTEXT_NAMESPACE "FAdvancedMovieTracksModule"
|
||||
|
||||
void FAdvancedMovieTracksModule::StartupModule()
|
||||
{
|
||||
// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
|
||||
//ISequencerModule& SequencerModule = FModuleManager::Get().LoadModuleChecked<ISequencerModule>("Sequencer");
|
||||
|
||||
//// ×¢²á×Ô¶¨Òå¹ìµÀ±à¼Æ÷
|
||||
//TrackEditorBindingHandle = SequencerModule.RegisterTrackEditor(
|
||||
// FOnCreateTrackEditor::CreateStatic(&FCustomAudioTrackEditor::CreateTrackEditor)
|
||||
//);
|
||||
|
||||
}
|
||||
|
||||
void FAdvancedMovieTracksModule::ShutdownModule()
|
||||
{
|
||||
// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
|
||||
// we call this function before unloading the module.
|
||||
|
||||
/*ISequencerModule* SequencerModule = FModuleManager::Get().GetModulePtr<ISequencerModule>("Sequencer");
|
||||
if (SequencerModule)
|
||||
{
|
||||
SequencerModule->UnRegisterTrackEditor(TrackEditorBindingHandle);
|
||||
}*/
|
||||
}
|
||||
|
||||
#undef LOCTEXT_NAMESPACE
|
||||
|
||||
IMPLEMENT_MODULE(FAdvancedMovieTracksModule, AdvancedMovieTracks)
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Modules/ModuleManager.h"
|
||||
|
||||
class FAdvancedMovieTracksModule : public IModuleInterface
|
||||
{
|
||||
public:
|
||||
|
||||
/** IModuleInterface implementation */
|
||||
virtual void StartupModule() override;
|
||||
virtual void ShutdownModule() override;
|
||||
private:
|
||||
FDelegateHandle TrackEditorBindingHandle;
|
||||
};
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
using UnrealBuildTool;
|
||||
|
||||
public class AdvancedMovieTracksEditor : ModuleRules
|
||||
{
|
||||
public AdvancedMovieTracksEditor(ReadOnlyTargetRules Target) : base(Target)
|
||||
{
|
||||
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
|
||||
|
||||
PublicIncludePaths.AddRange(
|
||||
new string[] {
|
||||
// ... add public include paths required here ...
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
PrivateIncludePaths.AddRange(
|
||||
new string[] {
|
||||
// ... add other private include paths required here ...
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
PublicDependencyModuleNames.AddRange(
|
||||
new string[]
|
||||
{
|
||||
"Core","MovieSceneTracks","MovieScene","AdvancedMovieTracks"
|
||||
// ... add other public dependencies that you statically link with here ...
|
||||
}
|
||||
);
|
||||
if (Target.bBuildWithEditorOnlyData && Target.bBuildEditor)
|
||||
{
|
||||
PublicDependencyModuleNames.AddRange(new string[]
|
||||
{
|
||||
"UnrealEd"
|
||||
});
|
||||
PrivateDependencyModuleNames.AddRange(new string[]
|
||||
{
|
||||
|
||||
"UnrealEd", "Sequencer"
|
||||
});
|
||||
}
|
||||
|
||||
PrivateDependencyModuleNames.AddRange(
|
||||
new string[]
|
||||
{
|
||||
"CoreUObject",
|
||||
"Engine",
|
||||
"Slate",
|
||||
"SlateCore",
|
||||
// ... add private dependencies that you statically link with here ...
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
DynamicallyLoadedModuleNames.AddRange(
|
||||
new string[]
|
||||
{
|
||||
// ... add any modules that your module loads dynamically here ...
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#include "CustomAudioTrackEditor.h"
|
||||
#include "AdvancedMovieTracks/CustomAudioTrack.h"
|
||||
#include "Framework/MultiBox/MultiBoxBuilder.h"
|
||||
|
||||
#if WITH_EDITOR
|
||||
#include "Sections/MovieSceneAudioSection.h"
|
||||
|
||||
|
||||
#define LOCTEXT_NAMESPACE "FAudioTrackEditor"
|
||||
|
||||
FCustomAudioTrackEditor::FCustomAudioTrackEditor(TSharedRef<ISequencer> InSequencer)
|
||||
: FMovieSceneTrackEditor(InSequencer)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
//UMovieSceneTrack* FCustomAudioTrackEditor::AddTrack(UMovieScene* FocusedMovieScene, const FGuid& ObjectHandle, TSubclassOf<UMovieSceneTrack> TrackClass, FName UniqueTypeName) const
|
||||
//{
|
||||
// //// 确保是自定义轨道类型
|
||||
// //if (TrackClass == UCustomAudioTrack::StaticClass())
|
||||
// //{
|
||||
// // // 创建轨道
|
||||
// // UCustomAudioTrack* NewTrack = FocusedMovieScene->AddMasterTrack<UCustomAudioTrack>();
|
||||
// // NewTrack->SetDisplayName(FText::FromString("Custom Audio Track"));
|
||||
// // return NewTrack;
|
||||
// //}
|
||||
// //return nullptr;
|
||||
// return FocusedMovieScene->AddTrack(TrackClass, ObjectHandle);
|
||||
//}
|
||||
|
||||
void FCustomAudioTrackEditor::BuildAddTrackMenu(FMenuBuilder& MenuBuilder)
|
||||
{
|
||||
MenuBuilder.AddMenuEntry(
|
||||
FText::FromString("Custom Audio Track"),
|
||||
FText::FromString("Adds a custom audio track"),
|
||||
FSlateIcon(),
|
||||
FUIAction(FExecuteAction::CreateRaw(this, &FCustomAudioTrackEditor::HandleAddAudioTrackMenuEntryExecute))
|
||||
);
|
||||
}
|
||||
void FCustomAudioTrackEditor::HandleAddAudioTrackMenuEntryExecute()
|
||||
{
|
||||
UMovieScene* FocusedMovieScene = GetFocusedMovieScene();
|
||||
|
||||
if (FocusedMovieScene == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (FocusedMovieScene->IsReadOnly())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const FScopedTransaction Transaction(NSLOCTEXT("Sequencer", "AddAudioTrack_Transaction", "Add My Audio Track"));
|
||||
FocusedMovieScene->Modify();
|
||||
|
||||
auto NewTrack = FocusedMovieScene->AddTrack<UCustomAudioTrack>();
|
||||
ensure(NewTrack);
|
||||
|
||||
NewTrack->SetDisplayName(FText::FromString(TEXT("My Audio")));
|
||||
|
||||
if (GetSequencer().IsValid())
|
||||
{
|
||||
GetSequencer()->NotifyMovieSceneDataChanged(EMovieSceneDataChangeType::TrackValueChanged);
|
||||
// 或者 NotifyMovieSceneDataChanged(EMovieSceneDataChangeType::MovieSceneStructureItemsChanged) 视场景而定
|
||||
|
||||
GetSequencer()->OnAddTrack(NewTrack, FGuid());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool FCustomAudioTrackEditor::SupportsType(TSubclassOf<UMovieSceneTrack> TrackClass) const
|
||||
{
|
||||
return TrackClass == UCustomAudioTrack::StaticClass();
|
||||
}
|
||||
|
||||
TSharedRef<ISequencerTrackEditor> FCustomAudioTrackEditor::CreateTrackEditor(TSharedRef<ISequencer> InSequencer)
|
||||
{
|
||||
return MakeShared<FCustomAudioTrackEditor>(InSequencer);
|
||||
}
|
||||
//
|
||||
//void FCustomAudioTrackEditor::HandleAddTrack()
|
||||
//{
|
||||
// UMovieScene* FocusedMovieScene = GetFocusedMovieScene();
|
||||
// if (FocusedMovieScene)
|
||||
// {
|
||||
// // 添加轨道
|
||||
// UCustomAudioTrack* NewTrack = FocusedMovieScene->AddMasterTrack<UCustomAudioTrack>();
|
||||
// if (NewTrack)
|
||||
// {
|
||||
// // 添加默认音频片段
|
||||
// NewTrack->AddNewSound(nullptr, 0.0f);
|
||||
//
|
||||
// // 通知Sequencer刷新
|
||||
// GetSequencer()->NotifyMovieSceneDataChanged(EMovieSceneDataChangeType::MovieSceneStructureItemAdded);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
#undef LOCTEXT_NAMESPACE
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
// "CustomAudioTrackEditor.h"
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
|
||||
#if WITH_EDITOR
|
||||
#include "MovieSceneTrackEditor.h"
|
||||
class FCustomAudioTrackEditor : public FMovieSceneTrackEditor
|
||||
{
|
||||
public:
|
||||
FCustomAudioTrackEditor(TSharedRef<ISequencer> InSequencer);
|
||||
|
||||
// 创建轨道实例
|
||||
//virtual UMovieSceneTrack* AddTrack(UMovieScene* FocusedMovieScene, const FGuid& ObjectHandle, TSubclassOf<UMovieSceneTrack> TrackClass, FName UniqueTypeName) const override;
|
||||
|
||||
|
||||
// 在菜单中显示
|
||||
virtual void BuildAddTrackMenu(FMenuBuilder& MenuBuilder) override;
|
||||
|
||||
// 检查是否支持添加轨道
|
||||
virtual bool SupportsType(TSubclassOf<UMovieSceneTrack> TrackClass) const override;
|
||||
|
||||
// 工厂创建函数
|
||||
static TSharedRef<ISequencerTrackEditor> CreateTrackEditor(TSharedRef<ISequencer> InSequencer);
|
||||
private:
|
||||
virtual void HandleAddAudioTrackMenuEntryExecute();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
#include "AdvancedMovieTracksEditor.h"
|
||||
|
||||
#if WITH_EDITOR
|
||||
|
||||
#include "AdvancedMovieTracks.h"
|
||||
#include "ISequencerModule.h"
|
||||
#include "AdvancedMovieTracksEditor/CustomAudioTrackEditor.h"
|
||||
|
||||
#define LOCTEXT_NAMESPACE "FAdvancedMovieTracksEditorModule"
|
||||
|
||||
void FAdvancedMovieTracksEditorModule::StartupModule()
|
||||
{
|
||||
// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
|
||||
ISequencerModule& SequencerModule = FModuleManager::Get().LoadModuleChecked<ISequencerModule>("Sequencer");
|
||||
|
||||
// ×¢²á×Ô¶¨Òå¹ìµÀ±à¼Æ÷
|
||||
TrackEditorBindingHandle = SequencerModule.RegisterTrackEditor(
|
||||
FOnCreateTrackEditor::CreateStatic(&FCustomAudioTrackEditor::CreateTrackEditor)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
void FAdvancedMovieTracksEditorModule::ShutdownModule()
|
||||
{
|
||||
// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
|
||||
// we call this function before unloading the module.
|
||||
|
||||
ISequencerModule* SequencerModule = FModuleManager::Get().GetModulePtr<ISequencerModule>("Sequencer");
|
||||
if (SequencerModule)
|
||||
{
|
||||
SequencerModule->UnRegisterTrackEditor(TrackEditorBindingHandle);
|
||||
}
|
||||
}
|
||||
|
||||
#undef LOCTEXT_NAMESPACE
|
||||
|
||||
IMPLEMENT_MODULE(FAdvancedMovieTracksEditorModule, AdvancedMovieTracksEditor)
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Modules/ModuleManager.h"
|
||||
|
||||
class FAdvancedMovieTracksEditorModule : public IModuleInterface
|
||||
{
|
||||
public:
|
||||
|
||||
/** IModuleInterface implementation */
|
||||
virtual void StartupModule() override;
|
||||
virtual void ShutdownModule() override;
|
||||
private:
|
||||
FDelegateHandle TrackEditorBindingHandle;
|
||||
};
|
||||
Loading…
Reference in New Issue