CriWare Unreal Engine
Plug-ins for CriWare solutions.
読み取り中…
検索中…
一致する文字列を見つけられません
動画の再生方法

Sofdec の機能を使った動画再生を行うための実装例を示します。
こちらで記載している実装例に対して、一部抜粋やカスタマイズしてのご使用などで開発にお役立てください。

モジュールの追加

Sofdec のオブジェクトを C++ で使用するためには CriWareMana モジュールをプロジェクトの .Build.cs ファイルに追記する必要があります。

using UnrealBuildTool;
public class SampleProject : ModuleRules
{
public SampleProject(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "CriWareMana" });
PrivateDependencyModuleNames.AddRange(new string[] { });
}
}

C++ サンプルコード

サブシステムクラスに対しての実装例を示します。
他クラスに対しての実装でも同様の記述で実装が行えます。
※ 適切な仮想関数に置き換える必要がある点にご注意ください。

再生には下記のオブジェクトが必要となります。

  • UManaPlayer
  • UManaTexture
  • UManaSoundComponent
  • UManaMovie

.h ファイルには必要な定義を記載します。

#pragma once
#include "CoreMinimal.h"
#include "Subsystems/EngineSubsystem.h"
#include "SampleManaSubSystem.generated.h"
class UMaterial;
class UMaterialInstanceDynamic;
class UManaPlayer;
class UManaTexture;
class UManaSoundComponent;
class UManaMovie;
UCLASS(BlueprintType, Category = "Sample")
class SAMPLE_API USampleManaSubSystem : public UEngineSubsystem
{
GENERATED_BODY()
public:
/** Implement this for initialization of instances of the system */
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
/** Implement this for deinitialization of instances of the system */
virtual void Deinitialize() override;
virtual bool ShouldCreateSubsystem(UObject* Outer) const override
{
return true;
}
public:
/** Preparing for video playback. */
UFUNCTION(BlueprintCallable, Category = "Sample")
bool OpenMovieSource(UManaMovie* ManaMovie, UMaterial* Material = nullptr);
/** Start playing a video. */
UFUNCTION(BlueprintCallable, Category = "Sample")
bool PlayMovie();
/** Pause video playback. */
UFUNCTION(BlueprintCallable, Category = "Sample")
bool PauseMovie();
public:
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Sample")
UManaPlayer* GetManaPlayer() const;
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Sample")
UManaTexture* GetManaTexture() const;
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Sample")
UManaSoundComponent* GetManaSoundComponent() const;
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Sample")
UMaterialInstanceDynamic* GetMaterialInstanceDynamic() const;
private:
UFUNCTION()
void OnMovieOpend(FString OpenedUrl);
private:
TObjectPtr<UManaPlayer> ManaPlayer { nullptr };
TObjectPtr<UManaTexture> ManaTexture { nullptr };
TObjectPtr<UManaSoundComponent> ManaSoundComponent { nullptr };
TObjectPtr<UMaterialInstanceDynamic> MaterialInstanceDynamic { nullptr };
};


.cpp ファイルには実際の処理を記載します。
再生する UManaMovie を外部から指定できる仕組みにしています。
もちろん C++ から読み込み処理を追加していただいても問題ありません。

#include "SampleManaSubSystem.h"
#include "Mana/ManaMovie.h"
#include "Mana/ManaPlayer.h"
#include "Mana/ManaTexture.h"
#include "Mana/ManaSoundComponent.h"
void USampleManaSubSystem::Initialize(FSubsystemCollectionBase& Collection)
{
if ( ! IsValid(ManaPlayer))
{
ManaPlayer = NewObject<UManaPlayer>(this, NAME_None, RF_Transient);
ManaPlayer->AddToRoot();
ManaPlayer->PlayOnOpen = true;
ManaPlayer->OnMovieOpened.AddDynamic(this, &USampleManaSubSystem::OnMovieOpend);
}
if ( ! IsValid(ManaTexture))
{
ManaTexture = NewObject<UManaTexture>(this, NAME_None, RF_Transient);
ManaTexture->AddToRoot();
ManaTexture->bRenderToTexture = true;
ManaTexture->SetManaPlayer(GetManaPlayer());
}
if ( ! IsValid(ManaSoundComponent))
{
ManaSoundComponent = NewObject<UManaSoundComponent>(this, NAME_None, RF_Transient);
ManaSoundComponent->AddToRoot();
auto World = GetWorld();
if ( ! IsValid(World))
{
World = GWorld;
}
ManaSoundComponent->RegisterComponentWithWorld(World);
}
}
void USampleManaSubSystem::Deinitialize()
{
if (IsValid(MaterialInstanceDynamic))
{
MaterialInstanceDynamic->RemoveFromRoot();
MaterialInstanceDynamic = nullptr;
}
if (IsValid(ManaSoundComponent))
{
ManaSoundComponent->SetManaPlayer(nullptr);
ManaSoundComponent->UnregisterComponent();
ManaSoundComponent->RemoveFromRoot();
ManaSoundComponent = nullptr;
}
if (IsValid(ManaTexture))
{
ManaTexture->SetManaPlayer(nullptr);
ManaTexture->RemoveFromRoot();
ManaTexture = nullptr;
}
if (IsValid(ManaPlayer))
{
ManaPlayer->Close();
ManaPlayer->RemoveFromRoot();
ManaPlayer = nullptr;
}
}
bool USampleManaSubSystem::OpenMovieSource(UManaMovie* ManaMovie, UMaterial* Material)
{
if ( ! IsValid(ManaMovie))
{
return false;
}
if (IsValid(MaterialInstanceDynamic))
{
MaterialInstanceDynamic->RemoveFromRoot();
MaterialInstanceDynamic = nullptr;
}
if ( ! IsValid(ManaPlayer))
{
return false;
}
if (ManaMovie->GetNumAudioTracks() > 0)
{
ManaSoundComponent->SetManaPlayer(GetManaPlayer());
}
else
{
ManaSoundComponent->SetManaPlayer(nullptr);
}
const auto bSuccess = ManaPlayer->OpenSource(ManaMovie);
if (bSuccess && IsValid(Material))
{
MaterialInstanceDynamic = UMaterialInstanceDynamic::Create(Material, this);
MaterialInstanceDynamic->AddToRoot();
}
return bSuccess;
}
bool USampleManaSubSystem::PlayMovie()
{
if ( ! IsValid(ManaPlayer))
{
return false;
}
if (ManaPlayer->IsClosed())
{
return false;
}
return ManaPlayer->Play();
}
bool USampleManaSubSystem::PauseMovie()
{
if ( ! IsValid(ManaPlayer))
{
return false;
}
if ( ! ManaPlayer->IsPlaying())
{
return false;
}
return ManaPlayer->Pause();
}
UManaPlayer* USampleManaSubSystem::GetManaPlayer() const
{
if (IsValid(ManaPlayer))
{
return ManaPlayer;
}
return nullptr;
}
UManaTexture* USampleManaSubSystem::GetManaTexture() const
{
if (IsValid(ManaTexture))
{
return ManaTexture;
}
return nullptr;
}
UManaSoundComponent* USampleManaSubSystem::GetManaSoundComponent() const
{
if (IsValid(ManaSoundComponent))
{
return ManaSoundComponent;
}
return nullptr;
}
UMaterialInstanceDynamic* USampleManaSubSystem::GetMaterialInstanceDynamic() const
{
if (IsValid(MaterialInstanceDynamic))
{
return MaterialInstanceDynamic;
}
return nullptr;
}
void USampleManaSubSystem::OnMovieOpend(FString OpenedUrl)
{
if (IsValid(ManaTexture))
{
ManaTexture->UpdateResource();
}
if (IsValid(MaterialInstanceDynamic))
{
MaterialInstanceDynamic->SetTextureParameterValue("ManaTexture", GetManaTexture());
}
}