Unity で EIF ファイルを使ってシミュレーション実行する
この記事では、Unity で EIF ファイルを使ってシミュレーション実行する方法を説明します。これにより、開発作業の大部分を PC 上で行い、結果を直感的に確認できます。
始める前に
シミュレーションでは EIF ファイルを入力として使うため、まず EIF ファイルを録画しておく必要があります。
- EIF ファイルの録画については EIF ファイルを録画する を参照してください
また、次の内容も理解しておく必要があります。
- EIF ファイルを録画してシミュレーションに使う の基本概念
- AR Session の基本概念、構成、ワークフロー
- session 内の AR 機能コンポーネントにアクセスする ことで録画コンポーネントへのアクセス方法を理解する
session の frame player を有効にする
ARSession.AssembleOptions では、session コンポーネントの組み合わせを構成する複数の方法が用意されています。その 1 つが AssembleOptions.FrameSource を FramePlayer に設定して frame player コンポーネントを有効にし、EIF ファイルを使ったシミュレーション実行を可能にする方法です。
たとえば次のようにします。
Session.AssembleOptions.FrameSource = AssembleOptions.FrameSourceSelection.FramePlayer;
エディタでも、AR Session (EasyAR) を選択し、Inspector ウィンドウの Assemble Options で該当項目を変更できます。

これで session 起動時に frame player コンポーネントが有効になり、他の frame source コンポーネントは選択されなくなります。
frame player で EIF ファイルを再生する効果は次の動画のとおりです。
この動画は、frame player を使って PC 上で密な空間マッピングを実行する様子を示しています。左が
Hierarchyビュー、中央がSceneビュー、右がGameビューです。Gameビューの内容は、現実世界でユーザーがスマートフォンで見る内容と同じです。
EIF ファイルの再生中は、session 内の各 AR 機能コンポーネントが正常に動作し、シーン内の内容やインタラクションロジックも正常に動作するため、開発作業の大部分を PC 上で行い、結果を直感的に確認できます。
ヒント
PC で frame player を使って EIF を再生したときに見える効果は、EIF ファイルを録画したときのスマートフォン上の効果と基本的に同じです。
重要
シーン内で EIF を再生したときの実行結果は、録画に使ったデバイスとそのとき選んだ frame source に依存します。そのため、EIF を録画するときは、対象デバイスと同じか近いデバイスを使うことを推奨します。そうすることで、再生時の効果を対象デバイス上の効果と一致させやすくなります。また、録画時にシーンでモーション追跡機能が有効だったかどうかも重要です。録画時に有効でなかった場合、再生時にも有効にできず、モーション追跡に依存する AR 機能(たとえば密な空間マッピング、Mega など)もデバイス上と同じようには動作しません。
session 起動時に再生する
既定では、session 起動時に frame player が自動的に EIF ファイルの再生を開始します。ただし再生前に EIF ファイルのパスを指定する必要があり、FramePlayer.FilePathType と FramePlayer.FilePath で設定できます。
たとえば次のようにします。
var player = Session.GetComponent<FramePlayer>();
player.FilePathType = WritablePathType.Absolute;
player.FilePath = path;
エディタでも、AR Session (EasyAR) を選択し、Inspector ウィンドウの Frame Player コンポーネントで該当項目を変更できます。

ファイルが指定されていない場合やファイルパスが無効な場合、session 起動時に frame player の起動に失敗し、エラーログが出力されます。
File not found:
手動再生
再生のタイミングを手動で制御したい場合は、session 起動前に FramePlayer.enabled を false に設定できます。
Session.GetComponent<FramePlayer>().enabled = false;
エディタでも、AR Session (EasyAR) を選択し、Inspector ウィンドウの Frame Player コンポーネントで Enabled のチェックを外せます。

再生したいときは Play() を使って再生を開始します。
たとえば次のようにします。
if (Session.Assembly.FrameSource is FramePlayer player)
{
player.Play();
}
Play() を呼ぶたびに、前回の再生は停止され(すでに再生済みなら)、先頭から再生が始まります。
注意
新しいデータを再生しても、シーン内の元のデータは消去されません。AR コンポーネントの状態もリセットされず、カメラデータが前のデータの停止位置から新しいデータの開始位置へ突然飛んだように振る舞います。
これは一部の機能にはあまり影響しませんが、モーション追跡に依存する機能(たとえば密な空間マッピング、Mega など)では機能状態が異常になる可能性があり、実行結果に影響します。そのため、新しいデータを再生する前に session を再起動して、すべての AR コンポーネントの状態をリセットすることを推奨します。
一時停止と再開
FramePlayer.enabled を使って再生の一時停止と再開を制御します。
たとえば FramePlayer.enabled = false にすると再生を一時停止できます。
player.enabled = false;
再生を一時停止すると、すべての AR 機能コンポーネントが停止します。シーン内の内容やインタラクションロジックは、内容次第で停止するとは限りません。再開すると、AR 機能コンポーネントは一時停止した位置から再び動作します。
再生を停止する
Stop() を使って再生を停止します。
player.Stop();
再生を停止すると、すべての AR 機能コンポーネントが停止します。シーン内の内容やインタラクションロジックは、内容次第で停止するとは限りません。
指定時刻へ移動して再生する (seek)
Seek(double) を使って指定時刻へ移動します。
たとえば 5 秒先へ移動するには次のようにします。
player.Seek(player.Time + 5);
注記
移動後の再生開始位置は、EIF ファイルのエンコード方式やキーフレーム間隔により、指定した時刻と完全一致しない場合があります。
すべての EIF ファイルが seek に対応しているわけではありません。IsSeekable プロパティを使って、現在再生中の EIF ファイルが seek に対応しているか確認できます。
注記
H264 形式で録画され、録画停止が正しく行われた EIF ファイルだけが seek に対応しています。EIF ファイルが seek に対応していない場合、Seek(double) を呼び出しても何も起こりません。
再生速度の制御
Speed プロパティを使って再生速度を制御します。
たとえば、元の速度より 0.1 倍速くするには次のようにします。
player.Speed += 0.1;
すべての EIF ファイルが再生速度の制御に対応しているわけではありません。IsSpeedChangeable プロパティを使って、現在再生中の EIF ファイルが再生速度の制御に対応しているか確認できます。
関連トピック
- session 検証ツールを使う を試してみてください。このツールには簡単な EIF プレーヤーが含まれており、EIF ファイルを使ったシミュレーション実行をよりすばやく行えます