在 Unity 中使用 EIF 文件模擬執行
本文介紹了如何在 Unity 中使用 EIF 文件進行模擬執行,從而可以在電腦上進行大部分的開發工作,並直觀地看到效果。
Before you begin
模擬執行使用 EIF 文件作為輸入,因此在開始之前需要先錄製 EIF 文件:
- 參考 錄製 EIF 文件 錄製 EIF 文件
另外還需要了解:
- 了解 錄製 EIF 文件並用於模擬執行 的基本概念
- 了解 AR Session 的基本概念、組成和工作流程
- 通過 訪問 session 中的 AR 功能組件 了解如何訪問錄製組件
啟用 session 的 frame player
ARSession.AssembleOptions 提供了多種方式來配置 session 組件的組合方式,其中一種方式是設定 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 在電腦上運動稠密空間建圖的效果。影片左邊是
Hierarchy視圖,中間是Scene視圖,右邊是Game視圖。Game視圖的內容與使用者在現實世界中手機看到的內容是一樣的。
在播放 EIF 文件的過程中,session 中的各個 AR 功能組件都可以正常工作,場景中的內容和互動邏輯也可以正常工作,從而可以在電腦上進行大部分的開發工作,並直觀地看到效果。
提示
在電腦上使用 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 文件都支援跳轉播放,可以使用 IsSeekable 屬性來檢查目前播放的 EIF 文件是否支援跳轉播放。
附註
只有使用 H264 格式錄製且正常呼叫停止錄製的 EIF 文件才支援跳轉播放。如果 EIF 文件不支援跳轉播放,呼叫 Seek(double) 不會有任何效果。
播放速度控制
使用 Speed 屬性來控制播放速度。
例如,設定播放速度在原來的基礎上增加 0.1 倍:
player.Speed += 0.1;
並不是所有 EIF 文件都支援播放速度控制,可以使用 IsSpeedChangeable 屬性來檢查目前播放的 EIF 文件是否支援播放速度控制。
相關主題
- 嘗試 使用 session 驗證工具,這個工具包含了一個簡單的 EIF 播放器,可以更加快速地使用 EIF 文件進行模擬執行