CrossViewとは
こちらの記事をご覧ください。
はじめに
ここまでで、CrossViewを作り始めるにあたって解決すべき「技術課題」を、事前にテストプログラムを作ることで確認してきました。
-
Football_1
- 3DモデルとAnimatorControllerで、Mixamoアニメーションを制御する
-
Football_2
- 3Dモデルの滑らかな移動、方向転換、首振り動作、視界領域を表す扇形オブジェクトの生成
-
Football_3
- ログファイルの読み込み、パース処理、ログ再生の為の定期タイマー管理
-
Football_4
- プレーヤーの3DモデルをPrefabからインスタンス化、背番号、NightModeの試作
-
Football_5
- ViewModeの試作(全体表示と三人称表示)
-
Football_6
- Settings画面の試作(プレーヤーのキャラクタ変更)
いざ、CrossView開発
テストプログラムの作成により、機能ごとに実装方法を事前に確認でき、またバグもある程度は先行して取り除けました。
次はいよいよ、本実装です。
UnityHubから新規作成で、CrossViewプロジェクトを開始して、
- プロジェクト設定
- Api Compatibility Level=.NET 4.x(UnityStandaloneFileBrowserの為)
- PackageManagerにて、VersionControlを削除(UnityStandaloneFileBrowserの為)
- Quality->Pixel Light Countを 23以上の値に(Directional=1個, SpotLight=22個)
- Sceneに3Dオブジェクトを作成
- SceneにUIオブジェクトを作成
- Football_3をベースに作成
- ファイル選択、読み込み、パース処理、ログデータの内部構築まで
- フレームレート表示を追加
- MainCameraのズーム機能を実装(AutoScrollも)
- Settings画面を追加
- Football_6をベースに作成
- 今回は2つのペアから選ぶことに
- ログファイルの読み込み直後の初期化処理
- 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で選択プレーヤーを切り替え可能
- カメラの追従対象を変更
- 三人称画面では、右上のDropdownで選択プレーヤーを切り替え可能
- NightModeの実装(Football_4)
追加実装
一通り、基本機能が動くことを確認出来たら、欲が出てきて、細かい小機能を追加することにしました。
- 三人称画面
- 方向感覚がわからなくなるのを防ぐために、ピッチわきに観客席などを用意
- Information表示を追加(選択プレーヤーに合わせて情報を更新)
- 背番号は、選択プレーヤーのみ強調表示
- NightModeをONにした時、選択プレーヤーのみスポットライトを点灯するように
- サッカーフィールド上に設置された仮想Flag(黄色いマーカー)を表示
- 試合終了時、各プレーヤーのアニメーションをIdle状態にする
- 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のアイコン)
- キャラクタペアをもう1パターン用意したかった
- ログファイル読み込み直後に、プレーヤーが初期位置まで走りこむ演出
- ハーフタイム時(Cycle数=3000)に、間を置く演出
- ログファイルに記録された team_graphic(XPS画像)の表示
最後に
2024年11月現在、サッカー日本代表は、男女ともに絶好調です。
今回、3DLogPlayerという周辺ツールを作ってみましたが、ぜひ、試合をする側の自律制御Agentプログラムを自分でも作ってみたいものです。(強化学習や転移学習を駆使して)
でも、今はフリーランスとしてお仕事を探す方が大事だなぁ~。涙)
以上です。