noir_neo’s blog

140字より長い文章を投稿するところ

趣味でまたアバターアプリを作り始めた

この記事は クラスター Advent Calendar 2023 9日目の記事です。

8日目はよしおかさんの「デザインタスクの切り方を変えてみた話」でした。計測・分解・完了条件と抽象化するとデザインもエンジニアリングも共通ですね!

気が付けば入社5周年が過ぎ6年目に突入していたねおりんです。Engineering Manager をやっています。

この記事は業務とは一切関係ない趣味開発の話です。

概要

これです。

github.com

hatracker とは (おさらい)

hatracker は iOS 向けアバターカメラアプリです。iPhone だけで手も動いて、写真と動画が撮れて、VMCプロトコルも送れます。

2020年の終わり頃にベータテストを開始してからまもなく3年ですが、まだベータをやっています。 TestFlight の招待リンクを配布しているので、興味のある方は Discord サーバーに入ってみてください。

discord.gg

自分がほしい機能と、誰かに使ってほしい機能を、気が向いたときに細々と作っています。

hatbor とは 🆕

Windows / mac 向けアバターアプリです。

  • VMC プロトコル受信専用 (hatracker など他アプリと連携して使う想定)
  • VRM 1.0 対応
  • Spout / Syphon 出力 (OBSに背景透過で送れる)

hatracker Windows / mac 版にあった機能を再実装し、とりあえずOSSとして公開した形です。 Ultraleap 対応とかはそのうち気が向いたらやります。UIもそのうち整えます。

ビルドはとりあえず https://github.com/noir-neo/hatbor/releases に置いておきました。

なぜ hatbor を作り始めたか

hatracker の Windows / mac 版を粉砕したくなった

そもそも hatracker の Windows / mac 版は、 iOS 版でトラッキングした姿勢を受け取りレンダリングすることで、低レイテンシー・高画質な映像をOBSなどへ送出するために存在していました。

しかし開発が進み iOS 版の機能を追加していく中で、単一のコードベースで複数プラットフォームに対応するめんどくささが旨味を上回ってきました。 つまり、 Windows / mac 版をメンテしたくなくなってきました。

また、高機能でクオリティの高い Windows 向けアバターアプリが増えてきた中で、別に私が作らなくてもいいな〜と思えてきました。

そこでiOS版にかねてより要望のあったオープンな姿勢送信プロトコルへの対応を行った上で、 Windows 版は粉砕することを考え始めます。

mac 向けアバターアプリの選択肢が少ない

Windows 版はエコシステムにおまかせしようと考え始めたところで、 mac 向けの選択肢が少ないことに気が付きます。 特にVMCプロトコルを受信する mac 向けアバターアプリは、ざっと探した限り1つしか見つけられませんでした。

アバターアプリに求められる機能や振る舞いは人によって様々なので、多様性があること自体が大事だと考えています。 hatracker を作り始めたのも、当時自分が欲しいアバターアプリがなかったからです。

hatracker ユーザーは mac 率が高いこともわかっていたので、これは無視できません。

しかしいまのコードベースでメンテもしたくない。ということで、別アプリとして hatracker の機能を移植することを決めます。

実装の話

使ってみたかったライブラリを一通り使いつつ、ほぼすべてを書き直しました。単に移植するのは面白くないので。

  • URP
  • VRM 1.0
  • VContainer
  • UI Toolkit
  • Input System

また CI は Github Actions にしました。(hatracker は Unity Build Automation)

誰かがアバターアプリを作り始めるときの一助になれば…という気持ちもあったのでOSSにしました。あとは社内の hatracker ユーザーにPR投げてもらおw という魂胆もあります。

というわけでせっかくOSSにしたので、現時点でのコードの見どころも紹介していきます。

1. 動的な設定UIの構築

やりたかったこと: 設定項目の追加をめちゃめちゃ簡単にしたい

ので、 attribute をつけDI container に bind したらUIが勝手に構築されるようにしました。

そのうち runtime ではなく editor で構築するようにしたいです。

2. UniVRM 1.0 で目を独自に制御

やりたかったこと: VMCプロトコルのうち LookAt ではなく Bone ないしは Blendshape を使いたい

のだけれど、 Vrm10 の LookAt が強すぎて上書きされてしまう。 そこで、内部コードに手…は入れずに、 reflection でなんとかしました。

3. mac build の workflow

やりたかったこと: github actions で Unity の mac build をして「pkg にして pkg にして dmg にして notarize」をしたい

意外と完全なコードはインターネット上に見つけられなくてちょっと苦労しました。

Unity ビルドまでは linux インスタンスでいいので、破産しそうになったら節約するやつをやろうと思います。

おわりに

気が向いたときにぼちぼち更新していきます。PRもお待ちしております。

明日はKAKOさんの クラスター社で1年と少し働いてみて。 - Kakoのいろいろやったこと記 です。