ムービーの再生

ムービー再生手順

ムービーデータの再生には、ManaPlayerを使用します。
具体的な処理手順は以下のとおりです。
  1. CriWareApi.h、ManaPlayer.h、Materials/MaterialInstanceDynamic.hをインクルードする。
  2. マテリアルで定義されているものと同様のテクスチャのパラメータ名を定義する。
  3. ManaPlayerを作成する。
  4. マテリアルインスタンスのテクスチャパラメータにUManaTextureを設定する。
  5. ループ再生フラグを立てる。
  6. UManaPlayer::OpenMovieSource関数で再生処理の準備を開始する。
  7. UManaPlayer::GetTexture関数でManaPlayerからテクスチャを取得する。
  8. ManaTextureをマテリアルのインスタンスに設定する。
  9. UManaPlayer::Play関数で再生を開始する。
  10. UManaPlayer::Pause関数で再生を一時停止する。
  11. UManaPlayer::Close 関数で再生処理の終了を開始する。
具体的なコードは以下のとおりです。
/* ムービー再生に必要なヘッダをインクルード */
#include "CppManaPlayer.h"
#include "ManaPlayer.h"
#include "Materials/MaterialInstanceDynamic.h"
namespace
{
/* マテリアルのテクスチャのパラメータ名リスト */
const FName MaterialParameterNames[] =
{
"TextureY",
"TextureU",
"TextureV",
"TextureA",
};
const int32 NumMaterialParameter = 4;
}
void UCppManaPlayer::Setup(UManaMovie* ManaMovie, UMaterial* Material)
{
/* ManaPlayerを作成します。 */
ManaPlayer = NewObject<UManaPlayer>();
if (!ManaPlayer)
{
UE_LOG(LogCppManaPlayer, Error, TEXT("Failed to create a UManaPlayer object."));
return;
}
/* マテリアルインスタンスのテクスチャパラメータにUManaTextureを設定します。 */
MaterialInstance = UMaterialInstanceDynamic::Create(Material, this);
if (!MaterialInstance)
{
UE_LOG(LogCppManaPlayer, Error, TEXT("Failed to create a UMaterialInstanceDynamic object."));
return;
}
/* ループ再生フラグを立てます。 */
ManaPlayer->SetLooping(true);
/* 再生準備を開始します。 */
ManaPlayer->OpenMovieSource(ManaMovie);
/* UManaPlayer が内部で保持している UManaTexture を取得します。 */
UManaTexture* ManaTexture = ManaPlayer->GetTexture();
if (!ManaTexture)
{
UE_LOG(LogCppManaPlayer, Error, TEXT("Failed to get ManaTexture from ManaPlayer."));
return;
}
for (int Index = 0; Index < ManaTexture->GetNumComponentTextures(); Index++)
{
UManaComponentTexture* CompTex = ManaTexture->GetComponentTexture(Index);
int32 PlaneIndex = UManaComponentTexture::GetPlaneIndexFromType(CompTex->ComponentType);
if (PlaneIndex < 0 || PlaneIndex >= NumMaterialParameter)
{
UE_LOG(LogCppManaPlayer, Warning, TEXT("Unknown plane index type."));
continue;
}
/* マテリアルのテクスチャのパラメータに設定します。 */
MaterialInstance->SetTextureParameterValue(MaterialParameterNames[PlaneIndex], CompTex);
}
}
void UCppManaPlayer::PlayMovie() const
{
if (!ManaPlayer)
{
UE_LOG(LogCppManaPlayer, Warning, TEXT("UCppManaPlayer::Setup() function was not called."));
return;
}
if (ManaPlayer->IsPlaying())
{
return;
}
/* 現在の再生位置から再生を再開させます。 */
auto Result = ManaPlayer->Play();
if (!Result)
{
UE_LOG(LogCppManaPlayer, Error, TEXT("Failed to start movie playback."));
}
}
void UCppManaPlayer::PauseMovie() const
{
if (!ManaPlayer)
{
UE_LOG(LogCppManaPlayer, Warning, TEXT("UCppManaPlayer::Setup() function was not called."));
return;
}
if (ManaPlayer->IsPaused())
{
return;
}
/* 再生を一時停止させます。 */
auto Result = ManaPlayer->Pause();
if (!Result)
{
UE_LOG(LogCppManaPlayer, Error, TEXT("Failed to pause movie playback."));
}
}
void UCppManaPlayer::CloseMovie()
{
if (ManaPlayer)
{
/* 再生処理を終了させます。 */
ManaPlayer->Close();
}
}
備考:
UManaPlayerをヘッダでUPROPERTYとして宣言することで、エディタやブループリントからムービープレイヤを指定する形をとることも可能です。
同様にUFUNCTIONとして関数を宣言することでブループリントから呼び出すことが可能です。
class SAMPLE_API UCppManaPlayer : public UObject
{
UFUNCTION(BlueprintCallable, Category = "Sample")
void Setup(UManaMovie* ManaMovie, UMaterial* Material);
UFUNCTION(BlueprintCallable, Category = "Sample")
void PlayMovie() const;
UFUNCTION(BlueprintCallable, Category = "Sample")
void PauseMovie() const;
UFUNCTION(BlueprintCallable, Category = "Sample")
void CloseMovie();
UPROPERTY(EditAnywhere)
UManaPlayer* ManaPlayer{ nullptr };
};