Narazaka::Blog

奈良阪という人のなにか

VRChatアバターGit管理でアバター多頭飼いのススメ

f:id:narazaka:20210213135009p:plain

VRChat系プロジェクト(アバター・アセットとも)を管理するときは制作者、利用者に限らずGitを使うといいぞというのは良く言われる話です。

ただVRChatter向けに初歩的な所の導入はありベーシックなところの説明はなされているものの、Gitの底力系記事というかGitを使い慣れている人向けのノウハウみたいなのはいまいち見当たらない気がしました。なのでアバター購入ヘビーユーザーの自分が便利だと思っている方法を書こうと思います。

初心者向け導入記事

とりあえず誰でも以下を読んでgit導入するのはおすすめ。なんにせよgitは使って損はない(※個人の感想です)。

qiita.com

GitExtensionsとGitlabおすすめ説

ただし個人的には変に独自のコマンドなどをもつSourceTreeではなくGitExtensionsが使いやすいと感じています。

サイトは英語ですが普通に日本語で使えます。

gitextensions.github.io

またVRChatアセットの場合リモートでのバックアップのためアップロードするサービスはGithubではなくGitlabのほうが恐らくおすすめです。なぜならデフォルトがprivateリポジトリになるからです。

gitlab.com

Gitを使った多数のアバターの統合管理

自分は販売アバター40体以上+無料アバター10体くらい+自作アバター1体などを持って全部一応VRChatにアップロードしているアバターヘビーユーザー(?)なんですが、基本に沿ってアバターごとに全て別々のプロジェクトで管理する方法をとっています。

複数のアバターを1つのプロジェクトで管理するという流派もあるらしいですが、VRCSDK2とVRCSDK3の対応差とか、シェーダーとか全体で使う系アセットのバージョンが異なるとか(まんまるシェーダーなどバージョンで大きく挙動が異なるシェーダーもあります)、Quest対応時のプラットフォーム切り替え時再インポート時間とか、多くなってくると色々な事情で厳しさが出てくるのではないかと思っており1体1プロジェクトにしています。

さて、しかし1体1プロジェクトの場合、昔買ってアップロードしたアバターを最新状態に更新するときに手間がかかります。

すなわちUnity 2017時代のアバターをUnity 2018+最新のVRCSDK+最新のDynamicBone+最新のKawaiiCamera+最新の……にするためには、プロジェクト数分そのアップデート作業をやらなければならないわけです。

これが果てしなく面倒なのでなんとかできないかと考えた結果、Gitのremote複数登録によりupstreamにアバターのテンプレートリポジトリを指定して追従する方法を思いつきました。

アバターテンプレートリポジトリによる管理

  • VRCSDKをはじめ、アバターによく使うと思われるアセットをテンプレートリポジトリに片っ端からコミットする。
  • アバターリポジトリのoriginはそのままに、upstreamにテンプレートリポジトリを指定する。
  • upstreamのmasterからoriginのmasterにマージしてアプデ管理する。

という感じの方針です。

テンプレートリポジトリを作る

なにはなくともとりあえずUnityでプロジェクトを作ります。

f:id:narazaka:20210213094743p:plain

そのフォルダにゆきます。

とりあえずGithub推奨のUnity用gitignoreを落としてきます。

github.com

git initし、git commitします。

f:id:narazaka:20210213094834p:plain

VRCSDKとかをインポートしてコミットしていきます。

注意点としては、SDKインポートした後シーン保存とかをしないと書き換えがファイルに反映されないことがあります。 シーン保存してすぐシーン削除してからコミットすれば、シーンファイルはコミットせずに変更だけ反映できます。

f:id:narazaka:20210213095258p:plain

てきとうにpushします。

とりあえず以上です。

新規のアバターリポジトリに適用する

新規の場合は簡単です。以下相当やればOKです。

git clone git@gitlab.com:YourName/vrchat-avatar-template.git vrchat-cynthia
cd vrchat-cynthia
git remote rename origin upstream
git remote add origin "git@gitlab.com:YourName/vrchat-cynthia.git"
git push --set-upstream origin master

Gitlabに対してこの一連の操作+α(リポジトリの説明にアバターのbooth url等を突っ込んでおく)を行うツールを作りました。よかったら使って下さい。

github.com

既存のアバターリポジトリに適用する

このテンプレートリポジトリを使っていない既存のアバターリポジトリにもこれは後から適用できます。

gitのマージにはgit merge --allow-unrelated-historiesというオプションがあり、これを使うと無関係な履歴をマージすることができるのです。

以下方法。GitExtensionsのGUIでたどります。

まずとりあえず既存のアバターリポジトリがあります。

f:id:narazaka:20210213103926p:plain

おもむろにupstreamを追加します。(git remote add upstream yourrepo

f:id:narazaka:20210213104002p:plain

fetchします。(git fetch upstream

f:id:narazaka:20210213104058p:plain

交わっていない歴史が増えました。

f:id:narazaka:20210213104447p:plain

マージする前にコンフリクトしそうなアセットを削除します。

  • 無関係な履歴をマージする時には履歴が考慮できないため、ファイル内容が違っていると即座にコンフリクトしてしまいます。
  • なので先手を打ってテンプレートに含まれていてコンフリクトしそうな古いアセットを消しておきます。(metaも忘れずに!)

f:id:narazaka:20210213105035p:plain

削除をコミットします。

f:id:narazaka:20210213105229p:plain

upstream/masterをマージします。

f:id:narazaka:20210213104418p:plain

このときgit merge --allow-unrelated-historiesにあたる「詳細なオプション」→「無関係の履歴を許可」にチェックを付けます。

f:id:narazaka:20210213104530p:plain

マージしますがまあまずコンフリクトします。主にはProjectSettingsやその他フォルダのmetaなどですね。

f:id:narazaka:20210213105416p:plain

マージツールなりvscodeなりで開いて解消しましょう。以下はvscodeでの操作で説明します。

f:id:narazaka:20210213105442p:plain

基本的にほとんど「入力側の変更(theirs)」を適用すればOKです。

f:id:narazaka:20210213105734p:plain

フォルダのmeta変更や……

f:id:narazaka:20210213105913p:plain

manifest.jsonやProjectSettings配下の変更などがあります。

f:id:narazaka:20210213105947p:plain

ProjectSettings.assetにあるproductGUIDとproductNameは「現在の変更(ours)」を適用すると良い気はしますが、その他は基本「入力側の変更(theirs)」です。

f:id:narazaka:20210213110048p:plain

この例外だけ「現在の変更(ours)」側で適用したら……

f:id:narazaka:20210213110236p:plain

残りは全て「入力側の変更(theirs)」を適用できます。vscode便利。

f:id:narazaka:20210213110315p:plain

この状態だと保存されてないのでファイルタブへ行って全部保存して……

f:id:narazaka:20210213110449p:plain

全ての解決した変更をステージしましょう。

f:id:narazaka:20210213110633p:plain

vscodeを閉じてGitExtensionsに戻って……(戻らずにそのままコミットしてもいいですが……)

f:id:narazaka:20210213110749p:plain

f:id:narazaka:20210213110816p:plain

変更をコミット!(たまに.REMOTE, .LOCALなどの中間状態ファイルが残ったりしますがこれらは後で削除しましょう)

f:id:narazaka:20210213110931p:plain

無関係な履歴をマージできました。

f:id:narazaka:20210213111004p:plain

Unityで開いてみましょう。結構なインポート時間はかかると思いますが、念のためエラー無いか、シーン上の見え方が変では無いかなどを確認して下さい。

更新運用する

普通にテンプレートを随時更新して、アバター更新したいときにupstreamからマージするだけです。

VRCSDKを変に更新するとリンクが切れるみたいな話もありましたが、今のところこの方法でそういった事例は起こっていません。

Unity起動中にやるとまずい操作もあるかなとは思うので、変になったらgit reset --hardするなりUnity閉じるなりしてやり直すと良いです。

応用編

Gitの力の見せ所です。

SDK2とSDK3の並行管理

なんとGitを使うとSDK2とSDK3のアバターが並行して管理できます。

VRCSDK2ベースのブランチからスッとsdk3ブランチを切ってVRCSDK2を消し、VRCSDK3を入れます。

VRCSDK3が動くように以下のシンボル変更をProjectSettingsに入れます。

f:id:narazaka:20210213111719p:plain

VRCSDK3非対応アセット(自分は色々入れてましたが、EmoteSwitchとVirtualLens1くらいだったのでかなり両対応で使えます)を消します。

f:id:narazaka:20210213112027p:plain

VRCSDK3用アセットを入れます。

以後両対応のアセット更新するときはVRCSDK2用ブランチにコミットしてからsdk3ブランチにマージする運用でいけますし、SDKの更新もそんなにコンフリクト無くイケるっぽいです。Gitの有能性がすごい。

特にこれをそのままアバターリポジトリでマージすることで、SDK3の移行のベースが済んでしまうのが強いです。

アバターのSDK3対応のTipsを少し

アバターはprefabで配られていることが多いと思いますが、上記のように移行でのSDK3対応の時にprefab variantを使うと更新追従が楽な非破壊な感じに出来て良いです。

SDK2なアバターのシーンを開くとこのようになってしまいますが……

f:id:narazaka:20210213112711p:plain

これをremove componentした状態でprefab vairantを作ると……

f:id:narazaka:20210213112826p:plain

prefabのスクリプトエラーも無くSDK3のものを付けていけます。

UniVRM並行管理

一部のアバターだけVRM対応したい、あるいはVRMから変換したいなと思うときがあると思います。(vroid製など)

UniVRMと、セットで使うことが多いVRM Converter for VRChatですが、結構デカいスクリプトアセットなのでいつもインポートするのは面倒かも知れません。

pokemori.booth.pm

そのときはsdk3やsdk2のブランチからさらにvrmブランチを切って、その中でのみコミットするようにすれば、使わないプロジェクトでは無駄に時間がかからなくて良いと思います。

ChilloutVR並行管理

近年話題のChilloutVRのSDK(CCK)はVRCSDKと共存できます(一緒にインポートしてエラーが起きません)。

なのでcckブランチを切ってインポートしたものをコミットすると、こちらへの移行も楽だと思います。

ただしChilloutVRはUnity 2019を要求するので、これをマージしたリポジトリはUnity 2019で開く必要があります。VRC側と開くUnityを判断して逐一変えるというのは流石に面倒なので、別の場所にcloneして別ブランチ参照した方が良いと思います。

幸いにしてmetaなどの変更はそんなにかからないっぽいので、これも並行管理できそうです。

CCKはSDK2とSDK3のハイブリッド感ありますが、どちらかといえばSDK2と親和性が高いのでsdk2ブランチから切るのがおすすめかも……?

拙作の移行ツールもあります。よしなに。

narazaka.booth.pm

テンプレートリポジトリ導入おすすめのアセット

個人的に使っているやつを一覧します。

SDK2/SDK3両対応

両対応というか、VRCSDKに関知しない物も多い。

assetstore.unity.com これが無きゃはじまらない(有料)

narazaka.booth.pm Git系開くやつ。

Unity閉じないとできないGit操作などもあるし、Unity内でGit操作するやつは結局不便だなあという感覚がありました。おとなしく外部ツール使おう。

narazaka.booth.pm VRChatがUnityの状態をただしくDirtyにマークしない時に使うやつ。

変更したのにGitに差分が出ない時にこれを使ってDirtyにしてから保存すると差分が出てきたりします。

booth.pm 階層やコンポーネントがわかりやすくなったりするやつ。かなり便利。

booth.pm VRCDeveloperToolと言う名前ですが万人に便利。

ハンドサインの変更とか、Boundsのセットとか、SDK2での動作確認ができるVRCAvatarTesterとかが同梱されててすごい。

gatosyocora.booth.pm アバターの表情編集をするときなどに

gatosyocora.booth.pm テクスチャから場所指定してメッシュを簡単に消せるすごいやつ。

SDK3やEmoteSwitchなどでオンオフしたいアバターの部位が分かれていない場合とかに、オンオフしたい部分を消したメッシュとオンオフしたい部分だけ残したメッシュとを作って入れるなどが出来る。

gatosyocora.booth.pm アニメーションのミスを検知するやつ。ただこれまで使ったことは無いかも知れない。

gatosyocora.booth.pm 不要ボーン削除

VRM対応時などに使えそう

以上がとーしょこら無双。やっぱりがとーしょこらさんがなんとかしてくれるんだよなあ……(ぉ

necocoya.booth.pm necocoya.booth.pm

ポーズやEmoteの詰め合わせ。(基本無料・有料版有)

VRChatでなんか良い感じのアニメーションっぽいポーズを見たら大体これ。

booth.pm とくにポーズ集の有料版に含まれる追加ハンドサインはなかなか良くて、これをVRCDeveloperToolのハンドサイン変更ツールに統合して使えるようにするツールを作ってます。有料版買った人はこちらも是非。

booth.pm フルトラ適性を上げるハックするやつ。

booth.pm サムネ設定するやつ。

でも使ったこと無い気もする。

booth.pm shivi.booth.pm shivi.booth.pm 新進気鋭の着せ替えツール「キセテネ」。

位置合わせなどが便利。アクセサリ用ツール「ツケテネ」や、VRoidから服を剥ぐ「羅生門ツール」なんかも同作者であります。

booth.pm 老舗の着せ替えツール。

たぶん後発のキセテネとかのほうが使いやすいのだけど、SkinnedMeshを統合してパフォーマンス向上できるツールが付いてたりするのが地味に強い。

neutrino-gamma.booth.pm 特にSDK3でオブジェクトオンオフするアニメーションを手動で作るときに重宝しそうです。

neutrino-gamma.booth.pm アバター用というよりかはアバターをワールドに配置したりする時に便利なやつ。

narazaka.booth.pm GUIDを変えたいときに重宝します。

同一アバターのバリエーション違いが別unitypackageで配られているなどで、そのまま両方インポートすると上書きされてしまう場合にこれを使って上書きされないようにできます。

booth.pm DynamicBoneコピーするやつ

booth.pm DynamicBoneの設定をcsvエクスポートしたり復元したりするやつ

baba-s.hatenablog.com Animationのプレビューモデルを固定するやつ。

ただし一度アニメーションを表示しないとコンソールに無限にエラーが出たりするのでちょっと不安定かも。こつをつかもう。

assetstore.unity.com 容量デカい部分を検知できるやつ。

narazaka.booth.pm 拙作のアバターアップロードツール(300円)

1つのアバターで複数アップロードする事例に特に便利。SDK2でprefab variantもなかった時代の産物なのでごちゃごちゃしているのが玉に瑕ですが、SDK3でPoorに納めるために衣装別アバターにしてるときなどは便利だと思います。

booth.pm 表情確認用に便利なやつ。(300円)

SDK3だと入っているEmoteSwitchが使えませんが、使わなくても問題ないように改修されているので普通に使えます。

github.com VRM使うときに。上述のように別ブランチの方がいいかも。

pokemori.booth.pm VRMからVRChatに持ってくるときに。

booth.pm DynamicBoneをVRM SpringBoneに変換できるやつ。

ただしパラメーター変換結果はけっこうガバだったりするので自分で調整する必要があったりします。

SDK2用

booth.pm みんな大好きEmoteSwitch

logilabo.booth.pm VirtualLens(v1系)(500円)

VRCSDK2で実用的なカメラアセットとしては唯一に近い存在。

SDK3用には別アセット(v2系)を買う必要があることに注意。

booth.pm ボケ表現ができるやつ。(800円)

SDK3用

github.com Avatars 3.0の挙動をUnityエディタ上の再生で確認出来るツール。

Expression Menuやリップシンクなどにも対応しておりかなり便利。動作の簡易確認がすぐできます。

booth.pm Avatars 3.0ネイティブ対応はこれを使ってはじめよう。

booth.pm Avatars 2.0からの移行ならこっちの方が楽かも。

booth.pm 2から3への自動変換ツール

booth.pm シンプルな表情設定ツール

既に表情アニメーションがあるならVRCAvatarEditorより楽かも知れません。

booth.pm 非常に高機能な表情設定ツール

表情モード切替や左右ハンドサインの組み合わせでの詳細な設定、その他表情に関することなら何でもござれというツール。プレビュー付きで一覧性も高く凄いです。

booth.pm オブジェクト出し入れ便利化ツールのひとつ

高機能だったが状態保存が出てからちょっと保存系はバグい挙動をする感じがあります。

booth.pm オブジェクト出し入れ便利化ツールのひとつ

出し入れを1つのアニメーションで制御するのが特徴的。

booth.pm オブジェクト出し入れ便利化ツールのひとつ

着替えと称しているがそうで無くても使えそう。ただパラメーター消費が結構多い。

github.com 色々なツール群

booth.pm Avatars 3.0用アセット(メニューとパラメーター)がすぐ区別できるようにするやつ

booth.pm 海外版VRCDeveloperTools的なやつ。

SDK2にも対応していると書いてあるが、SDK2ではあまりメンテされてないのかエラったりするので……。

booth.pm VirtualLensのAvatars3.0用(1300円)

booth.pm VirtualLensより後発のカメラアセット。

機能追加が速く高機能です。

以上

全部コミットして最強テンプレートリポジトリを作ってウッハウハ人生というシナリオ。

やっていきましょう。