malaybaku / VMagicMirror

VRM Software for Windows to move avatar with minimal devices.
https://malaybaku.github.io/VMagicMirror/
MIT License
468 stars 38 forks source link

コードが読みづらい #75

Closed malaybaku closed 5 years ago

malaybaku commented 5 years ago

概要

コードが汚いせいで新機能の導入に支障が出ている。WPFのレポジトリはそこまででもないが、Unity側のソースコードで傾向が顕著なので直す。リファクタリングの意義づけは以下4点。

指針

type_to_motionブランチがdevelopブランチにマージされた時点でリファクタリング専用のブランチを作り、以下を考慮してリファクタリングする。

モーションのステート管理

モーションのステート管理クラスを1つにする。現状ではモーション入力の例として

などが混在しており、いつどの入力を通すか、無効化したときにリセットすべき値は何か、とかが指定しづらいため、いい感じに直す。

表情のステート管理

モーションほどではないが、表情も入力源が多くてゴチャゴチャしているため、ステート管理をちゃんとやる。

なお、本修正を通じてBlendShapeProxy.ImmediatelySetValueの呼び出しは排除する。

VRMロード処理

VRMをロード/アンロードする際のイベントで大量にSerializeFieldが差し込まれててダサいのでどうにかする。

DlibFaceLandmarkDetector/FinalIK依存コードの切り出し

当初VRMLoadControllerHelper.csに切り離していたような有償アセット利用コードの分割をきっちりやる。

コード切り出しの目的は無課金ビルドの見通しを良くすることなので、partialで依存部分が別スクリプトファイルに切り離されている程度でもよい。

malaybaku commented 5 years ago

VRMのロード処理について

手元実装コンポーネントのうち、VRMに対してAddComponentするものが5個くらいあるが、これは廃止する。追加していいのは以下4つに絞る。

後者2つはFinalIK依存なので、今までどおり実装はヘルパークラスに分離する。

malaybaku commented 5 years ago

82 までで一旦区切る。全部は対応できてないが、コードの方向性が良くなったのでヨシとする。

顔トラッキングについて

顔トラッキングは位置づけとしてゲームパッド入力などと同列の「詳細が隠された外部入力」という位置づけに立て直し、BlendShapeとのつながりを弱めた。もともとモーション制御にも使っていたため、この変更で使われ方と一貫した設計になった。

モーションのステート管理

BlendShapeについて

ちょっとキレイにしたが、モーションほど込み入ってなかったので適当。

Word To Motionについて

通常のモーションおよびBlendShape制御をオーバーライドしていいクラスとして正式に位置付けた。

VRMロードについて

VRMLoadControllerで定義されていたSerializeFieldを大幅に減らし、代わりにVRMのロード/破棄に関するUnityEventを公開して同等の処理を行うようにした。結果としてコード上の結合度が下がった。

ただし、これはこれでScene上で設定するイベントリスナの汚い(しかもトレーサビリティもやや悪い)ので、Zenjectとかを使った依存注入を検討した方がいいかも。