キャラクターと一緒に並んで歩くアプリの開発

研究で作っていたARアプリを公開します。
一応、（査読なしとはいえ）学会にも出してはいるので、よろしければ文献も探してみてください。
（本当なら文献として出したいけど、苗字が珍しくて声を大に言えない……）

# 特徴
__ユーザーが歩いても、キャラクターが「隣に」いる。__ ただそれだけ。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669580/2e685e4e-f2cc-4f81-890b-686a2b6218ea.gif">

# 主要環境
## 開発
- Unity（2022.3.10f1）
- MacBook Pro (2016, macOS Monterey)
プロセッサ: 2GHz デュアルコアIntel Core i5
メモリ: 8GB
- Windows 10 Pro
## 実装（実機テストに使用）
- iOS: iPhone SE2, SE3, iPad mini (5th Gen) 
- Android: XREAL Beam Pro + XREAL Air 2 Ultra

いずれの環境も6DoF機能が付いています。
Apple系端末を使用する際は、最低でも「iPhone XS」程度のスペックが必要でした（iPhone SE1ではFPS値が低下して使えず。CPUスレッド数が関係か？）。

# ソースコードなど
以下のレポジトリのReleasesにユニティアセットで配布しています。ちなみに、名前は「Selene」。
このほか、各種ソースコードも別途格納しています。
現在はalpha01で、歩行機能のみ動作します。
__学生時代に開発していたオリジナルのものと全く同じではありません。__

https://github.com/sinsen9000/Selene

### 利用可能機能
2025年6月1日現在

:::note info
動作確認済み（主な処理のみ列挙）
- 移動処理（Move.cs、SE.cs）
- 設定画面（DialogShow.cs、Show.cs、SampleGUI.cs）
- キャラの処理（EyeBlink〇〇.cs、LookUp.cs）
:::
:::note alert
動作未確認、大幅改修予定（削除しても歩行機能は利用可）
- ユーザ音声録音（Micin.cs、MicUI.cs、MicRecorder.cs）
- ネットワーク（Network.cs）
- キャラ動作・応答音声（AnimMorph〇〇.cs、Wavplay.cs）
:::
上に書いていないスクリプトについても問題なく処理します。

### インポート後
インポートしても、以下の画像のように上手く動作しません。
そこで、追加で以下の機能をインストール・設定する必要があります。
![Monosnap SeleneScene - My project - Windows, Mac, Linux - Unity 2022.3.20f1 <Metal> 2025-05-31 15-31-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669580/db2da2cb-9a99-4646-bb31-db8500b06742.png)
- AR機能一式とBurst
これらは、いずれも`Package Manager`で設定できます（上部にある`Packages:`から`Unity Registry`を選択し、インストール。以下はAR機能の例）。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669580/d277325b-76cf-448a-9079-bd03dc609c60.png">

- Audioの設定
このアプリケーションには立体音響が備わっております。このまま実行しても音が出ないため、`Project Settings > Audio`内にある赤枠の部分の設定を`Resonance Audio`に変更します。
![Monosnap Project Settings 2025-05-31 15-04-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669580/46aa7f43-bbd6-47c9-90f4-216e0c2232ee.png)

# 歩行機能
### 使い方
何より、特徴は横並びで歩ける事。 __縦横斜め、どう歩いても。__
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669580/a90625b6-26da-4b0c-b114-be4c83a158f3.gif">

どちらかと言えば「ユーザーの移動先についてくる」処理になります。
開始後しばらくすると並んで歩くようになります。

歩行機能を使用するには、腕の最大長を登録する必要があります。
1. 画面をタップして設定画面を表示し、キャリブレーションボタンを押す
2. 腕を伸ばした状態で、ユーザーが右回転する事で登録

![画面収録 2025-06-01 14.00.33.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669580/4c2a183a-3801-4f3f-8098-81cd6a4173b0.gif)

これで機能は利用できるはずです。

### 構造
![Selene.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669580/e840dea9-70a1-4428-9522-170151c96a3a.jpeg)
歩行機能のメイン処理である`Move.cs`を中心とした図です（拡大推奨）。
キャラ動作から出ている矢印は、モデルのAnimatorを読み込む変数`_anim`ですが、こちらは`void Start()`内で宣言して使用します。

使用するキャラクターは`Models`の中に格納し、これごと動かすことで移動を実現しています。
設定画面内の処理の１つである`DropDown.cs`などの必要要件のスクリプトも残っていますが、上記の動作未確認である処理群に全く干渉されることなく処理しています。


# 環境の復元
オリジナルの環境ではMMDをベースに、以下の方法でキャラクターを操作していました。
- キャラ変換：MMD4Mecanim
- キャラ動作：mmdモーション（MMD4Mecanimで変換）

これを再度利用できる形にするためには、MMD4Mecanimをimportする必要があります。

https://stereoarts.jp/

利用方法については公式マニュアルやその他サイトが詳しいので、そちらに任せます。
ただし、Android実装の場合は物理処理やシェーダー処理が実機対応していないため、諸々変更する必要があります（ちなみに私は物理処理を「DynamicBone」、シェーダーを「liltoon」に変更して実装しました）。

https://qiita.com/hajime_y/items/6844bcb107c924469cb5

瞬き処理や発声処理などはVRMの系統と異なるため、`AnimMorphMMD.cs`、`EyeBlinkMMD.cs`のコメントアウトを解除してアタッチしてください。
※MMD4Mecanimをインポートしないままコメントアウトすると、エラーを吐き実行できなくなります。

# 今後
このアプリは、元々音声対話システムの拡張ツールとして開発した経緯があります。
そのため、このアプリに適応した音声対話システムの公開準備を進めます。

動かなかったらゴメンなさい……修正します……。
本当にお試し版みたいな感じなので……。