CFA(Contents Formatter for AR)って?
アップフロンティア株式会社で開発した、AR開発サポートツールです。
CFAコーポレートサイト:https://cfa.upft.jp/
ARアプリには「どこでも使えるもの」と「現地でしか使えないもの」の2パターンがありますが、
特に開発工数がかかるものは「現地でしか使えないもの(マーカーレス型ビジョンベースAR)」になります。
現地にプロジェクトメンバーで集合したり、
実際に体験・検証する為に何度も現場に向かったりと
いろいろと手間とコストがかかってしまいます。
CFAを使うことで今までより手軽に、簡単にAR開発を実現可能です。
3つのツール
CFAを利用したARコンテンツ作成の一連の流れを図解したものが下記です。

それぞれのツールについて説明していきます。
配置ツール
配置ツールは「現地でしか使えないARコンテンツ」に必要な位置データを作成するツールです。
MicrosoftAzure Spatial Anchorsで作成されたアンカーの位置を基準として、
コンテンツを配置したい場所のデータ(座標、回転座標、スケール)をJson化します。
下記デモ動画は実際に配置ツールを使用して、
コンテンツを配置したい場所のデータ(座標、回転座標、スケール)をJson化している様子です。
ここで作成したデータは次のステップで使用するツールにて大活躍します。
作成ツール
作成ツールはUnity上でコンテンツを配置したい場所のデータを参照することができます。
実際の動画を見ていただいた方が早いかもしれません。
下記が作成ツール側でJsonデータを読み込んだ際の動画です。
簡単に言うと、作成ツールは現地で登録した場所にまつわるデータをUnity上に再現できます。
この現地を再現する機能のおかげで、
わざわざ現地に行って細かい位置合わせを何度も行う工程をスキップできます。
さらに、作成ツールにはBoltをベースとしたノードによるコンテンツ作成機能があります。
Boltはノードベースのビジュアルスクリプティングツールです。
簡単に言うと、コードを記述することなくプログラムを動かすことができるツールです。
実際に使用している様子が下記です。
例えば、
特定のキャラクターをA地点からB地点に移動し、移動後にキャラクターボイスを再生…
といった処理を行いたい とします。
上記のような処理であれば、プログラミングの知識がない方でも、
作成ツール上でノードとノードを繋いで順番に実行させることで、
直感的にプログラムと同様の処理を組み込むことが可能です。
ビューワーアプリ
ビューワーアプリは作成ツールで作成したARコンテンツの動作を確認するツールです。
作成ツールで作成したものをビルドすればスマートフォン上で簡単に確認が可能です。
現地にて起動することで細かい挙動や位置を確認できます。
作成ツール使用例
先ほど、作成ツールの説明において
直感的にプログラムと同様の処理を組み込むことが可能
と述べました。
そこで、本記事では
ノードベースのビジュアルスクリプティングを用いて、
ARコンテンツ作成をどう簡略化したかの説明を進めていきます。
バージョン情報
Unity 2019.4.1f1
最小単位のノード解説
まずは、最小単位でノードの仕組みを理解します。
ボタンを押したら音が鳴る という小さな処理から見ていきます。
下記が実際のノードです。

1つのブロックをユニット(Unit)と呼びます。
青いアイコンに日本語で説明が記述されたユニットがアップフロンティアが作成したオリジナルユニットです。
このようにBoltはユニットを自作することができます。
ユニットとユニットを繋ぐことで逐次実行が可能です。
ノードベースのビジュアルスクリプティングの最初の関門として、
Variableの仕組みを理解することが立ちはだかります。
ここさえ理解すれば問題ありません。
Variable
Variableとは、簡単に一言でまとめると値を橋渡しする役割を持ちます。
例えば先ほどのボタンを押したら音が鳴るという処理においては
Object VariablesというHierarchy上のオブジェクトをノード上で参照できる機能を利用しています。
下記のようにVariablesというコンポーネントをHierarchy上に配置し、
Valueの箇所にノード上で参照したいオブジェクトをアタッチします。
Nameの箇所にはノード上で受け取る際の変数名を自由に定義できます。

Variablesは使用頻度の高い便利なコンポーネントのため、
CFAではJsonデータから再構築したメインアンカーのオブジェクトに
自動的にアタッチされるようになっています。
ここまで理解できたら、先ほどのノードに戻って再度仕組みを見てみましょう。
Get Variableで変数名を指定することでオブジェクトを取得(参照)することが可能になる
ということがわかると思います。

Variableの使い方を理解できればもう安心してARコンテンツ作りに臨めることでしょう。
デモ1
これまでの説明を踏まえた簡単なデモです。
有名なカップシャッフルゲームを作成してみました。
これくらいのボリュームのARコンテンツであれば、
下記程度のノードでおさまります。

オブジェクトの表示、非表示、生成、破棄、指定時間待つなどはBoltの標準ユニットで、
吹き出しなどはCFA独自のユニットとして用意しています。
ですので、素材さえ用意すれば簡単に実装が可能です。

デモ2
次に、物理演算を利用したARボールすくいです。
アニメーションと物理演算による移動を組み合わせて、
ボールをすくった位置がどこであっても桶の中にボールをリリースできるようにしています。
具体的には下記のノードで実現しています。

下記のように、ターゲットとなるオブジェクトを選択することも可能です。

デモ3
最後に、ランダムに出現した雪だるまを狙い撃つシューティングシミュレーションゲームです。
ランダムな処理には乱数が必要です。
すなわち、実行されるたびに異なる値を返す必要があります。
乱数を生成するノードもCFAには備わっています。
少し複雑ですが、下記は生成した乱数の値に応じて処理を分岐するノードの一例です。

また、このデモにおいては、
タイマー及びランダムに生成される処理はCFAの作成ツールの自作ノードを中心に実装し、
その他のタップした際のスコアの加点、エフェクト生成などはコードでプログラムしています。
このデモのように、デザイナーはモデルの配置や移動、シナリオの一連の流れを組み込み、
プラグラマーは用意されたユニットで補えない複雑なロジックを実装という分担作業も可能です。
さいごに
ARをはじめ、xRコンテンツの開発は手戻りのコストが大きく、
なかなか見た目の確認や調整が簡単にできないところがネックとなっていました。
実際に私もCFAを利用してみて、ARコンテンツは開発プロセスが特殊であると改めて感じました。
もしCFAのようなツールが無ければ、
場所のデータを持ち帰ってオフィスや自宅で作業するということが困難になり、
現地とオフィスや自宅を何度も往復するような
非常に大変な思いをしながら開発を進めることとなるでしょう。
CFAを使うことで、そういった悩みを解消できます。
さらに役割を切り分けてモックアップ作成と詳細な作りこみを分担できるので
“現地でしか使えないARコンテンツ”の開発速度を高めることができます。
更なるブラッシュアップを進めているのでご期待ください。