Closed malaybaku closed 5 years ago
手元実装コンポーネントのうち、VRMに対してAddComponent
するものが5個くらいあるが、これは廃止する。追加していいのは以下4つに絞る。
HumanoidPoseTransfer
Simple Animation
FullBodyBipedIK
LookAtIK
後者2つはFinalIK依存なので、今までどおり実装はヘルパークラスに分離する。
顔トラッキングは位置づけとしてゲームパッド入力などと同列の「詳細が隠された外部入力」という位置づけに立て直し、BlendShapeとのつながりを弱めた。もともとモーション制御にも使っていたため、この変更で使われ方と一貫した設計になった。
InputDeviceToMotion
クラスが細かく解体された。Vector3
で露出させる方向に変更した。これによりステートライクな管理と相性が良くなった。ただし、現在は完璧にステート管理しているわけではない。ちょっとキレイにしたが、モーションほど込み入ってなかったので適当。
通常のモーションおよびBlendShape制御をオーバーライドしていいクラスとして正式に位置付けた。
VRMLoadController
で定義されていたSerializeField
を大幅に減らし、代わりにVRMのロード/破棄に関するUnityEvent
を公開して同等の処理を行うようにした。結果としてコード上の結合度が下がった。
ただし、これはこれでScene上で設定するイベントリスナの汚い(しかもトレーサビリティもやや悪い)ので、Zenjectとかを使った依存注入を検討した方がいいかも。
概要
コードが汚いせいで新機能の導入に支障が出ている。WPFのレポジトリはそこまででもないが、Unity側のソースコードで傾向が顕著なので直す。リファクタリングの意義づけは以下4点。
指針
type_to_motionブランチがdevelopブランチにマージされた時点でリファクタリング専用のブランチを作り、以下を考慮してリファクタリングする。
モーションのステート管理
モーションのステート管理クラスを1つにする。現状ではモーション入力の例として
などが混在しており、いつどの入力を通すか、無効化したときにリセットすべき値は何か、とかが指定しづらいため、いい感じに直す。
表情のステート管理
モーションほどではないが、表情も入力源が多くてゴチャゴチャしているため、ステート管理をちゃんとやる。
なお、本修正を通じて
BlendShapeProxy.ImmediatelySetValue
の呼び出しは排除する。VRMロード処理
VRMをロード/アンロードする際のイベントで大量にSerializeFieldが差し込まれててダサいのでどうにかする。
DlibFaceLandmarkDetector/FinalIK依存コードの切り出し
当初
VRMLoadControllerHelper.cs
に切り離していたような有償アセット利用コードの分割をきっちりやる。コード切り出しの目的は無課金ビルドの見通しを良くすることなので、
partial
で依存部分が別スクリプトファイルに切り離されている程度でもよい。