[Unity][RoboCup] CrossView開発日記 #8 (番外編)

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

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

# はじめに
開発において、通常はRedmineのようなツールを用いてチームでタスク管理を行うことが多いと思いますが、それ以前に、自分自身の作業を管理する際に、私は事細かく「メモ」を残すようにしています。

自分がいま、何を目的とした作業を行っているのか、
うまくいったこと、いかなかったこと、得たノウハウ、
調べた内容や情報源など、頭の中の思考の履歴を、
毎日、事細かくテキストファイルに記録を残しています。

メモに残すことで、思考の堂々巡りを防ぐことができたりします。
メモの内容は、後で正式なドキュメント作成時に活用します。

今回は、CrossView開発において書き残したメモを公開したいと思います。

# 開発メモ
~~~
////////////////////////////////////////////////////////////////////////////////////////////////////
// 

□RCSS LogPlayer(3D LogPlayer for RoboCupSoccerSim2D, Made with Unity)
　■Unityインストール
　　■2020.3
　　■2022.3
　　　→アンインストール
　■UnityLearn
　　■全体を眺めてみる（目星をつける）
　■Unity入門
　　■書籍：Unity3Dゲーム開発ではじめるC#プログラミング
　　　■本の通り、作ってみる。
　　　□疑問点
　　　　□（Enemyに押されると、Playerが床や四隅の壁を越えて落下してしまう件）
　　　　　→今回はRigidbodyは使わず、Transformのみで移動を実装するので、保留。
　　　　■Planeの坂に横から進むとPlayerが埋まる件
　　　　　→厚みを生むために、坂をPlaneからCubeに変更（坂の裏面も描画されるようになった！）
　　　　■弾が壁等にぶつかった時に、跳ね返される場合と消える(突き抜ける)場合がある件
　　　　　→BulletのCollisionDetectionを、DiscreteからContinuousに変更
　　　　　　（移動速度のあるオブジェクトの衝突判定は、Discreteでは不向き）
　　　　■EnemyがPlayerにぶつかった時の、Navigation先の制御がなんか変な件
　　　　　→本の実装だと、EnemyのCollider領域内に入った時点のPlayerの位置がNavigation先に設定される。
　　　　　　その後、Playerが移動しても更新されないので、領域内にいる限り追い続けるようにOnTriggerStay()を追加。
　　　　　→Enemyの領域外にPlayerが逃げ出せた場合、EnemyのNavigation先をさらに次のLocationに更新するのではなく
　　　　　　直前のLocationに復帰させるよう変更。
　　　　□CharacterControllerコンポーネント（Unityの標準機能）
　　　　　→使い方は？？？
　　■練習プロジェクト
　　　□3DオブジェクトでサッカーFieldを作ってみる。
　　　　■サッカーFieldの画像ファイルをTextureとして利用。
　　　　□プリミティブな3Dオブジェクトの組み合わせで作る。
　　　　　→Field上のFlagオブジェクトも忘れずに。
　　　　■ゴール(3DModel)
　　　■3DキャラのAssetをダウンロード、インポートして使ってみる。
　　　■アニメーションの適用
　　　　■Asset
　　　　　■3Dモデル
　　　　　　■Rig
　　　　　　　AnimationType=Humanoid, AvatarDefinition=CreateFromThisModel
　　　　　　■Animation
　　　　　　　ImportAnimation=off
　　　　■3DモデルのInspector
　　　　　■Animator
　　　　　　Controller=MixamoでダウンロードしたAnimation用に作成したController（AnimatorControllerを作成してAnimation内包のClipをDrag&Dropする）
　　　　　　Avatar=3Dモデル内のAvatar
　　　■キャラクター操作
　　　　■Stylized Astronautアセットに付属のPlayer,ThirdPersonCameraのC#スクリプトを試す
　　　　■NavMeshの利用
　　■トラブル
　　　■C#スクリプトを変更してコンパイルエラーがある状態からUnityEditorを起動すると、SafeModeでプロジェクトを開くか聞かれる。
　　　　その後、UnityEditorを再度開いた時にシーンが空っぽになってしまうことがあった。
　　　　→FileメニューからデフォルトのSceneを開きなおせば、復帰する。（データが消えてしまったわけではなかった）
　■デバッグ
　　■環境（Visual Studio Community 2019のインストール）
　　■方法（Unityにアタッチ）
　■技術課題
　　■AnimationのState切替
　　　■アニメーションをIdle->Jog Fwd->Kick(Catch)と切替える
　　　　→Entry、Idle、JobForward、JobBackwordの遷移は、Bool変数で操作する。
　　　　　HasExitTime=OFFで、すぐに遷移するようにする。
　　　　→AnyState、Kick、Tackle、Exitの遷移は、Trigger変数で操作する。（遷移後、元のStateに自動的に戻る）
　　　　　Kick、TackleなどのTrigger系のAnimationは、LoopTime=OFF、RootMotionNode＝RootTransformに設定しておく。
　　　　　Exitへの線では、HasExitTimeを有効にして、アニメーション再生の時間を設定しておく。（例：ExitTime=0.4秒）
　　　　→ゴールキーパー用では、
　　　　　KickではなくPassにする。
　　　　　Catching Idleステート及び、Catchトリガーも追加する。
　　　　　DivingSave（左右）は必要？
　　　■Jog Forwardのアニメーションを実行させると、3Dモデルが自動的に位置移動してしまう。
　　　　→ApplyRootMotion=OFF
　　　■Kick/Tackleを繰り返すと、どんどん地面に埋まっていく。
　　　　→3DモデルにCharacter Controllerコンポーネントを適用したら、埋まらなくなってくれた。
　　　　　→ApplyRootMotion=OFFであれば、これは必要なかった！
　　■3Dモデルの首振り操作（LookAtのIK）
　　　■AnimatorControllerのBaseLayerにてIK Pass＝ONにして、OnAnimatorIK()でSetLookAtPosition()する。
　　　■5人いるMaleの先頭しかLookAtターゲットにAstronautを設定していないにも関わらず、5人全員が首振り動作してしまう。
　　　　→同じAnimatorControllerを使っていると、LookAtターゲットを設定していない他のMaleでもIKが適用されてしまう？
　　　　　→SetLookAtPosition()を実行する/しないの判定が抜けていた。。。
　　■BallやPlayerの移動を滑らかにするには？
　　　■Ballの移動時、回転させる？
　　　　→進行方向に向けて縦回転させるには、Transform.LookAt()で移動先に向きを変え、Transform.Rotate(Vector3.right, angle)でX軸を中心に回転。
　　　■Transformで位置を100msec間隔で移動させると、カクカクしたアニメーションになってしまう！？
　　　　→Update()で、経過時間を考慮して、100msec後の移動先までの移動を複数分割する実装にする？（例：100msecで5cm移動する）
　　　■体の向きや視界なども、滑らかにアニメーションさせる？？？
　　　　→体の向き：transform.rotation = Quaternion.AngleAxis(angle, Vector3.up)
　　　　→頭の位置：Animator.GetBoneTransform(HumanBodyBones.Head)
　　　　→視線位置：human.position + (Quaternion.Euler(0f, angle, 0f) * (human.forward * 2f))
　　■Animatorの現在のStateを知る方法
　　　→Animator.GetCurrentAnimatorStateInfo().IsName()
　　　　https://zenn.dev/daichi_gamedev/articles/b74e4f5a17bdc5
　　■扇形3Dオブジェクト（FanShape：プレイヤーの足元に視界の向きを表す扇形のオブジェクト）
　　　→Emptyオブジェクトを用意しておき、スクリプトからMeshを生成させる場合
　　　　https://docs.unity3d.com/ja/current/Manual/Example-CreatingaBillboardPlane.html
　　　→3Dモデルの子供にViewAngle(Empty)を用意してViewAngleBehaviourスクリプトをアタッチ、その子供としてSpotlightを配置する
　　　　FanShapeは実行時にスクリプトで生成
　　■照明（スポットライト：扇形の中心点の位置に設置。光の角度と距離は指定できる？）
　　　→アプリ開始後、トグルボタンでNightModeに変更してもSpotlightの光が描画されないのはなぜ？
　　　　（被写体の反射は描画されているが、Spotlightの位置が変化しないと描画されない。）
　　　　→クリック時のバグにより、位置を移動すれば光が描画されるようになっていた。（Manの高さがBallと同じ0.15になるので）
　　　　→Spotlightの高さが0で、地面に埋まってたから光らなかった。0.05に設定。
　　■視界の変更（ViewAngleの向きを首の向きに合わせる）
　　　→ViewAngleBehaviour.TurnTo(float angle, float seconds)を実装。
　　■視野角の変更（滑らかなアニメーションで、FanShapeとSpotlightの角度/距離を更新）
　　　→ViewAngleBehaviour.ChangeAngle(float angle, float range, float seconds)を実装
　　■インスタンス化した3DModelに、FieldPlayerとGoalKeeperのAnimatorを実行時に設定する方法（使わないかも）
　　　→スクリプトからAnimatorControllerを実行時に変更可能？
　　　　https://robamemo.hatenablog.com/entry/2017/07/06/114102
　　■UIコントロール類
　　　□Unity標準
　　　□無料Assetの使い方
　　■ダイアログの作り方
　　　→アニメーションするダイアログ
　　　　https://nekojara.city/unity-animated-dialog
　　■ログファイルのファイル選択/Webダウンロード
　　　■PC(Win,Mac,Linux)
　　　　→UnityStandaloneFileBrowser
　　　　　https://zenn.dev/plumchang/articles/9187928bcbcf93
　　　　→【Unity】実機上で外部ファイルの読み込み書き出しできるフリープラグインStandaloneFileBrowserの使い方
　　　　　https://namiton.hatenablog.jp/entry/2022/04/20/132255
　　　　→ Error when building from unity editor 2019.4 #96
　　　　　https://github.com/gkngkc/UnityStandaloneFileBrowser/issues/96
　　　　→エラー対処
　　　　　・PackageManagerにて、VersionControlを削除
★　　　　・Buildオプションにて、[.NET4x]をターゲットに設定
　　　□Mobile(iOS,Android), PC(Win,Mac)
　　　　→NativeFileSO
　　　　　https://mogamogatech.com/nativefileso/
　　　　　　※UnityにiOS,Androidのビルドオプションをインストールする必要がある。
　　　　　　※Win,Macもサポートするので、同梱ファイルが UnityStandaloneFileBrowserとバッティングする！？
　　　■Download from Web(URL)
　　　　→UnityWebRequest
　　　　　https://docs.unity3d.com/ja/2020.3/Manual/UnityWebRequest.html
　　　　→DownloadHandlerScriptによる、受信データの逐次処理
　　　　　https://docs.unity3d.com/ja/2020.3/Manual/UnityWebRequest-CreatingDownloadHandlers.html
　　　　→MemoryStreamとStreamReaderを使ってバイト配列から文字列を読み込む (C#)
　　　　　https://smdn.jp/programming/dotnet-samplecodes/stream/3a8012b4024111eb907175842ffbe222/
　　■画面分割（CameraのViewPort Rect）
　　　■カメラ制御（二画面構成：左　天頂カメラ、右　一人称カメラ）
　　□Unity特有
　　　□レイヤーの設定は、何か検討する必要があるだろうか？？？
　　　　■とりあえず、UI部品はUIレイヤーにする。
　～～～
　■RoboCup入門
　　■RoboCupシミュレーション2Dの最新マニュアル（Mar 25, 2024版）
　　　■Vision Sensor Model
　　　　→v17まで：非同期モードがデフォルト。
　　　　→v18以降：同期モードがデフォルト。
　　　■LogFile(*.rcg)の仕様
　　　　■LogFile Version3までは、バイナリ格納のフォーマット。
　　　　　→非サポートとする。
　　　　■LogFile Version6
　　　　　→2023年のLogFileは、ヘッダ行が"ULG6"になっているが、仕様が不明。Manualに記述無し。
　　　　　→ソースコードを読むと、ULG6から導入された要素などが読み取れた。
　　　　■C#でS式(S-Expressions)文字列をパース処理
　　　　　■5.5.4章 Version 4 Protocol
　　　　　　■server_param, player_param
　　　　　　　（4.9.7章を参照）
　　　　　　■player_type
　　　　　　　（4.6章を参照）
　　　　　　■msg
　　　　　　　various string data, such as team_graphic, the result of the game, and so on.
　　　　　　　the game result is recorded using msg data at the end of the game log.
　　　　　　　See Version 3 in detail.（5.3.3章を参照）
　　　　　　■playmode
　　　　　　　------------------------------------
　　　　　　　(playmode Time PlayMode)
　　　　　　　		Time ::= simulation cycle of rcssserver
　　　　　　　		PlayMode ::= （文字列）
　　　　　　　------------------------------------
　　　　　　　（4.7.1章 Play Modes and referee messages, Table4.19 を参照）
　　　　　　■team
　　　　　　　------------------------------------
　　　　　　　(team Time LeftName RightName LeftScore RightScore)
　　　　　　　		Time ::= simulation cycle of rcssserver
　　　　　　　		LeftName ::= （チーム名）
　　　　　　　		RightName ::= （チーム名）
　　　　　　　		LeftScore ::= （得点）
　　　　　　　		RightScore ::= （得点）
　　　　　　　------------------------------------
　　　　　　■show
　　　　　　　（5.3.3章 Version 3 を参照）
　　　　　■5.5.5章 Version 5 Protocol
　　　　　　■stamina_capacity
　　　　　　　------------------------------------
　　　　　　　adding stamina_capacity information to each player data.
　　　　　　　------------------------------------
　　　　　■5.3章 Communication from Server to Monitor
　　　　　　5.3.3章 Version 3
　　　　　　→Monitorプロトコルは、Version3からはS式(S-Expression)による文字列ベースのフォーマットに仕様変更
　　　　　　→show（PlayModeとScoreは、LogFileでは含まれず、showメッセージとは別のメッセージで記録されている。）
　　　　　　　------------------------------------
　　　　　　　(show Time PlayMode Score Ball *Player*+)
　　　　　　　		Time ::= simulation cycle of rcssserver
　　　　　　　		PlayMode ::= (pm PlayModeID)
　　　　　　　		Score ::= (tm LeftName RightName LeftScore RightScore [PenaltyScore])
　　　　　　　		PenaltyScore ::= LeftPenaltyScore LeftPenaltyMiss RightPenaltyScore RightPenaltyMiss
　　　　　　　		Ball ::= ((b) X Y VelX VelY)
　　　　　　　		Player ::=
　　　　　　　		(
　　　　　　　			(Side Unum) Type State X Y VelX VelY Body Neck [PointX PointY]
　　　　　　　			(v ViewQuality ViewWidth) [(fp dist dir)] (s *Stamina Effort Recovery [Capacity])
　　　　　　　			[(f FocusSide FocusUnum)]
　　　　　　　			(c KickCount DashCount TurnCount CatchCount MoveCount TurnNeckCount ChangeViewCount
　　　　　　　			SayCount TackleCount PointtoCount AttentiontoCount [ChangeFocusCount])
　　　　　　　		)
　　　　　　　------------------------------------
　　　　　　　			[PointX PointY]				// Pointto Model
　　　　　　　			[(fp dist dir)]				// Focus Point			: ULG6から導入（ソースコード参照）
　　　　　　　			[Capacity]					// 						: ULG5から導入（ソースコード参照）
　　　　　　　			[(f FocusSide FocusUnum)]	// Attensionto Model
　　　　　　　------------------------------------
　　　　　　　例）ULG6の場合
				(show 
					1749 
					((b) -19.6904 13.3318 -0.7693 1.5827) 
					((l 1) 0 0x9 -40.7726 3.6403 -0.2672 -0.2014 -142.145 90 (v h 180) (fp 0 0) (s 7890 1 1 115227) (f l 6) (c 0 155 2163 0 1 2319 131 56 0 0 1611 0)) 
					((l 2) 15 0x1 -26.8182 -3.6813 -0.1449 -0.0798 164.204 -22 (v h 180) (fp 0 0) (s 5837.45 0.887456 1 75603.9) (f l 11) (c 7 723 1569 0 1 2300 1089 285 0 1 1612 0)) 
					((l 3) 7 0x1 -26.5416 13.2372 -0.105 -0.1566 -165.068 90 (v h 180) (fp 0 0) (s 6328.39 0.890715 1 78881.9) (f l 8) (c 2 695 1582 0 1 2280 948 326 0 1 1612 0)) 
					((l 4) 17 0x1 -26.5918 -12.7452 -0.0824 -0.0067 127.416 -61 (v h 180) (fp 0 0) (s 5767.9 0.930527 1 64408.1) (f l 8) (c 17 956 1286 0 1 2260 436 227 0 1 1612 0)) 
					((l 5) 5 0x1 -25.9463 23.2369 -0.1865 -0.1375 -171.754 37 (v h 180) (fp 0 0) (s 7202.67 0.860854 1 62229.7) (f l 8) (c 20 956 1264 0 1 2241 300 283 0 0 1520 0)) 
					((l 6) 14 0x1 -22.9758 9.2954 -0.0178 -0.0548 -144.601 -89 (v h 180) (fp 0 0) (s 6844.24 0.858335 1 84349) (f l 8) (c 13 618 1575 0 1 2221 963 332 1 1 1612 0)) 
					((l 7) 13 0x1 -15.6307 0.9848 -0.0497 -0.0908 -140.323 -86 (v h 60) (fp 0 0) (s 4054.24 0.886257 1 57227.9) (f l 11) (c 12 1043 1145 0 1 2201 228 311 0 1 1612 0)) 
					((l 8) 8 0x1 -17.304 13.0628 -0.0901 -0.1495 178.946 -20 (v h 60) (fp 0 0) (s 3991.61 0.972688 1 45262.8) (f l 11) (c 29 1096 1049 0 1 2181 151 335 1 2 1485 0)) 
					((l 9) 4 0x1 -8.5112 -15.381 -0.2747 0.0155 -170.896 -65 (v h 120) (fp 0 0) (s 4897.2 0.862795 1 62126.6) (f l 8) (c 10 1100 1051 0 1 2162 180 392 0 55 1612 0)) 
					((l 10) 9 0x1 -5.0058 24.852 -0.0786 -0.0368 -154.971 -2 (v h 60) (fp 0 0) (s 4436.8 0.975495 1 53111.8) (f l 8) (c 35 1123 983 0 1 2142 311 404 0 54 1613 0)) 
					((l 11) 10 0x1 -0.0175 13.5547 -0.0034 -0.0028 -147.769 89 (v h 120) (fp 0 0) (s 4602.59 0.906389 1 51905.8) (f l 8) (c 25 1204 876 0 1 2122 249 388 2 62 1613 0)) 
					((r 1) 0 0x9 37.8652 4.0499 -0.0379 -0.0014 175.933 5 -11.8041 5.1876 (v h 180) (fp 0 0) (s 8000 1 1 96486.5) (f r 10) (c 6 374 1680 1 3 2074 126 210 1 355 929 0)) 
					((r 2) 4 0x1 11.4661 -0.1936 -0.1398 0.0158 -161.671 88 -24.4596 33.6995 (v h 120) (fp 0 0) (s 6046.18 0.862795 1 65352.7) (f r 10) (c 12 883 1154 0 1 2055 170 496 0 352 774 0)) 
					((r 3) 15 0x1 11.5706 24.6335 0.0588 -0.0685 -178.564 -1 -26.8416 57.4854 (v h 120) (fp 0 0) (s 6303.1 0.887456 1 52652.3) (f r 10) (c 18 900 1117 0 1 2036 169 484 0 352 719 0)) 
					((r 4) 7 0x1 12.3447 -14.1648 -0.1675 -0.0072 176.812 -42 -34.0527 3.5602 (v h 180) (fp 0 0) (s 7080.16 0.890715 1 63759.3) (f r 10) (c 4 775 1236 0 1 2016 120 346 0 355 743 0)) 
					((r 5) 10 0x1 0.1227 15.4198 -0.0235 -0.1548 -155.317 60 -8.5707 64.9937 (v h 120) (fp 0 0) (s 4472.41 0.906389 1 53280.9) (f r 10) (c 34 972 989 0 1 1996 190 537 0 352 743 0)) 
					((r 6) 16 0x1 -6.4949 10.3615 -0.0437 -0.0712 -174.547 -16 -18.1399 60.3474 (v h 60) (fp 0 0) (s 4689 0.80939 1 53361.6) (f r 10) (c 13 923 1038 0 1 1976 166 535 1 353 707 0)) 
					((r 7) 17 0x1 -6.2272 29.7163 -0.0541 -0.0636 -175.956 -5 -16.6666 78.7387 (v h 60) (fp 0 0) (s 4592.63 0.930527 1 51840.4) (f r 8) (c 6 1017 933 0 1 1954 187 539 0 352 763 0)) 
					((r 8) 5 0x1 -7.6736 -4.7233 -0.1857 -0.0847 172.734 -75 -41.044 32.3435 (v h 120) (fp 0 0) (s 5930.99 0.860854 1 53264.7) (f r 10) (c 7 900 1019 0 1 1937 145 446 1 353 730 0)) 
					((r 9) 13 0x1 -15.9451 32.3718 -0.2943 0.0219 178.219 65 -18.1092 82.0992 (v h 60) (fp 0 0) (s 4106.37 0.886257 1 57091.7) (f r 7) (c 33 934 949 0 1 1917 165 407 0 343 771 0)) 
					((r 10) 9 0x1 -17.6395 9.0974 -0.0202 -0.0143 178.1 -90 -53.5828 43.7323 (v h 60) (fp 0 0) (s 6224.02 0.975495 1 55348.7) (f r 8) (c 34 941 911 0 1 1898 179 444 2 343 745 0)) 
					((r 11) 14 0x1 -20.4537 20.1376 -0.3473 -0.2332 -143.046 90 -49.9065 60.2629 (v h 180) (fp 0 0) (s 5572.71 0.858335 1 57493.6) (f r 10) (c 32 954 885 0 1 1878 182 480 1 348 709 0))
				)
　　　　　　　------------------------------------
　　　　　　→msgメッセージには、team_graphicデータも格納される場合がある（5.3.2章を参照）
　　　　　　　------------------------------------
　　　　　　　(msg Time Board "Message"+)
　　　　　　　		Time ::= simulation cycle of rcssserver
　　　　　　　		Board ::= message board type id
　　　　　　　		Message ::= message string
　　　　　　　------------------------------------
　　　　　　　		Board							// 1:msg from referee, 2:msg from/to player
　　　　　　　------------------------------------
　　　　　　　例）
　　　　　　　(msg 6000 1 "(result 202307091024 HELIOS2023_1-vs-CYRUS_0)")
　　　　　　　------------------------------------
　　　　　　　例）
　　　　　　　(msg 
　　　　　　　		0 1 
　　　　　　　		"(team_graphic_l 
　　　　　　　			(
　　　　　　　				0 0 
　　　　　　　				"8 8 1 1" 
　　　　　　　				"  c None" 
　　　　　　　				"        " 
　　　　　　　				"        " 
　　　　　　　				"        " 
　　　　　　　				"        " 
　　　　　　　				"        " 
　　　　　　　				"        " 
　　　　　　　				"        " 
　　　　　　　				"        "
　　　　　　　			)
　　　　　　　		)"
　　　　　　　)
　　　　　　　------------------------------------
　　　　　■4.9.7章 The Soccerserver Parameters, Table4.22
　　　　　　■server_param, player_param
　　　　　■4.6章 Heterogeneous Players, Table4.17
　　　　　　■player_type
　　　　　■5.3.2章 Version 2
　　　　　　→team_graphic
　　　　　　　------------------------------------
　　　　　　　The team graphic format requires a 256x64 image to be broken up into 8x8 tiles and has the form:
　　　　　　　	(team_graphic_{l|r} 
　　　　　　　		(
　　　　　　　			<X> <Y> 
　　　　　　　			"<XPM line>" ... "<XPM line>"
　　　　　　　		)
　　　　　　　	)
　　　　　　　Where X and Y are the co-ordinates of the 8x8 tile in the complete 256x64 image, starting at 0 and ranging upto
　　　　　　　31 and 7 respectively. Each XPM line is a line from the 8x8 xpm tile.
　　　　　　　------------------------------------
　　　　　■C#のregexで処理できる？（サンプルコード書いてみる）
　　　　　　■server_param, player_param, player_type
　　　　　　　例）
　　　　　　　------------------------------------
　　　　　　　IsMatch(@"^\(server_param ") && IsMatch(@"\)$")	// 先頭と末尾をチェックし、中身を取り出す
　　　　　　　Matches(@"\(.+? .+?\)")							// "(key value)"の書式にマッチする部分を、すべて取り出す
　　　　　　　Split(" ")										// "("と")"を除外し、スペース文字で分割して、keyとvalueを取り出す
　　　　　　　------------------------------------
　　　　　　■msg
　　　　　　　------------------------------------
　　　　　　　IsMatch(@"^\(msg ") && IsMatch(@"\)$")			// 先頭と末尾をチェックし、中身を取り出す
　　　　　　　Matches(@"^\d+ \d+ ")								// 先頭のTimeとBoardを取り出し、、残りの文字列を取り出す
　　　　　　　Split(" ")										// スペース文字で分割して、数値に変換する
　　　　　　　IsMatch(@"^\"\(") && Matches(@"\"\(.+?\)\"")		// 「"(」と「)"」で囲まれた文字列を、すべて取り出す
　　　　　　　else Matches(@"\".+?\"")							// または、ダブルクォーテーションで囲まれた文字列を、すべて取り出す
　　　　　　　------------------------------------
　　　　　　■playmode
　　　　　　　------------------------------------
　　　　　　　IsMatch(@"^\(playmode ") && IsMatch(@"\)$")		// 先頭と末尾をチェックし、中身を取り出す
　　　　　　　Split(" ")										// スペース文字で分割して、TimeとPlayModeを取り出す
　　　　　　　------------------------------------
　　　　　　■team
　　　　　　　------------------------------------
　　　　　　　IsMatch(@"^\(team ") && IsMatch(@"\)$")			// 先頭と末尾をチェックし、中身を取り出す
　　　　　　　Split(" ")										// スペース文字で分割して、Time LeftName RightName LeftScore RightScoreを取り出す
　　　　　　　------------------------------------
　　　　　　■show
　　　　　　　------------------------------------
　　　　　　　IsMatch(@"^\(show ") && IsMatch(@"\)$")			// 先頭と末尾をチェックし、中身を取り出す
　　　　　　　IsMatch(@"^\d+ ")									// 先頭のTimeをチェックし、数値に変換し、残りの文字列を取り出す
　　　　　　　IsMatch(@"^\(\(b\) -?\d+(?:.\d+)? -?\d+(?:.\d+)? -?\d+(?:.\d+)? -?\d+(?:.\d+)?\)")
　　　　　　　													// Ballなら、「((b) 」と「)」で囲まれた文字列を取り出し、
　　　　　　　Split(" ")										// スペース文字で分割して、X Y VelX VelYを取り出す
　　　　　　　Matches(@"\(\((l|r) \d+\) \d+ 0x[0-9a-zA-Z]+ -?\d+(?:.\d+)? -?\d+(?:.\d+)? -?\d+(?:.\d+)? -?\d+(?:.\d+)? -?\d+(?:.\d+)? -?\d+(?:.\d+)?( -?\d+(?:.\d+)? -?\d+(?:.\d+)?)? \(v . \d+\)( \(fp -?\d+(?:.\d+)? -?\d+(?:.\d+)?\))? \(s -?\d+(?:.\d+)? -?\d+(?:.\d+)? -?\d+(?:.\d+)?( -?\d+(?:.\d+)?)?\)( \(f (l|r) \d+\))? \(c \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+( \d+)?\)\)")
　　　　　　　// 各Playerごとに、要素ごとにパース処理
　　　　　　　	// (Side Unum)
　　　　　　　	// Type State X Y VelX VelY Body Neck [PointX PointY]
　　　　　　　	// (v ViewQuality ViewWidth)
　　　　　　　	// [(fp dist dir)]
　　　　　　　	// (s *Stamina Effort Recovery [Capacity])
　　　　　　　	// [(f FocusSide FocusUnum)]
　　　　　　　	// (c KickCount DashCount TurnCount CatchCount MoveCount TurnNeckCount ChangeViewCount SayCount TackleCount PointtoCount AttentiontoCount [ChangeFocusCount])
　　　　　　　------------------------------------
　　　　■本アプリで使用する情報/パラメータ
　　　　　■server_param
　　　　　　■simulator_step（デフォルト：100ms）
　　　　　　　→１サイクルの時間
　　　　　　□half_time（デフォルト：300秒）
　　　　　　　→前後半で合計600秒＝5分＝6000サイクル
　　　　　　□nr_normal_halfs（デフォルト：2）
　　　　　　　→前後半の２つ
　　　　　　□nr_extra_halfs（デフォルト：2）
　　　　　　　→延長戦も前後半の２つ
　　　　　　■ball_size（デフォルト：0.085）
　　　　　　　→本アプリでは、影響ないので使用しない）
　　　　　　■goal_width（デフォルト：14.02m）
　　　　　　　→サッカーの公式サイズとは異なるので、実行時にゴールのサイズ変更
　　　　　　□player_size（デフォルト：0.3　半径）
　　　　　　　→プレイヤーの足元の扇形オブジェクトの土台となる円の半径に使う？→Colliderを使うならそれに。
　　　　　　■visible_angle（デフォルト：90度）
　　　　　　　→ここから実行時に、view_angle値が求まる。
　　　　　　　→視界の角度として、扇形オブジェクトやスポットライトの角度に利用する。
　　　　　　　→ViewWidth(narrow,normal,wide)との関係は？どっちが使われる！？（同期モードによる！？）
　　　　　　　　→本アプリでは、上記は初期値で、showメッセージの示す値を反映させればよいと思う。
　　　　　　■visible_distance（デフォルト：3m）
　　　　　　　→視界に関係なく、この距離内のオブジェクトは見える。
　　　　　　　→Nightモード時に、プレーヤーの頭上にもスポットライトを設置してこの範囲を照らす？（手間がかかる...）
　　　　　　　　（特に使用しない）
　　　　　■player_param
　　　　　　（特になし）
　　　　　■player_type（ログファイルに含まれれば、こちらの値を優先。試合途中でもplayer_typeは変更可能なので、パラメータも実行時に変わる。）
　　　　　　□player_size（デフォルト：0.3　半径）
　　　　　　　→（同、server_param）
　　　　　　■unum_far_length（デフォルト：20m）
　　　　　　　→背番号とチーム名の両方を認識できる距離。
　　　　　　　→本アプリでは、ナイトモード時のスポットライトが照らす距離として利用する。
　　　　　■msg
　　　　　　■refereeメッセージ
　　　　　　　→表示する？
　　　　　　　　（特に使用しない）
　　　　　　■team_graphic
　　　　　　　→チームのロゴマークを画面上に表示する？（X WindowのXPM画像フォーマット）
　　　　　　　　（特に使用しない）
　　　　　■playmode
　　　　　　■PlayMode
　　　　　　　→画面上に文字列を表示する。
　　　　　■team（ゲーム開始時、得点が入った時、ゲーム終了時など）
　　　　　　■LeftName RightName
　　　　　　　→画面上に、チーム名（左右）を表示する。
　　　　　　■LeftScore RightScore
　　　　　　　→画面上に、得点（左右）を表示する。
　　　　　■show
　　　　　　■Ball
　　　　　　　→ボールの表示座標（フィールド中央が(0,0)となる。右/下方向がプラス値。単位はm。）
　　　　　　　→105x68のピッチなので、X=(-52.5～+52.5)、Y=(-34.0～+34.0)となる。
　　　　　　■Player（Side[l|r],Unum[1-11]で個体を識別）
　　　　　　　■Type
　　　　　　　　→PlayerTypeID（player_typeのid値）
　　　　　　　■State
　　　　　　　　→pos_t構造体のenable、16進数(0x??)
　　　　　　　　→ビットのOR値（例：DISABLE=0x0, STAND=0x1, KICK=0x2, GOALIE=0x8, CATCH=0x10, TACKLE=0x1000, など）
　　　　　　　　　（5.3.1章を参照）
　　　　　　　■X,Y
　　　　　　　　→プレーヤーの表示座標（フィールド中央が(0,0)となる。右/下方向がプラス値。単位はm。）
　　　　　　　　→105x68のピッチなので、X=(-52.5～+52.5)、Y=(-34.0～+34.0)となる。
　　　　　　　■Body
　　　　　　　　→体の向き（-180～180 degrees）
　　　　　　　■Neck
　　　　　　　　→首の向き（-180～180 degrees）
　　　　　　　■[PointX PointY]
　　　　　　　　（Pointtoモデル：対象外とする）
　　　　　　　■(v ViewQuality ViewWidth)
　　　　　　　　→（非同期モードにおける）視界情報
　　　　　　　　→ViewQuality[h|l]
　　　　　　　　→ViewWidth[45|60|90|120|180]
　　　　　　　■[(fp dist dir)]
　　　　　　　　（FocusPoint：対象外とする）
　　　　　　　■(s *Stamina Effort Recovery [Capacity])
　　　　　　　　（Stamina：対象外とする）
　　　　　　　■[(f FocusSide FocusUnum)]
　　　　　　　　（Attensiontoモデル：対象外とする）
　　　　　　　■残りのCount系
　　　　　　　　（特になし）
　　　　■JSONスタイルのサポート追加（V19:game_log_version=-1で記録されたrcgログファイルの中身はPure JSON。ヘッダ行の"JSON"もなし。）
　　　　　■rcssserver-17.0.0
　　　　　　----------------------------------------
　　　　　　Support a JSON-based monitor protocol. If the monitor tries to
　　　　　　connect to the server by the client version 5, the received
　　　　　　messages will be JSON. The format of the game log file (.rcg) has
　　　　　　also followed the monitor protocol. If the value of
　　　　　　server::game_log_version is 6, the content of the recorded game
　　　　　　log is a JSON array except for the header line.
　　　　　　----------------------------------------
　　　　　■rcssserver-18.0.0
　　　　　　----------------------------------------
　　　　　　Change the version number of JSON-based monitor protocol to -1.
　　　　　　And, change the header line of JSON-based game log to "JSON". If
　　　　　　the value of server::game_log_version is -1, the content of the
　　　　　　recorded game log is a JSON array except for the header line.
　　　　　　----------------------------------------
　　　　　■rcssserver-19.0.0
　　　　　　----------------------------------------
　　　　　　Improve the JSON game log format. The format of each data has
　　　　　　been reviewed to make it easier to parse and the JSON rcg is
　　　　　　now recorded as a pure JSON file. The parser library is bundled
　　　　　　in rcssmonitor.
　　　　　　----------------------------------------
　　　　■検討課題
　　　　　Q:JSONスタイルのログファイルをサポートする？
　　　　　　→サポートしない
　～～～
　■Git
　　■TortoiseGitでローカルリポジトリを管理
　～～～
　■仕様検討
　　■アプリの名前、どうする？？？（Unityのプロジェクト名）
　　　→◎CrossView
　　　→　TacticalEye（戦略眼）
　　　→　Quinque(?)
　　■GUI実装（ボタン等）
　　　■画面デザイン、どうする？
　　　■コントロール、どうする？
　　　　→3Dで作る？
　　　　→ツールバーを作る？
　　■ログファイル(*.rcg)の仕様（RoboCupSim2Dの最新のマニュアルを参照、英文）
　　　■Version毎の差異
　　　■今回サポートするVersion
　　　　→Version4～6
　　■ログ再生時のタイムライン制御機能の実装
　　　■タイマーで実装？（サイクルmsec間隔で処理を実行、Pauseボタン押下ですぐ停止可能に。）
　　　　■MonoBehaviour.InvokeRepeating(), CancelInvoke()で定期間隔処理を管理。
　　　　■または、コルーチンで実装？
　　　■サイクル数をインクリメントしつつ、再生オブジェクトを処理していく。
　　　■Pause操作で、定期間隔処理をストップ。サイクル数はそのまま。
　　　■Prev,Next操作で、サイクル数を更新しつつ、再生オブジェクトの処理も実行。
　　　　■表示を即時更新、アクション表現は無し。
　　　■サイクル数を指定することで、再生位置を変更できるようにする。
　　　■内部ステータスは、Play,Pause,Stoppedで、Stoppedは再生処理が完了した状態。
　　■Playerはタックル可能？？？（UnityのAnimationでも再現する？）
　　　→できれば実現したい
　　■Ballの移動時、Ballを回転させる！？
　　　→（やりたい）
　　■プレーヤーの背番号をどのように表示する？
　　　→天頂カメラからも、一人称カメラからも見えるには？
　　■ズーム機能
　　　→ズームイン実行時、フィールド全体ではなく、ボールの映る一部の範囲だけが画面上に映るようにする！？（Y座標だけでなくXZ座標も動かす？）
　　■個別表示
　　　→一人称カメラよりも三人称カメラの方がよい？？？
　　　　→一人称でよい。プレーヤーの視界をそのまま表示したいから。
　　　　　→首の角度も知らないと表現できないし、視界を正確に表現できるかどうかもわからない。
　　　　　　→三人称カメラとする。
　　■RoboCup仮想フィールド上のFlagも表示？
　　　→表示ON/OFF操作を可能とする？　または、個別表示=ONの時のみ表示する？
　　■サイクル数を直接指定して、任意の再生位置にジャンプすることができる。
　　　→できれば実現したい
　　■ログファイル読み込み直後、プレーヤーがフィールド外から初期位置へ向けて走る演出を入れる？
　　　（時間差で選手一人ずつ走りこむ。NavMeshAgent利用してもいいかも。）
　　　→できれば実現したい
　　■再生速度を調節できるようにする！？（スロー再生や時短再生したい？）
　　　→できれば実現したい
　　■プレーヤーの3DModelを設定画面で選択可能にする？
　　　→できれば実現したい
　　■個別表示にて、プレーヤーの詳細情報（スタミナ値、座標、など）を表示領域内にUI表示する？
　　　→できれば実現したい
　　■アプリの起動引数で、ログファイルのパス指定も可能とする。
　　　→(T.B.D)
　　　　→非サポート
　■機能仕様
　　■画面
　　　■起動するとログ再生を行う為のメイン画面が表示される。（サッカーフィールド）
　　　　■プレーヤー(Maleモデル)がフィールド上を走ったりKickしたりするDemoあり。
　　　■メイン画面には、ログファイル選択ボタンを表示する。
　　　■UIからログファイル(*.rcg)の選択を実行する。
　　　　■ログファイルの選択は、Play操作がPlaying状態では実行不可とする。
　　　　■ファイルパス、またはURLの指定が可能とする。
　　　　■Browseボタン押下で、ファイル選択ダイアログを開く。
　　　　■OpenSiteボタン押下で、公式アーカイブのサイトをブラウザで開く。
　　　　■ファイル読み込み/ダウンロード中は、処理中アニメーションを画面中央に表示する。
　　　■ログファイルが正常に読み込まれると、再生可能状態となり、UIからPlay操作が可能となる。（Play,Pause,Prev,Next）
　　　■メイン画面には、チーム名/得点を表示する。（ファイル読み込み直後は、得点は試合結果を表示）
　　　■メイン画面には、PlayMode（before_kick_off,play_on,...）を表示する。
　　　　■FoulやOffside、Goal発生時は、得点ボードの背景色を変更する。（Foul=黄色、Offside=青、Goal=白）
　　　■メイン画面には、Play操作ボタン類、再生サイクル数表示（xxx/6000）、各種設定ボタンなどを表示する。
　　■Play操作
　　　■Playボタン押下で、ログの再生を開始する。ログファイルが示す内容でプレイヤーやボールの移動などが画面上で再現される。
　　　　■ファウル等で試合が止まっている間も、プレイヤーやボールは移動する場合がある。が、この間、サイクル数は変化しない。
　　　　■サイクル数は、欠番もある。（例：ハーフタイム直前の3000は、ログファイルに存在しない場合あり。）
　　　■Pauseボタン押下で、ログ再生が一時停止され、Play,Prev,Nextボタンが押下可能となる。
　　　■Prev,Nextボタン押下で、ログ再生位置を１サイクル前/後にステップ移動することができる。
　　　　■Prev,Nextボタンで移動する場合は、Animationは再生しないこととする。
　　　■ログの再生が最後まで到達すると、自動的にStopped（Pauseと同義）状態に遷移する。
　　　　■プレーヤーのアニメーションは、Idle状態になる。
　　　　■この状態でPlayボタン押下で、ログの最初から再生する。
　　　■サイクル数をユーザ入力することで、指定のサイクル位置にジャンプすることができる。
　　　　■指定のサイクル数の中の、先頭のログ（プレイヤーやボールの位置）にジャンプする。
　　　■PrevEvent/NextEventボタン押下で、1つ前/後のEvent(=PlayMode)位置にステップ移動することができる。
　　　　■PrevEventでは、現在のEventと同じ種類が連続している場合は、その連続の先頭のサイクル数に移動する。
　　　　　■連続の先頭位置にいる状態でPrevEventボタンが押下された場合には、１つ前のEventの先頭位置に移動する。
　　　　■NextEventでは、現在のEventとは異なるEventが発生する次のサイクル数の位置に、移動する。
　　■表示スタイル切替え
　　　■表示スタイルを切り替えるボタンを画面上に表示する。（全体→左プレイヤー１→左プレイヤー２→...→右プレイヤー11→全体に戻る？DropDown？）
　　　　■全体表示(斜め)→全体表示(天頂)→個別表示
　　　　■個別表示の表示領域内にDropDownを用意し、合計22種類（[L-01]～[L-11], [R-01]～[R-11]）から選択できる。
　　　■デフォルトはフィールド全体を画面上に表示する[全体表示]であり、切替えると[個別表示]となる。
　　　■個別表示では、指定されたプレイヤーの一人称（or三人称）視点の視界を表示する。
　　　　■画面分割して、左に全体、右に三人称を表示する。（または、Picture In Picture？）
　　　　■全体画面のズーム設定は、[全体表示](=100%)に固定される？（→ズーム可能とする）
　　　■個別表示では、指定されたプレイヤーの「左右チーム、背番号」を分割画面上に表示する。（→DropDownで）
　　　　■Flagもフィールド上に表示する。
　　　■プレーヤーの三人称表示上に、Informationとして「座標、向き、視角、スタミナ値など」の詳細情報を表示する。
　　　　■詳細情報は、画面下部のPlayInfoボタン押下により、表示/非表示を切り替えることができる。
　　　　■Flagも表示/非表示の対象とする。
　　■Nightモード切替え
　　　■Nightモードを切り替えるトグルボタンを画面上に表示する。
　　　■デフォルトは天頂照明でフィールド全体が明るく照らされているが、NightモードをOnにすると、天頂照明は消され（or暗くなり）、
　　　　各プレイヤーに設置したスポットライト照明が点灯する。スポットライトは、プレイヤーの視界範囲を表す。
　　　　■表示スタイルを［個別表示]にしている場合は、スポットライトは選択したプレーヤーにのみ設置される。
　　■ズーム機能
　　　■表示スタイルが[全体表示]の場合に有効？（→個別表示の左画面でも可）
　　　■ズーム操作（マウスホイール操作など）により、天頂カメラの高さ（Y座標）が移動する。（ズームインで低くなる）
　　　■ズームアウトで最も高い位置にカメラがある場合は、カメラの向きは常にフィールド中央とする。
　　（■ズームインを行っている場合には、カメラの向きは、現在のボール位置とする。（LookAtで指定）
　　　　これにより、フィールドを真上からではなく少し斜めから見ることとなる。（3Dが活きる！））
　　　　→カメラの角度は直下のままで、Auto-Scrollさせる。
　　　　→[全体表示(斜め)]を用意する？
　　■表示オブジェクト
　　　■固定：フィールド（芝生を表す黄緑色、ラインは白色）、フィールド外の余白エリアも用意する。
　　　■固定：Flag（Marker）
　　　■固定：ゴール（２個：横幅はServerParamsの内容によって実行時に調節される）
　　　■移動：ボール（１個）
　　　■移動：プレイヤー（背番号、(スタミナ値)、視界コーンを表す扇型オブジェクトで表現）、11人×２チーム（形か色違いで）
　　　　■背番号は、プレーヤーの3Dモデルの頭上に表示する。
　　　　　■個別表示では、選択中のプレーヤーの背番号は、黄色(Bold)で強調表示される。
　　　　■試合途中でプレイヤーの交代はある？（異なるplayer_typeへ変更時、パラメータは変わるが、背番号は変わらない。）
　　　■得点ボード（チーム名、得点）
　　　■team_graphicの表示
　　　　→非サポートとする。
　　　■審判/コーチのメッセージを表示？
　　　　→非サポートとする。
　■設計（段階的に作っていこう！）
　　■3D空間を用意
　　　■フィールド、カメラ、照明
　　　■ゴール（横幅サイズは、server_paramから決定）
　　　■Flag（Marker）
　　■2D部品を用意
　　　■チーム名/得点、PlayMode、再生サイクル数、など
　　　■ログファイル選択ボタン
　　　■GUIボタン類
　　■プレハブ化
　　　■Player(Field/GoalKeeper)
　　　　■背番号、扇形、スポットライト
　　　　■複数種類の3Dモデルを用意（選択可能に？）
　　　■Ball（？）
　　■ログファイルの読み込み
　　　■１ラインごとにパース処理
　　　　→rcssmonitor/rcss/rcgの実装を見ると、１ライン8Kのバッファで読み込んでいる。
　　　■パラメータ情報の構築
　　　　■server_param, player_param
　　　　　→Dictionary<string, string>に格納する？（使うときに文字列→int/float/string/bool[0|1]等に変換！？）
　　　　■player_type
　　　　　→Dictionary<int, Dictionary<string, string>>に格納する？（intはID値（例：0～17））
　　　■再生オブジェクトの構築
　　　　■playmode, team, msg, show
　　　■再生スケジュール構築
　　　　■Time順（例：0～6000等）に整列した再生オブジェクト（playmode, team, msg, showなど）
　　　　■1サイクル=100ms間隔（任意）で再生するスケジュールの実装
　　　　■Playerの3Dオブジェクトのインスタンス化（左右チーム、背番号）
　　　　■チーム名/得点の更新
　　　　■PlayMode文字列の更新
　　　　■Playerの3Dオブジェクトの位置/体の向き/首の向き/視覚コーン/Animationの更新
　　■Play,Pause,Prev,Next機能
　　■表示切替機能
　　■ナイトモード機能
　　■ズーム機能
　■実装/デバッグ
　　■GameBehaviourクラス
　　　■ログファイルの読み込み
　　　　■SimLogReaderクラスで、ログファイルの読み込み
　　　　■GameControl.Setup(SimLogData)で、画面のセットアップを行う
　　　　　→例）ゴールの横幅を更新する
　　　　　→例）Prefabsからプレーヤーをインスタンス化
　　　　　→例）ボールの初期位置
　　　　■SimLogPlayerクラスで、ログの再生操作
　　　■表示切替の操作
　　　■ナイトモードの操作
　　　■ズーム操作
　　■GameControlクラス
　　　■画面上のGameObjectたちの参照
　　　　→BallやGoal、インスタンス化されたプレーヤー達、画面上の表示アイテム、など
　　　■プレーヤーの3Dモデルを実行時にインスタンス化
　　　　■設定値
　　　　　■visible_angle, unum_far_length（PlayerTypeごと）
　　　　　　→ViewAngleの角度と距離の初期値として。
　　　　■プレーヤーのPrefab構成
　　　　　→Player
　　　　　　→BananaMan(仮)　※入れ替え可能に！
　　　　　　→ViewAngle
　　　　　　　→FanShape(動的生成)
　　　　　　　→Spot Light
　　■MovingBehaviourクラス（MonoBehaviourクラスから派生）
　　　■BallBehaviourクラス
　　　■PlayerBehaviourクラス
　　■FieldPlayerBehaviourクラス
　　■PlayerAnimBehaviourクラス
　　　→ゴールキーパーも含めてアニメーション対応
　　-----
　　□Utility
　　　□座標変換（ログ座標からVector3）
　　　□向き変換（ログ向きからVector3）
　　-----
　　■SimLogReaderクラス
　　　■内部データ（パース処理で生成した、ServerParams,PlayerParams,PlayerTypes,CycleObject）
　　　■Read(Uri)
　　　　→UnityWebRequest、DownloadHandlerScript派生クラスで逐次読み込み、内部バッファにデータをためる。
　　　　→受信データに対して、MemoryStream、StreamReader.ReadLine()で一行ずつ読んで、S式としてパース処理。
　　　　→一行に満たない残りのデータを残して、内部バッファを更新。次の受信時に、内部バッファにアペンドする。
　　　　　一行に満たない残りのデータに対してReadLine()しても文字列は取得できてしまうので、内部バッファの
　　　　　最後(StreamReader.EndOfStream)まで読み込んだのにパースエラーが発生した時は、データを次回まで残すと判定。
　　　■ParseLine()
　　　　■Parse_ServerParam()
　　　　■Parse_PlayerParam()
　　　　■Parse_PlayerType()
　　　　■Parse_Playmode()
　　　　■Parse_Team()
　　　　■Parse_Msg()
　　　　■Parse_Show()
　　■SimLogParserクラス
　　■ParamDictionaryクラス
　　　■Dictionary<string name, string value>
　　　■AddParam(string name, string value)
　　　■string GetStrParam(name, default="")
　　　■int    GetIntParam(name, default=0)
　　　■float  GetFloatParam(name, default=0.0f)
　　　■bool   GetBoolParam(name, default=false)
　　■PlayerTypesクラス
　　　■Dictionary<int id, PlayerType type>
　　　■ParamDictionary GetPlayerType(int id)
　　■CycleObjectクラス
　　　■ObjectType = { PlayMode, Team, Msg, Show, Ball, Player }
　　　■int Time
　　■PlayModeCycleObject : CycleObject
　　　■PlayMode
　　■TeamCycleObject : CycleObject
　　　■LeftName, RightName, LeftScore, RightScore
　　■MsgCycleObject : CycleObject
　　　■Board, List<Message>
　　■BallCycleObject : CycleObject
　　　■X, Y, VelX, VelY
　　■PlayerCycleObject : CycleObject
　　　■Side, Unum, Type, State, X, Y, ....etc
　　■ShowCycleObject : CycleObject
　　　■BallCycleObject ball
　　　■List<PlayerCycleObject> players
　　■CycleObjectDetails
　　　■List<PlayModeCycleObject>
　　　■List<TeamCycleObject>
　　　■List<MsgCycleObject>
　　　■List<BallCycleObject>
　　　■Dictionary<string side, Dictionary<int unum, List<PlayerCycleObject>>>
　　■SimLogDataクラス
　　　■ServerParams, PlayerParams, PlayerTypes
　　　■List<CycleObject>
　　　■CycleObjectDetails
　　-----
　　■SimLogPlayerクラス（ログファイルを読み込むたびにCleanup()して、Setup()し直す）
　　　■enum Status { Idle, Ready, Playing, Pause, Stopped }
　　　■Status変更イベント（ログが最後まで再生した旨などを、GameBehaviourクラスに伝える）
　　　■Cycle数変更イベント（画面上のサイクル数を更新する）
　　　■SimLogTimeline
　　　■Setup(GameControl game, SimLogData data)
　　　　→StatusがPlayingなら何もしない
　　　　→SimLogData.ServerParams等から、CycleStep数(simulator_step=100msec)を取得
　　　　→SimLogTimeline.Cleanup()
　　　　→内部で、CycleObjectからCycleAction, SimLogCycleを生成、SimLogTimelineに保持
　　　　→Indexを、Cycle=1の位置にセットする、Cycle数変更イベントを発行
　　　　→StatusをReadyにセットする、Status変更イベントを発行
　　　■Play()
　　　　→StatusがIdle,Playingなら何もしない
　　　　→StatusがStoppdなら、Indexを、Cycle=1の位置にセットする、Cycle数変更イベントを発行
　　　　→Index番目のPreProcess(CycleStep)を実行
　　　　→StatusをPlayingにセットする、Status変更イベントを発行
　　　　→繰り返しタイマー開始（DoProcess()を指定）
　　　■void DoProcess()
　　　　→StatusがPlayingでなければ何もしない
　　　　→Index番目のProcess(CycleStep)を実行
　　　　→Cycle数変更イベントを発行
　　　　　（常にCycle数が＋１されるとは限らない。同じCycle数が連続する場合あり。）
　　　　→タイムラインの最後まで進んだら、
　　　　　→タイマー停止
　　　　　→StatusをStoppedにセットする、Status変更イベントを発行
　　　　　→return
　　　　→タイマー停止フラグがONなら、
　　　　　→タイマー停止フラグをOFFする
　　　　　→タイマー停止
　　　　　→StatusをPauseにセットする、Status変更イベントを発行
　　　　　→return
　　　　→Index++
　　　　→Index番目が存在すれば、PreProcess(CycleStep)を実行
　　　■Pause()
　　　　→StatusがPlayingでなければ何もしない
　　　　→タイマー停止フラグを立てる
　　　■Next()
　　　　→StatusがPauseでなければ何もしない
　　　　→Indexを次のCycle位置に、Cycle数変更イベントを発行
　　　　→Index番目のPreProcess(0.0f)を実行
　　　　→Index番目のProcess(0.0f)を実行
　　　■Prev()
　　　　→StatusがPauseでなければ何もしない
　　　　→Indexを前のCycle位置に、Cycle数変更イベントを発行
　　　　→RestoreLastCycleAction(PlayMode)
　　　　→RestoreLastCycleAction(Team)
　　　　→RestoreLastCycleAction(Ball)
　　　　→RestoreLastCycleAction(Player)
　　　■Jump(int cycle)
　　　　→StatusがPauseでなければ何もしない
　　　　→Indexを指定のCycle位置に、Cycle数変更イベントを発行
　　　　→RestoreLastCycleAction(PlayMode)
　　　　→RestoreLastCycleAction(Team)
　　　　→RestoreLastCycleAction(Ball)
　　　　→RestoreLastCycleAction(Player)
　　　■RestoreLastCycleAction(ObjectType)
　　　　→Index位置からリストの先頭に向けてサーチし、最初に見つかった引数指定の種類のCycleActionに対して、
　　　　　→PreProcess(0.0f)を実行
　　　　　→Process(0.0f)を実行
　　■SimLogTimeline
　　　■int index = 0オリジン
　　　■List<SimLogCycle>
　　　■Add(CycleObject)
　　　　→CycleObjectのTypeから適切なCycleAction派生クラスのオブジェクトを生成し、リストに格納。
　　　　→挿入先は、SimLogCycleリストの末尾からTimeの一致で探せばよい。
　　　　→挿入先に、同じTypeのCycleObjectを扱うCycleActionがリストに既に格納済みならば、
　　　　　新しいSimLogCycleをリストに追加して、そちらに格納する。
　　　　　同じTimeのSimLogCycleが複数連続して格納されてもよい。
　　　　　ShowCycleObjectの場合は、Ballが既に格納済みかで判定する。
　　　　→ShowCycleObjectの場合は、Ballと各Player毎にCycleActionを生成してリストに格納する。
　　　■Cleanup()
　　■SimLogCycle
　　　■int Time
　　　■List<CycleAction> Actions
　　■CycleAction（CycleObjectクラスを食わせて生成？）
　　　→タイマースケジュールに登録する情報は、3Dモデル等を操作する情報（SimLogCycleクラス）
　　　　例）100msec後に、Playerを位置〇〇までスムーズに移動させる。（Update()メソッドで段階的に移動させる。）
　　　　例）（移動後、）Kickアクションを実行する。
　　　　例）BallやPlayer移動後、得点やPlayModeの表示更新を行うべき！？
　　　■CycleObjectへの参照
　　　■virtual void PreProcess(GameControl game, SimLogData data, float CycleStep=0.0f)
　　　　→例）CycleStepが>0なら、MoveTo(),TurnTo()を時間指定で実行。
　　　　→例）CycleStepが0なら、MoveTo(),TurnTo()を即時実行。
　　　■virtual void Process(GameControl game, SimLogData data, float CycleStep=0.0f)
　　　　→例）CycleStepが>0なら、アニメーションを実行。
　　　　→例）CycleStepが0なら、アニメーションは実行しない。
　　■PlayModeCycleAction : CycleAction
　　　→PlayModeの表示文字列を更新する
　　■TeamCycleAction : CycleAction
　　　→得点ボードの表示文字列を更新する
　（■MsgCycleAction : CycleAction）
　　　→（実装しない）
　　■BallCycleAction : CycleAction
　　　→ボールの位置を回転しながら移動させる
　　■PlayerCycleAction : CycleAction
　　　→プレーヤーの位置を移動させる（体の向き、首振り、ViewAngle、アニメーションも更新）
　　■CycleActionFactory
　　　■static CycleAction Create(CycleObject)
　～～～
　■TODO
　　■Football_1
　　　■S式を正規表現(regex)でパースできるか試す
　　　■AnimationのState切替
　　　　■Field Player(AnimatorController）
　　　　■Goal Keeper(AnimatorController）
　　　■首振り(IK)
　　■Football_2
　　　■BallやPlayerの移動を滑らかにするには？
　　　■足元の扇形オブジェクト（ViewAngle）
　　　■NightMode試作（照明）
　　■Football_3
　　　■UIのベース
　　　■ファイル選択、ファイルの逐次読み込み処理
　　　■ログファイルのパース処理
　　　■CycleObjectクラス、SimLogTimelineクラスの設計
　　　■ズーム試作（ボールを追視する。高さだけでなく、位置も移動させたほうがいい？）
　　　　■Auto-Scroll試作
　　　　■ZoomIn/Outボタンの追加
　　　■フレームレートを表示
　　　■画面デザインの見直し
　　　■BallBehaviourの適用
　　　■ボールが回転しない場合があるのは、なぜ？
　　　　→100msec間隔のタイマーで再生するには、処理が間に合わないのかも。。。！？
　　　　→再生スピードを落とすと、問題なかった。回転しているが人間の目の限界、か否かは不明。
　　　■再生スピードのコンボボックス
　　　■ゴールの幅を3Dモデルの幅を元に計算できるようにする
　　　■EXEでファイル読み込みエラーが発生する！（アプリ起動の一回目のみ）
　　　　→パース時に、バッファの残りデータを間違って完全な1行のshowと誤認。
　　　　　")"で終わっているが、実際は行の途中でバッファが終わっている！
　　　　　パース処理の残り文字列が存在するかチェックする、もしくはshowにPlayerが22人分パース出来ていない場合をエラーにする。
　　　　→PlayerのStateも、0x表記ではなく、ただの"0"の場合あり。
　　　　→msgのteam_graphicもバグあり。
　　■Football_4
　　　■サッカーフィールドを3Dオブジェクトで作る
　　　　■ProBuilderを導入？
　　　　　→断念。
　　　　　　テクスチャのPNGファイルを解像度を上げてアップデート。
　　　　　→テクスチャファイルのImportSettingsでMaxSize＝4096に。
　　　■Playerプレハブの試作（階層構造の見直し）
　　　　■Player(Empty)の下に3Dモデルを置く階層構造にする？（PlayerNeckBehaviourクラスを分割）
　　　■背番号の試作(2D - Text on Canvas)
　　　■4種類のプレーヤーから選択してインスタンス化
　　　■ゴールキーパーのAnimatorControllerの切替え
　　　　→Unumが11ごとにGoalie
　　　■NightMode
　　■Football_5
　　　■ViewMode(画面分割)
　　　　■全体表示も２種類（天頂カメラ、斜めカメラ）
　　　　■個別表示では、一人称カメラとしてのCameraBehaviourを実装
　　　　　→一人称だと、首の向きを考慮した視線をカメラの向きにセットする必要がある。首振りも頻繁なので不向き。
　　　　　→一人称は止めて、三人称カメラにする！
　　　　■ViewModeのドロップダウンコントロール（右画面内に設置）
　　　　　→EXEだと位置がずれてる（Pivot指定を修正）
　　■Football_5
　　　■Settings
　　■残作業チェック
　　　■機能仕様などの見直し
　　-----
　　■CrossView
　　　■GitHubにアカウント作って、バックアップしながら開発？
　　　■会社名（Suzu-ya Technologies）
　　　■手順
　　　　■Scene、UI、FPSViewer
　　　　■GameBehaviour
　　　　■ファイル選択
　　　　　■OpenSiteボタン押下で、公式アーカイブのサイトをブラウザで開く
　　　　■MainCameraのZoom機能
　　　　　■マウスホイールの検知は、GameBehaviourで行う。
　　　　■SimLogReader
　　　　■Prefabs（Player_01～04、Unum）
　　　　　■AnimatorController（FieldPlayer, GoalKeeper）
　　　　■GameControl
　　　　　■GameControl.Setup()にて、プレーヤーをインスタンス化
　　　　　　■visible_angle(ServerParams), unum_far_length（PlayerTypeごと）
　　　　　　　→ViewAngleの角度と距離の初期値として。
　　　　　　■State判定（GoalieならAnimatorControllerを切り替え）
　　　　■Settings
　　　　　■プレーヤー設定画面（3Dモデルの選択）
　　　　■SimLogPlayer
　　　　　■CycleActionの本実装
　　　　　　■Utilityの実装（座標、方向のログ系->Unity系変換）
　　　　　　■Prev,Next,Jumpボタン押下時は、アニメーションは実行しない
　　　　　　■アニメーションの実行タイミングの調整、Dash<->Idleの切替え判定
　　　　■ViewMode
　　　　　■三人称カメラ
　　　　　　→PersonalCameraBehaviour
　　　　　■個別表示を実行中は、左画面はカメラ位置固定？（ズーム/スクロールなし？）
　　　　　　→MainCameraBehaviourのアタッチで対応
　　　　　　　ただし、MainCameraBehaviourの改造（Screen.WidthにViewportRectを反映させて考える）
　　　　　■カメラごとに、Unum表示に対応（頭上の位置、フォントサイズを指定可能に）
　　　　　　→GameControlにEvent用意して各CameraがSubscribeする？
　　　　　　→PanelにRectMask2Dをアタッチして、はみ出て描画されないように制限
　　　　■NightMode
　　　　　■個別表示を実行中は、SpotLightは当該一人のみ。
　　　■できれば実現したいもの
　　　　■試合終了時、アニメーションをIdle()に。
　　　　■Panelの透明度を上げる
　　　　■DropDown
　　　　　→開いた時に、現在の選択アイテムまでスクロールしない件、マウスホイールでのスクロール感度の件
　　　　　　https://noracle.jp/unity-dropdown/
　　　　■Playerアニメーションの再生時間などを調整したい（特に、Tackle）
　　　　■ゴールキーパーのKick()アニメーションをFieldPlayerと同じに戻す？（ペナルティエリア外で手を使っているように見えてしまうから）
　　　　　→Catch直後のKickのみ、手で投げる方のアニメーションにする。
　　　　■Foulや得点時に、Panel_Topの背景色を変える
　　　　■個別表示の画面上に、Stamina値などの詳細情報を表示するか否か。（iボタン押下で、表示/非表示を切替え）
　　　　■個別表示を実行中は、Flag(Marker)オブジェクトを表示するか否か。（iボタン押下で、表示/非表示を切替え）
　　　　■個別表示にて、選択中PlayerのUnumは、色を変える。
　　　　■ファイル読み込み/ダウンロード中の、処理中アニメーション
　　　　■アプリ起動直後、フィールド上を選手がぐるぐる走っている演出！？
　　　　■URLにもBrowse...ボタンで、Application.OpenURL()する？
　　　　■Fieldの向き(左右)がわかりやすいような工夫（観客席などをピッチサイドに用意する？）
　　　　■NextEvent,PrevEventボタン（前後のPlayMode変化時点へのジャンプ）
　　　■動作テスト
　　　　■Cycle数とBallの位置、回転
　　　　■Cycle数とPlayerの位置、体の向き、首の向き、視界（角度、距離）
　　　　■Cycle数とPlayerのState（Animationの実行タイミング/スピードの妥当性は？？？）
　　　　■SimLogPlayer.Forward（Jumpと同様に複数Index飛ぶはずが、Restoreしてないけど大丈夫？）
　　　　　→バグ（Nextも飛ぶけど、間にshow要素しかないから大丈夫っぽい...）
　　　■見直し
　　　　■コード（リファクタリング）
　　　　■メモリリーク（Unityのプロファイリング機能を試す？）
　　　　■パフォーマンス（パース処理？）
　　　□ペンディング
　　　　□三人称視点の全画面＋Picture In Pictureの採用、3x2画面など
　　　　□デザイン見直し（ViewMode, NightModeのアイコン）
　　　　□もう1組、3Dモデルのペアを用意する。
　　　　□ハーフタイム時に、間を置く演出？
　　　　■プレーヤー登場シーン？（ログファイル読み込み完了後）
　　　　■Groundの下に、Island的なオブジェクト？
　　　　■team_graphic(XPS画像の表示)は、非サポート！？
　■リリース
　　■ReadMe.md
　　　■スクリーンショット
　　　■外部ファイル（FreeAsset,Download）を列挙する。
　　■GitHubリポジトリの設定
　　　→publicに変更するにあたり、機能のON/OFFを確認すること！（他人に許可するもの等）
　　■購入したアセットを含むUnityプロジェクトの公開
　　　→https://dkrevel.com/unity-explain/unity-asset-store-important-point/#google_vignette
　　　　『「アセットを取り出せる形」での公開、配布、販売×』
　　　　『逆に製作中のゲームのプロジェクトファイルにアセットを含めてネット上などにあげる行為はライセンス違反になります。』
　　　→https://thinkit.co.jp/story/2015/09/02/6362
　　　　『なお、Unityのプロジェクトでこれらのサービスを利用する際には、プライベートリポジトリが作成可能かどうかを確認してください。
　　　　　例えば、Unityのアセットストアで購入した有料のアセットを含むプロジェクトをパブリックリポジトリで全世界に公開してしまうと、
　　　　　購入したアセットが無料で全世界の人々にダウンロードされてしまいます。アセットストアで購入したものや、他の人に利用されたく
　　　　　ない素材がUnityプロジェクト内に含まれている場合は、必ずプライベートリポジトリを利用してください。』
　　■ライセンス
　　　■標準Unity Asset Store EULA
　　　　→https://unity.com/ja/legal/as-terms
　　　　→https://www.google.com/search?client=firefox-b-d&q=%E6%A8%99%E6%BA%96Unity+Asset+Store+EULA
　　　　→Unity Asset Storeを使う時注意すべき点
　　　　　https://dkrevel.com/unity-explain/unity-asset-store-important-point/
　　　■Free Assetのライセンスを明記！？
　　　　→商用ゲームにアセットストアのアセットを使用できますか？
　　　　　https://support.unity.com/hc/ja/articles/205623589-%E5%95%86%E7%94%A8%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AB%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%82%B9%E3%83%88%E3%82%A2%E3%81%AE%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B
　　　■ライセンス方式を検討（https://www.tohoho-web.com/ex/license.html）
　　　◎MIT License
　　　　BSD License
　　　　Apache License
　　　　Mozilla Public License
　　　　GPL, LGPL
　　　　Business Source License
　　　　→なぜ脱OSSが増えているのか？
　　　　　https://zenn.dev/koduki/articles/45f65a5318f019
　　■GitHubにアカウント(/リポジトリ)を用意
　　　■個人名？所属名？
　　　◎Suzu-ya Technologies
　　　　Muscle Brain Technologies
　　　　Courtyard Technologies
　　　　... etc
　　■アップロード（プッシュ）
　　　■publicリポジトリ
　　　　■公開用のソースツリーを用意
★　　　　→ExternalAssetsは除外（ファイルを一切含めない！）
　　　■Football_1～_6のソース？（コード見直し）
　　　　→無料アセットの都合上、公開は断念。
　■その他
　　■Unity Asset Storeで公開？
　　　→ペンディング
　　■バイナリ
　　　■InnoSetupでインストーラー？
　　　　→ZipでUnityのexeファイルを配るの止めたい。InnoSetupを使おう
　　　　　https://qiita.com/neon-izm/items/d200838cbb7875dde621
　　　　→ダウンロード（窓の杜）
　　　　　https://forest.watch.impress.co.jp/library/software/innosetup/
　　　■Microsoft Storeに本アプリを登録？
　　　　https://hatsune.hatenablog.jp/entry/2020/04/30/210700
　　　　→ペンディング
　■WebGL版
　　■ビルド設定
　　■サンプルURLのDropdownを用意
　□アナウンス（誰に？）
　　□Qiitaに開発日記、書く？
　　■WebGL版をGitHub Pagesで公開
　　　→URL欄にコピペできない。。。涙)
　　■Discord - RoboCup Soccer Simulation
　　□Unityコミュニティ？
　　□他のRoboCup関係？
	～～～
	Hello, I'm Japanese Software Engineer.
	
	I developed 3DLogPlayer, which plays log files for RoboCup Soccer Simulation(2D).
	I would be happy if many people try it.
	
	// GitHub
	https://github.com/SuzukiNene/CrossView3D
	
	// Windows Installer
	https://github.com/SuzukiNene/CrossView3D/releases
	
	// WebGL version on GitHub Pages
	https://suzukinene.github.io/CrossViewWeb/
	
	thank you
	～～～


////////////////////////////////////////////////////////////////////////////////////////////////////
// プロジェクト詳細

■CrossView
　■Project Settings
　　■Standalone
　　　→Player
　　　　→Company Name=Suzu-ya Technologies
　　　　→Product Name=CrossView
　　　　→Version=0.1
　　　　→Resolution
　　　　　→Fullscreen Mode=Windowed
　　　　　→Default Screen Width=1280
　　　　　→Default Screen Height=720
　　　　　→Resizable Window=ON
　　　　→Other
　　　　　→Configuration
　　　　　　→Api Compatibility Level=.NET 4.x
　　　→Quality
　　　　→Pixel Light Count>=23（Directional=1, Spot=22）
　　■WebGL
　　　→Player
　　　　→Other Settings
　　　　　→AutoGraphicsAPI=OFF
　　　　→Publishing Settings
　　　　　→Compression Format=Disabled
　■External Assets
　　■Free Asset系
　　　■Goal（Easy Primitive People）
　　　■Ball（FreeSportsKlt_SA）
　　　■Banana Man（Banana Yellow Games）
　　　　→Rig/Animation Type=Humanoid
　　　　→Rig/Avator Definition=Create From This Model
　　　■SpaceRobotKyle（UnityTechnologies）
　　　■HYPERCASUAL Female & Male（Downtown Game Studio）
　　　■FlatIcons（Heathen Engineering）
　　■Download系
　　　■Mixamo Animations
　　　　■Breathing Idle.fbx
　　　　　→Rig/AnimationType=Humanoid
　　　　　→LoopTime=ON
　　　　　→RootMotionNode=None
　　　　■Jog Forward.fbx
　　　　■Jog Backward.fbx
　　　　■Soccer Pass.fbx
　　　　　→Rig/AnimationType=Humanoid
　　　　　→LoopTime=OFF
　　　　　→RootMotionNode=RootTransform
　　　　■Soccer Tackle.fbx
　　　　■Goalkeeper Idle.fbx
　　　　■Goalkeeper Pass.fbx
　　　　■Goalkeeper Catch.fbx
　　　■StandaloneFileBrowser（UnityStandaloneFileBrowser）
　　　　→PackageManagerにて、VersionControlを削除すること。
　　　　→Buildオプションにて、[.NET4x]をターゲットに設定すること。
　　■etc
　　　→(T.B.D)
　■設計
　　■プロジェクト作成
　　■Scene
　　　■Cameras
　　　　■Main Camera
　　　　　→Pos=(0, 60, -45), Rot=(60, 0, 0)
　　　　　→Tag=MainCamera
　　　　■Sub Camera
　　　　　→Pos=(0, 70, 0), Rot=(90, 0, 0)
　　　　　→Tag=MainCamera
　　　　■Mini Camera
　　　　　→Pos=(0, 120, 0), Rot=(90, 0, 0)
　　　　　→Tag=MainCamera
　　　　　→Viewport Rect=(0, 0, 0.5, 1)
　　　　■Personal Camera
　　　　　→Pos=(0, 2, -50), Rot=(0, 0, 0)
　　　　　→Tag=Untagged
　　　　　→Viewport Rect=(0.5, 0, 0.5, 1)
　　　■Directional Light
　　　■Game
　　　　■GameControl
　　　　■LogReader
　　　　■LogPlayer
　　　■Environment
　　　　■Floor
　　　　　→(T.B.D)
　　　　■Ground(Cube)
　　　　　→Scale=(150, 2, 100)
　　　　　→Fieldの高さより、0.01低くする。
　　　　■Field(Plane)
　　　　　→Scale=(10.5, 1, 6.8)
　　　　　→フィールド中央を原点(0, 0, 0)とする。
　　　　■Goal
　　　　　→X(±52.45)
　　　　■Settings
　　　　　→(T.B.D)				// Playerモデル選択画面用、NaturePackで森林風景？
　　　■MovingObject
　　　　■Ball
　　　　　→Position=(0, 0.3, 0)
　　　　　→Scale=(3, 3, 3)
　　　■EventSystem
　　　■UI（子オブジェクトも含めて全て"UI"(5)レイヤーに設定）
　　　　■Canvas（Scale With Screen Size, 960x540）
　　　　　■Panel_Main
　　　　　　■Panel_Top
　　　　　　　→Height=30
　　　　　　■Panel_Middle
　　　　　　　→(T.B.D)
　　　　　　■Panel_Bottom
　　　　　　　→Height=30
　　　　　　■Panel_SelectFile
　　　　　　　→Animator=Dialog Animation
　　　　　　　■Panel_Base
　　　　　　　　→Height=260
　　　　　■Panel_Settings
　　■Materials
　　　■mat_Floor
　　　　→(T.B.D)
　　　■mat_Ground
　　　　→RGB(128, 100, 100, 255)
　　　■mat_Field
　　　　→PlaneにTextureを張る（手書き自作：tex_Field_5250x3400.png）
　　　■mat_FanShape
　　　　→RGB(0, 128, 255, 255)
　　　■tex_Field_5250x3400.png
　　　　→2048, High Quality
　　■Animations
　　　■Dialog
　　　　■AnimationDialog.cs
　　　　■Dialog Animation.controller
　　　　　→Entry,Hidden,Shownステータス
　　　　　→IsOpened(bool)
　　　　■Dialog Open.anim
　　　　　→Scale(0->1)
　　　　■Dialog Close.anim
　　　　　→Scale(1->0)
　　■Resources/Animators
　　　■FieldPlayer.controller
　　　　→IK Pass=ON
　　　　→Parameters
　　　　　→Dash(bool)
　　　　　→Back(bool)
　　　　　→Kick(trigger)
　　　　　→Tackle(trigger)
　　　　→State
　　　　　→Entry/Idle/Forward/Backword
　　　　　　Dash,Backで遷移する
　　　　　　HasExitTime=OFF
　　　　　→AnyState/Kick/Tackle/Exit
　　　　　　Kick,Tackleで遷移する
　　　　　　HasExitTime=OFF（Exitへの遷移時のみONで、ExitTime=0.4|0.5）
　　　■GoalKeeper.controller
　　　　→Parameters
　　　　　→Catch(trigger)
　　■Prefabs
　　　■Player_01
　　　　→FieldPlayerBehaviourをアタッチ
　　　　■<3Dモデル>
　　　　　→Scale=(1.7, 1.7, 1.7)
　　　　　→AnimatorController=FieldPlayer.controller、Avator=<付属のもの>
　　　　　→ApplyRootMotion=OFF
　　　　　→PlayerAnimBehaviourをアタッチ
　　　　■ViewAngle
　　　　　→ViewAngleBehaviourをアタッチ
　　　　　→Fan Shape Range=0.85
　　　　　→Material=mat_FanShape
　　　　　■Spot Light
　　　　　　→Height=0.05
　　　■Player_02
　　　■Player_03
　　　■Player_04
　　　■Unum(2D Text)
　　　　→30x30
　　　　→Text="00"
　　　　→FontSize=14
　　　　→Align=Center,Center
　　　　→Color=192,192,192
　　■Scripts
　　　■GameBehaviour
　　　■GameControl
　　　■MovingBehaviour : MonoBehaviour
　　　　→MoveTo()
　　　■BallBehaviour : MovingBehaviour
　　　　→RollTo()
　　　■PlayerBehaviour : MovingBehaviour
　　　　→TurnTo()
　　　■PlayerNeckBehaviour : MonoBehaviour
　　　　→TurnNeckTo()
　　　■PlayerAnimBehaviour : PlayerNeckBehaviour
　　　　→Start()
　　　　→FixedUpdate()
　　　　→OnAnimationIK()
　　　　→Idle(),Dash(),Back(),Kick(),Tackle(),Catch()
　　　■FieldPlayerBehaviour : PlayerBehaviour
　　　　→Playerオブジェクトにアタッチする
　　　　→Start()
　　　　→FixedUpdate()
　　　　→Idle(),Dash(),Back(),Kick(),Tackle(),Catch()
　　　■ViewAngleBehaviour
　　　　→TurnTo()
　　　　→ChangeAngle()
　　　■SelectFileDialog
　　　■SettingsBehaviour
　　　■MainCameraBehaviour
　　　　→ZoomIn/OutとAutoScroll
　　　■PersonalCameraBehaviour
　　　　→個別表示用の三人称カメラ
　　　■FPSViewer
　　　■SimLogフォルダ
　　　　■SimLogData
　　　　■SimLogReader
　　　　■SimLogParser
　　　　■SimLogPlayer
　　　　■SimLogTimeline


////////////////////////////////////////////////////////////////////////////////////////////////////
// 作業履歴

2024/06～
	C#とUnityの復習（書籍『Unity3Dゲーム開発ではじめるC#プログラミング』）
2024/07～
	仕様検討（RCSS2DのManualを読み、ログファイルの仕様やアプリの機能仕様を検討）

2024/08/09
	S式のパースコードを試作
2024/08/10
	S式のパースコードを試作
2024/08/11
	AnimatorController(FieldPlayer)の試作
2024/08/12
	AnimatorController(GoalKeeper)の試作
2024/08/13
	首振り実装のバグ取り
2024/08/17
	Visual Studio Community 2019をインストール、デバッグ環境
2024/08/18
	NavMeshで移動するモデルにAnimatorController(FieldPlayer)等を適用してみる
2024/08/19
	Football_2を新規作成
2024/08/20
	MovingObjectBehaviourの試作
2024/08/21
	MovingObjectBehaviourの試作
2024/08/22
	MovingObjectBehaviourの試作
2024/08/23
	MovingObjectBehaviourの試作
2024/08/24
	リファクタリング（MovingObjectBehaviour）
2024/08/25
	クラス構成の見直し（MovingObjectBehaviour→MovingBehaviour）
	Ballを回転させる（BallBehaviour）
2024/08/26
	バグ取り
	マウスクリックした位置にBallが移動するように試作
2024/08/27
	体と首の向きを滑らかに変更する（PlayerBehaviour.TurnTo()）
2024/08/28
	リファクタリング（アクセス識別子、メソッド名、引数の見直し）
2024/08/29
	リファクタリング（左右のクリックでMan/Ballを移動するように）
	調査（扇形メッシュの作成方法）
2024/08/30
	バグ修正（MoveTo, TurnTo, TurnNeckTo）
	調査（扇形メッシュの作成方法）
2024/08/31
	扇形とスポットライト（ViewAngleBehaviourを実装）
2024/09/01
	扇形とスポットライト（NightModeトグルボタンを実装）
2024/09/02
	扇形とスポットライト（TurnTo(), ChangeAngle()を実装）
	バグ修正（クリック時の移動とSpotlightの高さ）
2024/09/03
	設計（CycleObject, SimLogCycle）
2024/09/05
	調査（ダイアログの作り方）
2024/09/06
	AnimationDialog
	SelectFileDialog
2024/09/07
	UnityStandaloneFileBrowser
2024/09/08
	ビルド対応（UnityStandaloneFileBrowser）
2024/09/09
	SimLogReader
2024/09/10
	SimLogReader
2024/09/11
	リファクタリング（SimLogReader）
2024/09/12
	SimLogParser
2024/09/13
	SimLogParser, SimLogData
	SimLogTimeline, SimLogCycle
2024/09/14
	リファクタリング（SimLogData, SimLogTimeline）
2024/09/15
	SimLogPlayer, GameControl
2024/09/16
	SimLogTimelineのCycleActionをサンプル実装
	バグ修正（サイクル数=3000は存在しない。スキップする。）
2024/09/17
	ズーム試作
2024/09/20
	ズーム試作（Auto-Scroll）
	BallBehaviourの導入
2024/09/21
	ズーム試作（Auto-Scroll、画面中央の非スクロール領域をズーム倍率に応じて可変に）
	ZoomIn/Outボタンを追加
2024/09/22
	FPSViewerを追加
	再生などの操作をキーボードで可能に
2024/09/23
	再生スピードのドロップダウンを追加
2024/09/24
	バグ修正（パース処理）
2024/09/25
	バグ修正（パース処理）
	調査（Unity ProBuilder）
2024/09/26
	調査（Unity ProBuilder）
	サッカーフィールド用のテクスチャイメージをアップデート
2024/09/27
	バグ修正（パース処理で、Type,Stateの数値変換が抜けていた）
	Playerプレハブの試作
2024/09/29
	4種類のモデルから選択できるように
2024/09/30
	Playerプレハブの階層構造の見直し
	NightModeの追加
	ゴールキーパーは、AnimatorControllerを実行時に切り替え
2024/10/01
	画面分割
	三人称カメラ
2024/10/02
	GitHubアカウントを作成
	CrossViewプロジェクト作成
2024/10/03
	移行（Scene, UI）
	移行（ズーム機能）
	移行（ファイル選択）
2024/10/04
	移行（SimLogReader）
	Settings画面の作成
2024/10/05
	移行（SimLogPlayer）
	バグ修正（ViewAngleのMeshによる、メモリリーク）
2024/10/06
	ゲーム終了時に、アニメーションをIdle状態にする
2024/10/08
	Playerプレハブの更新（Male,Femaleをデフォルトに。BananaMan(No Material）はRobot Kyleに変更
	バグ修正（ゲーム終了時に、アニメーションをIdle状態にする）
2024/10/10
	移行（ViewMode）
	バグ修正（ViewMode）
2024/10/11
	移行（NightMode）
2024/10/12
	アニメーション再生時間の調整（再生スピードに合わせてアニメーションの速度も合わせる）
2024/10/13
	アニメーション再生時間の調整（Trigger系のAnimationClip自体、Speedを2に変更）
2024/10/14
	キー操作の追加（"v", "n", "s"　→　ViewMode,NightMode,Settings）
2024/10/15
	Informationの表示機能
2024/10/16
	Flag(Marker)の表示機能
	個別表示で選択プレーヤーのUnumを黄色(Bold)にする
2024/10/17
	処理中アニメーション
	起動後のデモアニメーションの導入
	ファイル選択ダイアログにOpenSiteボタンを追加
	バグ修正（Playerの座標が変化ない時に、Body,Neck,ViewAngleの変更処理が実行されていなかった）
2024/10/18
	PrevEvent/NextEventボタンの追加
2024/10/19
	Script/Utilityフォルダの作成
	Demoに2人目を追加
	リファクタリング（得点ボードの背景色）
2024/10/20
	ReadMe.md
2024/10/21
	ReadMe.md
2024/10/24
	バグ修正（Next,NextEvent押下時の処理）
	インストーラの作成
	公開用のリポジトリを用意（CrossView3D：ExternalAssetsフォルダ以下は空っぽにする）
	リリース（https://github.com/SuzukiNene/CrossView3D）
	アナウンス（Qiita：3DLogPlayerを作ってみて学んだこと）
2024/10/25
	WebGL版のビルド
	GitHub Pagesで公開
2024/10/28
	Discordに投稿
2024/11/07
	開発メモを追加（HowToCreate_Player_00_Prefab.md, FileList.txt）
2024/11/11
	Qiita：開発日記 #0
2024/11/12
	Qiita：開発日記 #1
	Qiita：開発日記 #2
2024/11/14
	公式アーカイブのログファイルのURLが変更されている！！！（WebGL版の実装に影響あり）★
2024/11/17
	Qiita：開発日記 #3
2024/11/21
	Qiita：開発日記 #4
2024/11/22
	Qiita：開発日記 #5
	Qiita：開発日記 #6
2024/11/24
	Qiita：開発日記 #7 (最終回)
2024/11/30
	WebGL版のアップデート（Sample(3)のURL文字列）
2024/11/
	
~~~