メインコンテンツまでスキップ

破壊的 / 非破壊的

元となる要素が上書きされるか、されないかに着目した考え方

なに?

破壊的 / 非破壊的とはプログラムにおいて元となる要素が上書きされるか、されないかに着目した考え方です。VRChatコミュニティが発祥の概念というよりかは、もともとプログラマの間で普及されていた考え方の一つだったと思います。 たとえばRustというプログラミング言語1 では、ある要素を上書き可能にしたい場合、「その要素が破壊的であること」をプログラマに意識させるためにmutキーワード2 というものを明記するよう強制しています。

アバター改変においては、元となる要素の性質を永続的に失わせる行為を「破壊的」と呼ぶことがあります。

例えば、衣装改変を手動でやる場合はアバターのボーンと衣装のボーンを統合するために衣装を含むPrefabアンパックする必要があります。ですがアンパックをした瞬間、元となるPrefabの性質は永続的に失われる、すなわち破壊されてしまいます。

非破壊ツールでは、これらの問題について解決するためにアバター改変における"フェーズ(処理)のステップ"を明確に定義しています。実際はもっと複雑ですが、簡略化すると以下の2つのフェーズに分けられます。

  1. 変換前フェーズ
  2. 変換後フェーズ

変換前フェーズは、普段私達がUnityシーンウィンドウなどを用いて改変している状態です。この状態では、例えば衣装のPrefabはアンパックされていない、すなわち非破壊の状態です。

変換後フェーズは、アバターの動作確認をするためにUnityをプレイモードにしたり、アバターをアップロードするためにビルドしている状態です。この状態では、衣装はPrefabはアバターに着せるためにアンパックされている状態、すなわち破壊された状態です。

破壊されたと聞いて「非破壊ツールなのに破壊してしまうのはどういうこと?」と思った方もいるかも知れません。注目してほしいのは、非破壊ツールにおける破壊された状態は永続的ではないという点です。これを実現するために、非破壊ツールでは「変換後フェーズ」から変換前フェーズに戻った際、ヒエラルキーウィンドウにある各GameObjectの状態を自動で元に戻してくれます。

これにより、破壊された状態は実行やアップロードするときのみ、いわば必要最低限に抑えることで普段の改変を行う「変換前フェーズ」においては非破壊の状態で各種Prefabなどを取り扱うことができます。

実装面においては、NDMF(Non-Destructive Modular Framework, なでもふ)と呼ばれるライブラリ(ソフトウェアの「もと」となる部品集のようなもの)3 が非破壊処理を実装するための一連のフレームワーク、すなわち共通規格としての枠組みや基本の命令文セットのようなものとして開発者向けに開発・提供されています。ですが、アバター改変を行う一般ユーザにとってはNDMFを気にすることはエラー解決の時くらいで、普段は全く無いといえます。

NDMFを用いて作成されたツールとして、ModularAvatarAAO、VRCQuestTools4 などが挙げられます。

なぜ?

なぜ非破壊的を重視する必要があるのか、その理由の一つとして「アバター改変を長期的な視野で見たときに、恩恵を受けやすい」というものがあります。

衣装改変の例を出してみましょう。

たとえば、BOOTHからパーカーを購入したとします。あなたは従来の破壊的な手法、すなわち衣装のPrefabをアンパックする方法で着せ替えをしました。 ところが…肩の部分、本来見えないはずの素肌が見えてることに気づきます!要は破綻していたということですね。

数日後、衣装製作者から「衣装を修正したので更新してほしい」と連絡がありました。 破綻を修正したいあなたは再度衣装のUnitypackageをインストールして、Prefabを入れ直す必要があります。もちろん、Prefabをアンパックしてボーンを統合する作業もいちからやり直さなければなりませんね…

このように、アバター改変を長い目で見てみると、短期的には問題がなくともゆくゆくは二度手間が発生する可能性が高まります。

非破壊ツールを用いた方法、たとえばModularAvatarを使う方法であれば初回のセットアップも簡単ですし、修正が必要な場合もUnitypackageファイルを再インポートするだけで済むことがほとんどだと思われます。

Footnotes

  1. https://www.rust-lang.org/ja

  2. https://doc.rust-lang.org/std/keyword.mut.html

  3. https://github.com/bdunderscore/ndmf

  4. https://github.com/kurotu/VRCQuestTools