【VRChat】クライミングシステムのActionメモ

##この記事について
Cyan Climbing Systemを使うためにプレハブを理解する必要がありました。
その際に書いたActionのメモを載せておきます。

必須:EasyEventsEditor

## オブジェクト構成
- PlayerCamera:プレイヤーのカメラ位置をトラッキングするためのオブジェクト
    - PositionLeft(Right):左右の球を固定する位置
    - SurfaceNormal:　←何？
		- CenterRay:
			- Center
				- Lookup:
					- LppkRight:
						- SurfaceOffset:
		- UpRay:
			- Up:
		- RightRay:
			- Right:

- PlayerBase:
	- CameraPosition:PlayerCameraへReset
		- TmpCameraPosition:PlayerCamera、CameraPositionへReset。OffsetをFollow
			- PlayerBase:UpdateClimbPositionへReset
			- PlayerSpace:UpdateClimbPositionへReset
		- BaseCollider:コライダー。これがないと一度地面まで落ちないと位置をアップデートできず、ジャンプするような動きになる。PlayerBaseをFollow

- PositionChanges:
	- LockedPosition:PickupR(L)をFpllow　クライミングを起動した瞬間の手の位置を保持し続ける
	- Origin:TmpCameraPosition、PickupR(L)をFollow、現在の手の位置を表す
		- Offset:LockedPositionをFollow、クライミングを起動した瞬間の手の位置を表す
	- Hands:
		- PickupR(L):ピックアップ可、PositionRight、LookRightをFollow、AutoCamとは？
			- VisualsR:見た目(半透明の球)を格納
			- ClimbDetectorR:コライダーを持つ。

- Events:イベントを格納する。自身もイベント持ち
	- OnStart(Stop)ClimbingEvents:クライミングの開始(終了)時に動かしたいイベントを入れる。未使用
	- UpdateClimbingEvents:メイン処理。アクティブ化している間1フレーム毎(?)に起動する
	- UpdatePlayerCamera:ToyBoxと同じもの。ButtonでPlayerCameraの位置をプレイヤーカメラに合わせる。常時起動している。
	- SetupSurfaceNormal:不明
	- UpdateSurfaceNormal:不明
	- EventsRight(Left)Hand:各イベント時に発火するトリガを持つ。未使用
		- StartClombingR:
		- UpdateClimbingR:
		- CleanupR:
		- OnDropR:
		- OnPickupR:
	- DesctopControls:デスクトップモード用イベント。今回は触れない


## コンポーネントについて
Reset PositionのAlign Room To Destination:テレポートの際にプレイヤーを基準とするか、プレイエリアの原点を基準とするかの違い
ResetPositionはPositionとRotationともに合わせる。FollowはPositionのみ合わせる。


## 具体的な動作
★が次の動作へつながる部分

①PickupRをピックアップする
- PickupRのOnpickUpトリガーによりOnpickupRをアクティブ化

- OnpickupRのButtonがAnimatorのEventSelectOnceにより発火
	- 自身を非アクティブ化
	- PickupRのFollow解除(頭横の固定位置から外れる)
	- VisualsRをアクティブ化(半透明の球が見える)
	- ★CleanupRをアクティブ化、ボタンをPress()　←CleanupR自身に発火用AnimatiorがついているのにPress()する意味は？
	- 未使用(EventsRight(Left)Handのピックアップ時イベントを発火)

- CleanupRのButtonが発火
	- 自身を非アクティブ化
	- UpdateClimbingRのButtonを無効化
	- EventsのAnimatiorのRightトリガをFalseへ、Update二回で状態を更新
	- DesctopStopRのボタンをPress()　←今回は追わない
	- 未使用(EventsRight(Left)Handのクリーンアップ時イベントを発火)


②PickupRのUseキーを押下
- ClimbDetectorRをアクティブ化

- ClimbDetectorRのActivateトリガが発火
	- 自身のコライダーをアクティブ化
	0.5秒後に自身のコライダーを非アクティブ化
	- 未使用(EventsRight(Left)Handのトライ時イベントを発火)
	- (多分)★非アクティブまでの間に何かしらのオブジェクトにコライダーが触れていたらActivateTriggerによってStartClimbingRがアクティブ化
		→onEnterTriggerを使わない理由は？登れるオブジェクトと登れないオブジェクトの判別をどこでしているのか、、？

- StartClimbingRのButtonがAnimatorのEventSelectOnceにより発火
	- 自身を非アクティブ化
	- LockedPositionをPositionChangesの子に設定
	- LockedPositionをPickupRの位置に更新
	- CleanupLをアクティブ化、ButtonをPress()
	- UpdateClimbingRのボタンを有効化　←これによってメイン処理中のベクトル生成(R)が動くようになる
	- ★EventsのAnimatiorのRightトリガをTrueへ、Update二回で状態を更新
	- ★(メイン処理内に記載)UpdateClimbingRのボタンをPress()
	- DesctopStartRのボタンをPress()　←今回は追わない
	- PickupRのPlayHaptics()でコントローラーを振動させる
	- 未使用(EventsRight(Left)Handのクライミング開始時イベントを発火)

- EventsのAnimatiorがStartへ遷移
	- ★自身のStartClimbingのTriggerを叩く

- EventsのStartClimbingが発火
	- 未使用(OnStartClimbingEventsをアクティブ化)
	- BaseColliderのコライダーをアクティブ化
	- ★UpdateClimbingPositionをアクティブ化

##### ～メイン処理開始(1フレーム毎に繰り返される)～

- UpdateClimbingPositionのAnimation、EventSelectorAlwaysにより自身のButtonが発火
	- PlayerCameraの位置を現在のカメラ位置へアップデート
	- CameraPositionをPlayerCameraへReset
	- UpdateClimbingPositionのTeleportPlayerBaseトリガが発火。プレーヤーをAlign Room To Destinationオフで自身の位置へテレポートさせる
	- PlayerCameraの位置を現在のカメラ位置へアップデート
	- TmpCameraPositionをPlayerCameraへReset
	- PlayerBaseをUpdateClimbPosition(プレイヤーの足元座標)へReset
	- UpdateClimbingPositionのTeleportPlaySpaseトリガが発火。プレーヤーをAlign Room To Destinationオンで自身の位置へテレポートさせる
	- PlayerCameraの位置を現在のカメラ位置へアップデート
	- TmpCameraPositionをPlayerCameraへReset
	- PlayspaceをUpdateClimbPosition(プレイスペースの原点座標)へReset
		- ここまでで
			- PlayerCamera:元居た場所のプレイヤーのカメラ座標	
			- TmpCameraPositionをカメラの位置として相対的に
				- PlayerBase:プレイヤーの足元位置
				- Playspaceプレイスペースの原点位置  
		の状態を取得
	- TmpCameraPositionをCameraPosition(元居た場所)へReset
	- ★UpdateClimbingR(L)のButtonを発火
	- UpdateClimbingPositionのTeleportBackPlayspaceトリガが発火。プレーヤーをAlign Room To DestinationオンでPlayspaceへテレポートさせる
	- BaseColliderをPlayerBaseの位置に更新
	- PlayerCameraの位置を現在のカメラ位置へアップデート
	- Desctop用のOriginの位置を更新　←今回は追わない

- UpdateClimbingR(L)のButtonが発火　←プレイヤーの位置をずらすためのベクトル生成、FollowTargetを使うことでObjectの向きにかかわらず相対位置だけ取得できる。
	- OriginをPickupR(L)の位置に更新
		- 現在の右手の位置
	- OffsetをLockedPositionの位置に更新
		- Useキーを押した瞬間の右手の位置
	- OriginをTmpCameraPositionの位置に更新
	- TmpCameraPositionをOffsetの位置に更新
		- LockedPositionとその後の右手の相対位置の逆分カメラが移動する。
※それぞれのオブジェクトがどこを表すか要分析

##### ～メイン処理終了～


③PickupRのUseキーを解除
- CleanupRのButtonが発火
	- EventsのAnimatiorがStopに遷移し自身のStopClimbingが発火
	- 未使用(OnStopClimbingEventsをアクティブ化)
	- 自身のAnimatiorがWait状態に
	- BaseColliderのコライダーが非アクティブ化
	- UpdateClimbingPositionが非アクティブ化
	

## 得た知識
Follow Targetはコンポーネントが非アクティブでもButtonのUpdate()から起動できる

## 残った疑問
ClimbDetectorRのActivateTriggerを使っている理由、つかめる対象を判別している方法

PlayerBaseだけで処理を完結させずにPlayspaceをとっている理由
　→最後の元に戻すときにAlign Room To Destinationオフで飛ばせばPlayerBaseだけで処理できるのでは？

SurfaceNormal周りが謎のまま　デスクトップモードで使うのだろうか
PickupR(L)についたAutoCamについても同上