プレイバック用データセットの作成方法
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;
  }.
}