[Unity][RoboCup] CrossView開発日記 #7 (最終回)

# CrossViewとは
こちらの記事をご覧ください。

https://qiita.com/suzuki_nene/items/cbdb701622a738f1b2ee

# はじめに
ここまでで、CrossViewを作り始めるにあたって解決すべき「技術課題」を、事前にテストプログラムを作ることで確認してきました。

- [Football_1](https://qiita.com/suzuki_nene/items/69af880ae3a3e979c782)
    - 3DモデルとAnimatorControllerで、Mixamoアニメーションを制御する
- [Football_2](https://qiita.com/suzuki_nene/items/8e3f6f5c83c1cdda5687)
    - 3Dモデルの滑らかな移動、方向転換、首振り動作、視界領域を表す扇形オブジェクトの生成
- [Football_3](https://qiita.com/suzuki_nene/items/b920e3faf7aa27410005)
    - ログファイルの読み込み、パース処理、ログ再生の為の定期タイマー管理
- [Football_4](https://qiita.com/suzuki_nene/items/b473e986dbdd58925025)
    - プレーヤーの3DモデルをPrefabからインスタンス化、背番号、NightModeの試作
- [Football_5](https://qiita.com/suzuki_nene/items/171429b6f0aaaa599433)
    - ViewModeの試作（全体表示と三人称表示）
- [Football_6](https://qiita.com/suzuki_nene/items/8984e9f153e8b8487abd)
    - Settings画面の試作（プレーヤーのキャラクタ変更）

# いざ、CrossView開発
テストプログラムの作成により、機能ごとに実装方法を事前に確認でき、またバグもある程度は先行して取り除けました。

次はいよいよ、本実装です。

![CrossView_NewProject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/95c2ddf6-49ec-ffbd-45f7-bfe2eb9d49b9.png)

UnityHubから新規作成で、CrossViewプロジェクトを開始して、
- プロジェクト設定
    - Api Compatibility Level=.NET 4.x（UnityStandaloneFileBrowserの為）
    - PackageManagerにて、VersionControlを削除（UnityStandaloneFileBrowserの為）
    - Quality->Pixel Light Countを 23以上の値に（Directional=1個, SpotLight=22個）
- Sceneに3Dオブジェクトを作成
    - サッカーフィールド用の[テクスチャ](https://github.com/SuzukiNene/CrossView3D/blob/master/Assets/Materials/tex_Field_5250x3400.png)は、Windows付属のペイントアプリで自力で描画！
    - サッカー場のサイズは、[ここ](https://www.kofu-field.com/staff_blog/archives/1454)を参考に
- SceneにUIオブジェクトを作成
    - Football_3をベースに作成
    - ファイル選択、読み込み、パース処理、ログデータの内部構築まで
    - フレームレート表示を追加
    - MainCameraのズーム機能を実装(AutoScrollも)
- Settings画面を追加
    - Football_6をベースに作成
    - 今回は２つのペアから選ぶことに
- ログファイルの読み込み直後の初期化処理
    - GameControlクラスに画面制御の機能を集約
    - 得点ボードにチーム名と試合結果の得点を表示したり、ログファイルに記録されているゴール幅の設定値に合わせてサイズ調整したり
    - ボールをセンターサークルに配置
    - Settings画面で選んだキャラクタで、合計22名のプレーヤーをインスタンス化、ピッチサイドに並ばせる（Football_4）
- ログ再生の作りこみ
    - Play,Pause,Next,Prevボタン押下時の処理を追加（SimLogPlayerクラス）
    - Cycle数を直接入力でジャンプさせる機能を追加
    - SimLogPlayerクラスが通知してくるイベントに応じて、
        - 現在のCycle数の表示を更新
        - 再生ステータスに合わせてボタン類のEnable/Disable状態を変更
    - 定期タイマーの発動で、ログデータの内容を画面に反映
        - PlayMode表示の更新
        - 得点の更新
        - ボールやプレーヤーの動きを制御（Football_2）
        - プレーヤーにKick等のアニメーションを実行したり（Football_1）
    - ログ再生のスピード変更（同時に、アニメーション再生のスピードも調整）に対応
- ViewModeの実装（Football_5）
    - 三人称画面では、右上のDropdownで選択プレーヤーを切り替え可能
        - カメラの追従対象を変更
- NightModeの実装（Football_4）

# 追加実装
一通り、基本機能が動くことを確認出来たら、欲が出てきて、細かい小機能を追加することにしました。

![CrossView_Scene_3D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/8ae00ceb-a59d-defb-162f-75724a5f8800.png)

- 三人称画面
    - 方向感覚がわからなくなるのを防ぐために、ピッチわきに観客席などを用意
    - Information表示を追加（選択プレーヤーに合わせて情報を更新）
    - 背番号は、選択プレーヤーのみ強調表示
    - NightModeをONにした時、選択プレーヤーのみスポットライトを点灯するように
    - サッカーフィールド上に設置された仮想Flag（黄色いマーカー）を表示
- 試合終了時、各プレーヤーのアニメーションをIdle状態にする
- Unity標準のDropdownコントロールの、マウスホイールによるスクロール感度を調整
    - 参考）https://noracle.jp/unity-dropdown/
- ファールやゴール、オフサイド発生時に、得点ボードの背景色を変える
- ログファイルを読み込み中に、処理中アニメーションを表示
- アプリ起動直後、フィールド上を選手がぐるぐる走りまわるデモ演出
- ファイル選択ダイアログに、OpenSiteボタンを追加（公式アーカイブのサイトをブラウザで開く）
- NextEvent,PrevEventボタンを追加（前後のPlayMode変化時点へのジャンプ）

# OSSとして公開
- README.mdの作成
- ライセンスについて調査
    - UnityAssetStoreで入手した無料Assetは、ファイルのまま公開しちゃダメ
- GitHubに公開用リポジトリの作成（CrossView3D）
    - 非公開にする、外部入手ファイルのFileList.txtを用意
    - プレーヤーのPrefabの作り方メモを用意
- 自作Scriptのライセンスを検討（MIT Licenseを採用）
- InnoSetupでインストーラー作成、リポジトリのReleaseページにアップロード
- アナウンス
    - Qiita
    - RoboCup Soccer SimulationのDiscordに投稿
- WebGL版の作成と、GitHub Pagesでの公開
- Qiitaに開発日記を書く

# 開発期間
- 2024年6月～　書籍でC#とUnityの復習
- 2024年7月～　RoboCupの公式マニュアルから、ログファイルの仕様を洗い出し
- 2024年8月～　実装（テストプログラム、本実装）
- 2024年10月末　OSS公開

# 実現したかったけどペンディングにしたこと
- 4x3の12画面分割やPicture In Pictureの採用
- デザイン見直し（ViewMode, NightModeのアイコン）
- キャラクタペアをもう１パターン用意したかった
- ログファイル読み込み直後に、プレーヤーが初期位置まで走りこむ演出
- ハーフタイム時（Cycle数=3000）に、間を置く演出
- ログファイルに記録された team_graphic(XPS画像)の表示

# 最後に
2024年11月現在、サッカー日本代表は、男女ともに絶好調です。
今回、3DLogPlayerという周辺ツールを作ってみましたが、ぜひ、試合をする側の自律制御Agentプログラムを自分でも作ってみたいものです。（強化学習や転移学習を駆使して）

でも、今はフリーランスとしてお仕事を探す方が大事だなぁ～。涙）

以上です。