プレイバック用データセットの作成方法
Lightshipのレコーディング機能を使えば、ARアプリケーションの実際の位置を記録して、Unityエディタでプレイバックしたりテストしたりできます。 プレイバックデータセットの作成は、レコーディング サンプルプロジェクトを使用するか、APIを使用して録画することができます。
前提条件
レコーディングサンプル・プロジェクトを使用してスキャンするには、それをダウンロードし、お使いのデバイスにビルドする必要があります。 詳しくは、 サンプルプロジェクトをご覧ください。
独自の録画アプリを作成するには、Lightship ARを有効にしたUnityプロジェクトが必要です。 詳細については、 ARDK 3.0 のインストールを参照してください。
スキャニングサンプルを使って記録する
サンプルを使ってプレイバックデータセットを記録します:
- レコーディングサンプルをデバイスで開きます。 データセットを記録する準備ができたら、 Startをタップします。
- デバイスのカメラを使って環境を記録します。 次のことに留意してください:
- デバイスを ポートレートモードにしておきます。
- データセットの誤差を減らすため、できるだけ安定してデバイスを持つこと。
- このサンプルには、 データセットを記録するための1分間のタイムリミット があります。
- Stop をタップして録音を終了します。
- 準備ができたら、 Export をタップして、最新の録画を再生データセットに変換します。
- エクスポートが完了すると、サンプルにはアーカイブされたデータセットへのパスが表示されます。 このパスを覚えておくと、後でエディターでデータセットを探すときに便利です。
APIを使ってデータセットを記録する
レコーディング・サンプルがあなたのプロジェクトにとって限定的すぎる場合、代わりに独自のスキャナーを作成することができます。
Unityでロケーションスキャナーを作成するには:
- Lightship Settingsでスキャンを有効にします:
- Lightship トップメニューで、 Settingsを選択します。
- Inspector ウィンドウで、 Scanningというラベルの付いたボックスをチェックします。
 
- AR Sceneで、 AR Scanning Manager をシーンに追加し、無効にします:
- ARSession GameObjectを選択する。
- Inspector ウィンドウで、 Add Componentをクリックし、 AR Scanning Manager を追加します。
- AR Scanning Manager (Script)の横にあるチェックボックスをオフにして、無効にします。
 
- ARSession 
- シーンに2つのボタンを作成します。1つは録画を開始するボタン、もう1つは録画を停止するボタンです。
- Hierarchyで右クリックし、 UI メニューで、 ボタンを選択する。 ボタンの名前を"Record"に変更する。
- 前のステップを繰り返し、新しいボタンに "Stop "という名前を付ける。
- 各ボタンについて、その GameObjectを展開し、Textサブオブジェクトを選択し、Textフィールドを、必要に応じて "Record "または "Stop "に変更します。
- シーンビューのボタンを好きな場所に移動する。
 
- レコーディングを起動するスクリプトを作成し、それをボタンに接続する:
- Assets ウィンドウで右クリックし、 Create メニューから C# Script を選択します。 新しいスクリプトの名前は StartScript。 これをもう2回繰り返し、スクリプト名をRecordButtonとStopButtonとする。
- Hierarchyで右クリックし、 Create Emptyを選択する。 新しい GameObject"Startup "と名付ける。 1.Startupを選択した状態で、 Inspector ウィンドウで、 Add Component をクリックし、StartScriptをStartupに追加します。
- Hierarchyで各ボタンを選択し、 Inspectorの OnClickフィールドに適切なスクリプトを追加します。
 
- Assets ウィンドウで右クリックし、 Create メニューから C# Script を選択します。 新しいスクリプトの名前は 
- このページの最後にあるコードを適切なスクリプトに追加し、あなたのデバイスにビルドしてテストしてください!
レコードデータのエクスポート
お使いのデバイスのオペレーティングシステムの指示に従ってください:
iOSからのエクスポート
- デバイスをXcodeに接続し、開発者モードを有効にする。
- Device and Simulatorsで、サンプルアプリを見つけてください。
- ドットメニューを使って、 Download Containerをタップする。
- コンテナがマシンにダウンロードされたら、パッケージを右クリックし、 Show Package Contentsをクリックする。
- 録画出力からパスに移動します(例: AppData/Documents/scankit/(ID of your scan)/chunk_0.tgz).
- アーカイブをマシンにコピーし、Unityプロジェクトの Assets/StreamingAssetsディレクトリに解凍します。
アンドロイドからのエクスポート
- デバイスを開発マシンに接続する。
- デバイスからファイルを取得します:
- iOS: Android File Transferを開いて、レコーディング出力からパスに移動してください。
- Windows:何をするか尋ねるダイアログがポップアップ表示されたら、 File Tansferを選択し、レコーディングのパスに移動します。
 
- アーカイブをマシンにコピーし、Unityプロジェクトの Assets/StreamingAssetsディレクトリに解凍します。
Unityでプレイバックデータを使う
プレイバックデータセットをUnityに追加する:
- Edit メニューから Project Settings を開き、 XR Plugin Management までスクロールダウンし、 Niantic Lightship SDKを選択する。
- Editor Playbackを有効にし、 Dataset Path フィールドにデータセットの絶対パスを入力する。
StartScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StartScript :MonoBehaviour
{
   public void Start() {
      // Androidの場合は位置情報の使用許可を得る
      // 次に位置情報とコンパスサービスを有効にする
       #if UNITY_ANDROID
        if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation))
        {
            var androidPermissionCallbacks = new PermissionCallbacks();
            androidPermissionCallbacks.PermissionGranted += permissionName =>
            {
                if (permissionName == "android.permission.ACCESS_FINE_LOCATION")
                {
                    Start();
                }.
            };
            Permission.RequestUserPermission(Permission.FineLocation, androidPermissionCallbacks);
            return;
        }.
        #endif
       Input.compass.enabled = true;
       Input.location.Start();
  }.
}
レコードボタン.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RecordButton : MonoBehaviour
{
  // 録画を開始するためにスキャンマネージャーを有効にする
  public void StartRecording() {
    ARScanningManager.enabled = true;
  }.
}
停止ボタン.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StopButton : MonoBehaviour
{
  public async void StopRecordingAndExport() {
    // SaveScan()で録画を保存
    // ScanStore()で参照を取得し、ScanArchiveBuilder()でエクスポート
    // 再生録画へのパスをデバッグメッセージとして出力
    string scanId = ARScanningManager.GetCurrentScanId();
    await ARScanningManager.SaveScan();
    var savedScan = ARScanningManager.GetScanStore().GetSavedScan().Find(scan => scan.ScanId == scanId);
    ScanArchiveBuilder builder = new ScanArchiveBuilder(savedScan, new UploadUserInfo());
    while (builder.HasMoreChunks())
    {
        var task = builder.CreateTaskToGetNextChunk();
        task.Start();
        await task;
        Debug.Log(task.Result); // <- これが再生録画へのパスです。
    }
    ARScanningManager.enabled = false;
  }.
}