【VRChat】エラー『attempted to load the data for a world we do not own, clearing blueprint id』の特殊ケースについて
はじめに
この前、ワールド制作を始めようとしていた初心者さんが、1番最初のアップロードでこのエラーが出て困っていたことがありました。
当然一番最初のアップロードなのでBlueprint IDがあるはずがないのですが、何故かこのエラーが出るということでした。
幸い私は見覚えがあったので上手く解決することが出来ましたが、一番最初で躓いてしまうのは気持ち的につらく、挫折に繋がってしまうと思うので、その事例を記事として放流しておきます。
注意:アバタープロジェクトでも似たようなエラー『attempted to load the data for an avatar we do not own, clearing blueprint id』がありますが、アバターとワールドでは勝手が違うので以下の解決方法はアバタープロジェクトには基本的に適応できないと思われます。
以下の文章内でも違いについては言及しようと思っています。
VRCWorldを二つ以上置いてはいけない
というのが、結論です。正確に言うとVRChatSceneDescripterとそれに付随して付くPipeline Managerが二つ以上あると上記エラーが発生することがあるようです。
とはいえ、検証しようとしたところ、二つ置いた時点で以下のようにアップロードできなくなりました。
基本的にはここで止められるのが一般的だと思いますが、何らかの原因でこれをすり抜けてしまうことがあり、その場合に表題のエラーで引っかかるようです。
以前私も同じエラーになったことがありますが、その時もVRCWorldを誤って二つ置いていたので、片方削除した覚えがあります。
(再現できないので、もし条件が分かる方がいれば教えてくれたら幸いです)
アバターではVRChat Avatar DescripterとPipeline Managerが二つ以上あっても、アップロード画面で選択できるので問題ないのですが、ワールドについてはそうではないので気を付ける必要があります。
追記:VRCWorldのPrefab化を解除
VRCWorldのPrefab化を解除することで、エラーが消えた例がありました。
ですがこちらも検証しても、全然再現性がなくて何なの?って気持ちになりますね。Cannyもあったんですが、再現性がないとして閉じられてます。
この記事を読んでいただいた方で、『どうしても直らないので助けてもらえませんか?』と言われて、以下の助言をしたのですが、これで直ったそうです(詳細はツリーを見てください)
この時は
・VRCWorldは1つだけ
・アセットはUnityストア製のものだけ
・Unityは2022.3.22f1
・VCCは最新版
・プロジェクトを作ったのは3日前
・アップロードは初回から失敗して、それ以降一度も出来ていない
・再生ボタン押して、ClientSimでのデバッグが出来るので、変なエラーは起きていない
という、状況からするとかなり健全な状態で発生していました。
何故Prefabかというと、Unity2022になってからPrefab関連の仕様が変わったのですが、その影響か分かりませんがPrefabに付けられているUdonのスクリプトなどが勝手に巻き戻ったり、参照が外れたりすることが度々発生していました。
ですので、怪しいかなと思って疑ってみた次第です。
以下は余談:
憶測ですが、原因はPrefabがデータを独立して保持する性質を持っていることに起因しているかなと考えています。
Prefabがない場合、シーンファイルに全てのデータが格納されるのですが、Prefabがある場合はシーンファイルに保存されるのはそのPrefabの参照データだけで、Prefabの中身のデータは格納されません。
ただし、Prefabに直接編集をかけずに、シーン上でPrefabの値に対して編集を行うと、そのデータはシーンファイルに保存されます。
ですので、アップロード時にシーンまたはPrefabのどちらかにBlueprint IDが書き込まれた後、二つの整合性を合わせるためにIDがない状態に巻き戻され、しかしながらIDがないとアップロードできないので、もう一度付与しようとしたときに『既に付与してるじゃん!』と勘違いしてるんじゃないかなと思います。
まぁ状況が再現できないので、ただの憶測にすぎませんが。
基礎知識補足:Blueprint IDについて
何それ?って思った方は以下を読んでください。
簡単に説明すると、VRChat側から自動で割り振られる識別用のIDです。これでアバターやワールドが管理されています。
今回の初心者さんの事例について
現在2024/07/29で、Unity2022でワールドプロジェクトを作成すると、VRChat側が既に用意したシーンから始まります。
実は、既にそのシーン上にはVRCWorldが配置済み(なおかつBlueprint IDは空)のため、何も触ることなくそのままアップロードすることが可能です。
(ですので、試しにアップロードするのはお手軽にできます)
しかしながら、憶測ですがその初心者さんは『ワールドにはVRCWorldを置いてアップロードする』という話をどこかで聞いていたのでしょう。追加でVRCWorldをもう一つ置いた状態でアップロードしてしまったみたいです。
実に有り得る話だと思うので、初心者さんに教える場合は注意したほうが良いと思います。
Booth等で売られているアセットについても同様に、VRCWorldが設置済みのことがありますので、恐らく付随しているであろうアップロード手順等をよく見たほうが良いかと思います。
ちなみに『ワールドにはVRCWorldを置いてアップロードする』というのは、VCC以前は一般的な話でしたし、今でもUnity2019のワールドプロジェクトを新規作成した場合ではその手順を踏む必要があります。
(Unity2019だとVRChat側が用意したシーンから始まらないです)
余談1, シーンが二つ以上開かれていて、どちらにもVRCWorldがある場合
上で説明したのと同じ現象が起こってアップロードできないという例を、以前フレンドから聞いた覚えがあります。
(症状はややうろ覚えです。もしかしたら私の記憶違いで、『アップロードできたものの、ワールドに入るとInitializeで失敗して、必ずホームに戻される』だったかも)
現在以下のような形でやってみると、同じシーンで二つ置いた時と同様の形で、ビルドタブで止められます。こちらも何らかの形ですり抜けた場合同じエラーが発生するかもしれません。
片方VRCWorldなしの状態でアップロードしてみたところ、普通にアップロードできました。ですが、VRChatはマルチシーンに対応してないので、変なことはしないほうが良いと思います。
シーンについては以下を参照。Unityにおけるセーブデータみたいなものなので、知らない人はキチンと知っておいたほうが良いと思います。
余談2, 作ったワールドやワールド用アセットを誰かに配布・販売する時の注意
Unity2022ではVRChat側が用意してくれたシーンをそのままアップロードすることが可能ですが、ここには大きな落とし穴が存在します。
プロジェクトを開いた時のシーンをそのまま使っている場合、あなたのワールドが一瞬にして無へと帰す可能性があります!
上で貼ったシーンの記事を読んだ人は分かると思いますが、同じ名前で同じ場所にあるシーンファイルは、UnityPackageでインポートした時に上書きします。
そのデータを貰った誰かが、全く同じ名前で同じ場所にあるシーンファイルでワールドを作っていた場合、それを上書きする可能性があるのです。
そして仮に上書きしてしまった場合、バックアップを取っていない限りは元に戻せません。完全に無かったことになります。
対策はシンプルです。以下のシーンファイルを複製する(選択中にctrl+D)と、新しく複製されたシーンファイルの内部の識別ID(GUID)が別物になり、上書きされなくなります。複製したものをダブルクリックすると、複製したシーンファイルを編集するモードに入るので、それで引き続き作業してOKです。
これだけでも十分ですが、リネームして、場所を変えておくと万が一も防げると思います(超絶低い可能性でGUIDが被ることがあるらしいというのを聞いたことがあります)
VRChatが用意したシーンファイル[VRCDefaultWorldScene]を編集して、そのままの名前でエクスポートして配布している可能性は全然あり得ます。
知識不足で悪気なく配布している可能性もありますので、受け取る側の人もきちんと自衛することも大事です。
余談:Unity2019ではUntilted Sceneから始まるので、自分で保存場所と保存名を選ぶ必要があったので健全でした。ところが、何をとちくるったのか、Unity2022から固定のSceneで始まるようになったので悲劇が繰り返されようとしています。気を付けてください。
おわりに
キチンと検証したかったのですが、条件が掴めなかったため体験談に基づく曖昧な内容になってしまいました。
もし、条件を見つけた方がいらっしゃいましたら情報提供していただければ幸いです。
もしかしたらVCCのバージョンも関係していて、最新版に近いとビルドタブでブロックされるようになったのかもしれません。その場合はもう発生しない可能性が高いので、この記事はいずれ取り消すかもしれません。
以上です、この記事がお役に立てば幸いです。