CRIWARE Unity Plugin Manual  Last Updated: 2024-12-05
[CriMana]複数プレーヤによる動的ムービ切替

サンプル内容

概要

cri4u_samples_crimana_adv02_screenshot.png

ムービの「再生途中」に素早く別のムービ再生に切り替えるサンプルプログラムです。
なるべく素早く、なめらかに(=絵が止まる時間を少なく)切り替えを行うために次のような処理をしています。
  • 複数のCriManaMovieControllerコンポーネントを作成し、次に再生したいムービを早めに再生準備状態にしておく。
サンプルを実行するとスクリプト内で二つのCriManaMovieControllerコンポーネントを作成します。
片方は再生を開始し、もう一方は再生準備で待機させます。ボタンを押すと待機中のムービに即座に切り替わります。
注意
切り替え要求が連続で発生するなどして、次のムービの再生準備が間に合わなかった場合には切り替えがもたつく可能性があります

また、ムービの描画対象のマテリアルを複数のゲームオブジェクトに貼り付けることで同時に複数のゲームオブジェクトに対して描画しています。

シーン情報


ミドルウェア CRI Sofdec (CRI Mana)
サンプル Advancedサンプル
格納場所 /cri/unity/samples/UnityProject/Assets/Scenes/crimana/advanced/
シーンファイル Scene_02_DynamicMovieSwitch.unity


プログラムの解説

本シーンでは、全てのムービの再生制御をスクリプト上[Scene_02_DynamicMovieSwitch.cs]で制御しています。
ムービ描画用のマテリアル[Scene_02_DynamicMovieSwitch.mat]を用意し、各CriManaMovieControllerコンポーネントの共通の描画対象としています。

通常に1つのCriManaMovieControllerを使ってムービを切り替える場合との違い

1つのCriManaMovieControllerを使って再生中ムービを切り替える場合、再生停止→次のムービ再生開始といった手順になり、切り替えに時 間もかかりますし、切り替える瞬間には絵の動きが止まってしまいます。なるべく素早く、なめらかに(=絵が止まる時間を少なく)切り替えたい場合は本サンプルのように複数のCriManaMovieControllerの差し替え実装を推奨します。
[注意]
複数のCriManaMovieControllerを使いわける場合はメモリ使用量にご注意ください。
再生停止状態であればワークメモリは消費しませんが、再生準備状態の場合はワークメモリを再生状態と同じ量消費します。

複数のCriManaMovieControllerコンポーネントにおける描画対象の共有方法

複数のプレーヤコンポーネントで描画対象を共有したい場合、movieMaterialプロパティを使用します。
(CriManaMovieMaterial.material)プロパティにマテリアルを指定すると、指定マテリアルを対象に描画を行います。
moviePlayers[i] = this.gameObject.AddComponent<CriManaMovieMaterial>();
moviePlayers[i].player.SetFile(null, moviePathes[i]);
/* Set materials. */
moviePlayers[i].material = movieMaterial;
サンプルではスクリプト上でマテリアルを指定していますが、Unity Editor側で追加したCriManaMovieControllerコンポーネントに対してインスペクタ上でマテリアルの指定を行うことも可能です。

[備考]
マテリアルを指定しないデフォルトの場合は、プレーヤ内部でマテリアルを生成して再生時にゲームオブジェクトのマテリアルを差し替えます。

ムービの描画開始タイミングの制御

ムービを再生停止状態から直接再生開始要求(CriManaMovieMaterial.player.Start)しても、実際に描画が更新されるまでには多少の遅延(数十ミリ秒)が発生します。
再生の頭だしを行う場合は、CriManaMovieMaterial.player.PrepareForRendering 関数を呼び出し、再生状態を Status.ReadyForRendering になるのを待ってから再生を行ってください。
if (i == 0) {
/* Start player #0 only. */
moviePlayers[0].player.Start();
} else {
/* Prepare other players for playback. */
moviePlayers[i].player.PrepareForRendering();
}
本サンプルでは、ボタンが押されたら再生中のムービを停止し、再生準備しておいたプレーヤの再生を開始することで遅延なくムービを切り替えています。
サンプルでは処理を簡単にするためにUpdate関数内で一度停止したプレーヤを再度再生準備させることでプレーヤ交互で即座に再生切り替えできるようにしています。
実際のアプリケーションでは再生準備にかかる時間を見越して適当なタイミングで再生準備を開始してください。
void Update () {
/* Search all the players. */
for (int i=0; i<moviePlayers.Length; i++) {
/* Separete the processing by the player status. */
switch(moviePlayers[i].player.status) {
case CriMana.Player.Status.Stop:
/* Return to the preparation status after the playback is finished. */
moviePlayers[i].player.PrepareForRendering();
break;
default:
break;
}
}
}

複数のゲームオブジェクトに対する同時描画方法

複数のゲームオブジェクトに対して一つのプレーヤコンポーネントで同時に再生を行いたい場合は、ムービ描画用のマテリアルを用意します。
用意したマテリアルを各ゲームオブジェクトに貼り付け、プレーヤコンポーネントのmovieMaterialプロパティに指定して再生をすることで、複数オブジェクトを同時に描画可能です。

プロパティによる描画マテリアルの指定はNGUIなどのテクスチャとして描画する場合にも有効です。

シームレス連結再生との違いについて

このサンプルは「再生途中」に別のムービに素早く切り替えを行うためのサンプルです。
複数のムービを連続再生したい場合はBasicサンプルの「シームレス連結再生」 を参照してください。