$30 off During Our Annual Pro Sale. View Details »

Animator As Code As JSON As Model

Animator As Code As JSON As Model

Animator As Code のコードを Rust から作るために JSON を Blender から吐く話です。まわりくどすぎるだろ

https://github.com/kb10uy/sk2aac

Yū Kobayashi

July 31, 2022
Tweet

More Decks by Yū Kobayashi

Other Decks in Programming

Transcript

  1. Animator As Code As JSON As Model kb10uy / 日下夏稀

  2. はじめに (02:32:25) • 各スライドを書きはじめた時刻を見出しに付与しています • もう 19 時間しかないですね • まず寝ます

  3. 自己紹介 (02:33:19) • kb10uy / 日下夏稀 • VRC-LT 登壇 2

    回目 • Rust や HLSL を書いたり、 オンゲキ15.7 や Arcaea11.6 をプレイしている ◦ どっちもデカいアプデとエンディングがやってきて大変 • Skeb 依頼納品数が 30 を超えた(今朝も納品された) • Pixel 6a を買った
  4. 動機 (12:33:26)

  5. 僕のアバターセットアップについて (12:33:47) • 表情はハンドサインではなく Action Menu からパーツごとに調整可能なように設計 している • つまり

    Animator Controller のレイヤーが表情パーツ単位になる • 更に BlendShape 単位で Animation が生える • するとどうなる?
  6. 誰か助けてください (12:35:01) • これら全て手作業で作っています • 1 アバター あたり 2~3 時間

    かかる
  7. どう考えても自動化できる (12:47:05) • BlendShape それぞれに対応する安全な名前の Animation を作る • Expression Parameter

    をパーツごとに割り当てる • Int/Bool に応じて Enter → Disabled → Enabled (No.*) → Exit という 流れの Animator Layer を作る • 助けて Haï えも~ん!
  8. Animator as Code (13:02:19) • Haï~ 氏による UnityEditor 拡張 •

    "Fluent" に Animator Controller などの 構成を記述できる • むしろ今までなんで使ってなかったんだよ と言われればそうなんだが……
  9. UnityEditor の C# コードを書きたくない (13:04:38) • UI パネルとか作るのを考えるとダルそうすぎてやりたくなかった • あと一旦

    BlendShape とパーツ名の対応の情報を書き出してもう一回 JSON か何 かで戻してあげる必要があるのも美しくない • 微妙に古い C# を書きたくない • さてどうしよう?
  10. そうだ! Blender 拡張だ! (13:07:07) • 改変をするときは毎回 Blender を経由している • ではその時点で

    Shape Key の情報を出力してあげればいいのではないか? • まあオブジェクトのコンテキストメニュー生やすぐらいだし簡単やろ(適当) • でも入力・生成部分で C# 書かなきゃいけないのは変わらなくない?
  11. そうだ! Rust だ! (13:08:35) • もはや Rust を書きたいだけでは? • Blender

    で出力した情報を Rust で書いた専用アプリに食わせる • 専用アプリから、「Animator as Code を使って Animator Controller を構築する C# コード」を吐かせる • UnityEditor C# と格闘しなくて済む!やったね!(本当かな?)
  12. 今から実装します (13:10:28)

  13. Blender プラグインができました (15:26:20) • 選択したオブジェクトの Shape Keys をいい感じの構造 の JSON

    にしてログメッセージに出力する • もはやファイルに出力すらしない • アニメーション名やグループの編集だけは手動でやるし かない ◦ 何らかのヒューリスティックな補助は実装できるかも • あとはいい感じに階層構造を調整 • ちなみに顔のオブジェクトだけで数百行の JSON が生成 されます
  14. 対応する serde 用構造体が定義できた (16:58:21) • まあこれは大体書くだけ • serde は本当によくできたシリアライゼーションフ レームワークなので他言語メインの人も適宜調べて

    みてね • #[serde(flatten)] 本当にありがとう
  15. AAC の生成メイン部分が生成できた (18:42:45)

  16. まあこれだけでは動きませんが (18:43:30) • Create() するべき中身だけ書いているので実際に MonoBehaviour として動かす にはもうちょっと細工が必要 • でも多分動くでしょう(?)

    • さすがにこれ以上動作を詰めてると間に合わないか?
  17. 間に合った (19:39:07)

  18. まとめ • やたら迂回して AnimatorController の生成を楽にした • 人間やれば割と間に合う • GitHub: kb10uy/sk2aac