アバターからワールドまで!VRChatユーザーのためのUnity Scene入門ガイド
はじめに
最近VCCでプロジェクトをMigrate(移行)する際に、『データが消えちゃった』とかいう話をチラホラ耳にすることがあります。
ですが、話を詳しく聞いてみると、データが消えてるわけではなさそうだったので、この記事を執筆しました。
というわけで、今回の記事は『Scene』について解説したいと思います。
SceneはUnityにおける非常に重要な初歩の概念なのですが、VRChatにおいてはあまり一般的に浸透していないように見受けられます。
最初1000字程度で簡単に知りたい人向けの話、その後により詳しく知りたい人向けの話、という形で分けているので、最初のほうだけでも是非読んでいってください。
UnityのSceneとその本体について
UnityのSceneファイルは、Unityで皆さんがアバターの改変やワールド制作を行った後に保存されるセーブデータに該当します。このセーブデータにはUnityのHierarchyの状態や、環境設定などが保存されています。
「あー、Sceneね!これのことでしょ!?」って思った方もいると思います。
確かにこれはSceneですが、本体はプロジェクトタブのどこかにあります。
(ない場合はシーン名がUntitledとなっていて、まだ一度もセーブされてない状態です。[Ctrl]+[S]でセーブができます)
現在開かれているSceneの本体を探す方法を教えます。
シーン名の部分を右クリックして[Select Scene Asset]を押します。
そうするとUnity下部のプロジェクトタブで、ハイライトされるので分かると思います。
このUnityマークがSceneファイルの本体になります。
このSceneファイルに皆さんが苦労して編集したデータが保存されています。
『データが消えちゃった』と思うその前に
VCCのMigrateで『データが消えちゃった』と思う原因はシンプルで、VCCに移行した直後は新規のSceneファイルが新しく開かれてしまっているためです。
皆さんの苦労して作成したSceneファイルは上書きされたり、消されてしまったわけではなく、ただ単にプロジェクトのどこかに眠っているだけの可能性が高いです。
では、探し方を教えます。
プロジェクトタブの右上にあるアイコン群の一番左を押してみてください。
広がったドロップダウンリストには、色々な名前が並んでいると思いますが、Sceneを選んでください。
その後にこのIn Assetがハイライトされていることを確認します(ハイライトされていなかったらクリックしてください)
この操作によって、プロジェクトのAssetフォルダ内に保存されているSceneファイルが全て出てきます。
(アバター改変のプロジェクトとかだと大抵1個だけ出てくると思いますが、ワールド制作のプロジェクトだとアセットのデモ用Sceneが沢山出てくるかもしれません)
出てきたSceneファイルをダブルクリックしてみましょう。ダブルクリックすると現在開いていたシーンを閉じて、ダブルクリックしたシーンを開きます。
お目当てのSceneファイルでなければ別のSceneファイルも同様に、片っ端からダブルクリックしていき、見覚えのあるアバターやワールドがHierarchyと中央画面上に出てきたらビンゴです。
見つけ終わったら操作しやすいように、先ほど押したアイコン左側の検索欄をクリアするか、左側のAssetsをクリックして、プロジェクトタブを戻しておきましょう。
基本的にMigrateによってSceneファイルが勝手に消えるということはまずないと思いますが、うっかり何かの拍子にSceneファイルを消してしまった場合は、残念ながらアウトです。Unity上で何かしらファイルを消すと、Windowsのゴミ箱に行くので、その時点で救い出せれば大丈夫ですが、ゴミ箱も掃除してたらお終いです。
(Packageフォルダに存在する可能性は流石にないと思いますが、In Assetを選ぶところで隣のIn Packageを選ぶとそちらも探せます。まずないと思いますが……)
最低限これだけ知っていれば、VCCのMigrateでデータが全てなくなっちゃったと勘違いして、最初から作り直してしまったり、移行を断念したりという悲劇は避けられると思います。
---より詳しく知りたい人向け---
さて、ここからはワールド製作者向けにもう少し踏み込んだ解説をしていきたいと思います。もちろん、普段ワールド製作しない人も読んでおいて損はないと思います。
では、参りましょう。
そもそものSceneの使われ方
VRChatでは一つのScene上でデータを編集し、それをVRCSDKを通してアップロードする形が当たり前になっています。
ですが、Unityでゲームを作成する場合は『複数のSceneを切り替えて使う』やり方があります。
どういうことか、説明するために簡単にではありますが図を用意しました。
1ステージだけで終わる簡単なゲームを想定したものですが、以下の図のようにゲームの進行に合わせて、シーンの切り替えを行うようなことが可能です。
これを見ると何故『Scene(シーン)』って名前なのか分かってもらえると思います。
推測ではありますが、昔はゲーム機やPCのスペックが低く、一度に利用できるリソースが少なかったため、Scene単位で細かく分割することで、リソースの消費や負荷を抑えていたのだと思います。
近年ではゲーム機やPCの進化により、潤沢なリソースを使えるようになったため、1つのSceneで済ませることもあるらしいです。
VRChatでは1つのシーンしか扱えませんので覚える必要はありませんが、『Sceneは切り替えることも出来るもの』ということを念頭に置くとこの後の話が理解しやすくなると思います。
UnityのSceneに保存されている情報について
UnityのSceneファイルにはHierarchy上の情報だけではなく、環境設定系のデータも紐づけて保存されています。
具体的には以下の設定です。
・RenderSettings と LightmapSettings (どちらも Lighting ウィンドウにあります)
・Occlusion Culling ウィンドウのシーン設定
・NavMesh の設定
そのためSceneを切り替えると、それらの情報も切り替わるようになっていますので、ライティングなどが切り替わり、困惑するかもしれません。
これは先ほどの話と関連付けて、『ゲームのシーンが切り替わる時にライティング等の設定が変わる』と考えれば、腑に落ちるのではないかなと思います。
一方でレイヤー設定や重力設定などは『プロジェクト』自体についての設定なので、Sceneを切り替えても切り替わることはありません。
独自のレイヤーを使用しているオブジェクトがあるシーンを、別のプロジェクトで開いてみるとどうなるかというと、レイヤーの割り当てが無い状態(おそらくdeffaultレイヤーが使用されている状態)になります。
そのためレイヤーを駆使している場合は注意が必要です。
Sceneの複数編集について
Unityでは複数個のシーンを同時に開いて、編集することが出来ます。
やり方は幾つかあると思いますが、シンプルなやり方としてはシーンファイルをヒエラルキー上にドラック&ドロップするだけです。
展開されたシーンのオブジェクトは自由に操作でき、別のシーンにドラッグ&ドロップでオブジェクトを移動させるなども問題なく出来ます。
(Vketのページで分かりやすく紹介してたりします)
消すときはシーンファイル名のところで右クリックし、Remove Sceneを選択すると消すことが出来ます(一個の時は押せません)
ただし注意点があります。
ライティング・オクルージョンカリング等の環境設定は既に開いているシーン(アクティブシーン)のものになっています。そのため新規に開いたシーンの環境設定は無視されます。
Boothの販売ワールドアセットなどで、『ドラック&ドロップではなく、ダブルクリックでシーンを開いてください』という指示をたまに見かけますが、その販売アセットの設定を使ってほしいが故の指示です。
別のシーンファイルからオブジェクトを持ってくる場合は、移動させた後で別のシーンファイルをRemoveし、ライトベイクやオクルージョンカリングのベイクをやり直したほうが良いでしょう。
Unityアセットのデモシーンを使ったワールド製作
私はワールド製作初心者にはBoothでVRChat向けワールドアセットを買うことをオススメしていますが、ワールド製作に手馴れてきたら、Unityアセットのデモシーンを使ってみるのも面白いと思います。
Unityアセットにはデモ用のシーンがあるので、先ほど説明したようにドラッグ&ドロップでシーンを並べた後、ゲームオブジェクトを一つのシーンに統合してしまうやり方です。
メリットはアセットのシーンが既に整えられているため、オブジェクトの配置等に手間を取られないことです。
デメリットとしては使用するアセットによっては非常に高負荷なものがあるので、負荷を減らしたいと思ったときに最適化の技法と時間を求められることです。またインポート時にエラーが起こることもあるので、総合的に見て初心者にはお勧めしづらいです。
とはいえ、高品質なアセットをそのまま使えるのは結構楽しいので、手馴れてきたら是非試してみてください。
今度、別の記事として執筆したいなと思っています。
Sceneファイルの中身について
実はシーンファイルの中身を見ることが出来ます。見てみましょう。
プロジェクトタブ上で、シーンファイルを右クリックし、「Show in Explores」エクスプローラーで開きましょう。
そしてエクスプローラー上で右クリックし、[プログラムから開く]を選択、その他のオプションからメモ帳を選びます。
そうすると、何らかの規則に従って書かれた文字列が出てきましたね?
これがシーンファイルの中身です。
シーンファイルは、YAMLと呼ばれるフォーマットに従って書かれた文字列です。
実はFBXなどの3Dモデルデータなどはシーンファイルの中に直接保存されているわけではなく、シーンファイルはあくまでそのデータが置かれている場所、すなわち参照のみを保存しているということです。
たまにプロジェクトフォルダ上で、FBXデータを消したり、プレハブを消したりすると、Hierarchy上で赤く表示される現象は、参照先のデータが失われてしまっているために起きます。
普通はYAMLを編集することはまずありませんが、アニメーションの参照を直したり、複数人での共同作業でマージ時のコンフリクト(衝突)解決などに編集することはあります。
これらの利用例について、具体的に知りたい場合は以下のリファレンスが分かりやすいです。
YAMLの編集方法については必要が無い限り覚える必要はないと思いますが、『シーンファイルはあくまで参照を保存している』ということは理解していたほうが、エラーが発生した時の解決の糸口になるかもしれません。
VCCがMigrate時に新規シーンを開く理由
VCC以前の話ではありますが、VRChatのUnityバージョン以降の案内には、『既存のシーンを閉じて、新規シーンを開く』という手順がありました。
ここにサラッと記載されていますが、「Skipping this step will result in all U# behaviors in the scene to lose references and become corrupted.(訳:このステップをスキップすると、シーン内のすべてのU#ビヘイビアが参照を失い、破損してしまいます)」と書かれています。
つまりUdonのギミックを破損させないために、新規シーンを開く必要があるというわけです。
上の文章の少し後に続けて
「This is done to prevent Unity from attempting to open the scene before all assemblies are compiled, which causes all scripted behaviors in the scene to lose references and become corrupted.(訳:これは、すべてのアセンブリがコンパイルされる前にUnityがシーンを開こうとすると、シーン内のすべてのスクリプトが参照を失い、破損するのを防ぐために行われます)」
とも書かれているので、VRC_Avatar_DescriptionやVRC_WorldなどのVRC側が用意したスクリプトの破損も防ぐ意味もありそうです。
VCCのMigrateに関するページを見ても、そこら辺についての記載はないのでこれは私の推測にすぎませんが、VCCもMigrate時は同様の手順を踏んでいそうなので、新規シーンが開かれた状態で移行後の画面が出てくるのでしょう。
シーンに関する小ネタ
シーンファイルの複製
プロジェクトタブ上で[Ctrl]+[D]でシーンファイルを複製することができます。Hierarchyを大幅に変更する時などはこれでバックアップを取っておくことができます。
シーンは複数編集できるので、うっかり消してしまったゲームオブジェクトを部分的に戻したいなと思ったときは、バックアップしたシーンをドラック&ドロップして、ゲームオブジェクトを戻してあげたりするということも可能です。
未セーブ状態で突然Unityが落ちたときのリカバリー
Unityを開く前であれば、シーンファイルのバックアップが保存されています。
使っていたプロジェクトのフォルダ内に、Tempフォルダの中、Backupscenesフォルダ内にバックアップ用のファイルがあります。
Assetフォルダに中身を映したうえで、拡張子を「.unity」にすることでシーンファイルになるので、ダブルクリックすると開けます。
ただし、本当に直前のデータが保存されているかと言われるとそうでもないことが多いので、キチンと何らかのバックアップ手段を用意することをお勧めします(バックアップについては以前軽く記事を書きました)
シーンファイル名「Sample Scene」は危険!?
VCC以前はUnity hubなどからUnityのプロジェクトを立ち上げていたわけですが、プロジェクトを立ち上げた直後に出てくるSceneファイルは「Sample Scene」という名前でした。
実体もあり、Sceneフォルダの中に保存されています。そのため、そのまま作業を行うことも可能です。しかしながらこれが罠になるケースがありました。
Unityアセットストアで購入するアセットのデモシーンが、全く同じシーンファイルで作成されていることがあります。そのようなアセットをインポートすると、シーンファイルが上書きされ、手塩にかけていたデータが全て無くなってしまうという悲劇が発生することがあります。
現在、VCCでプロジェクトを立ち上げると、新規シーンは「Untitled」という名前で用意され、編集後に未保存のまま閉じようとすると、ファイルの命名と保存を要求されます。
したがってこの悲劇が起こる可能性は少なくなりましたが、Unityhub経由でプロジェクトを新規に作る際や、VCC以前に作成したプロジェクトを取り扱う時は気を付けましょう。
まとめ
わりとマイナーな話も含めて、Sceneファイルの解説をしましたがいかがだったでしょうか。
ワールド製作している方々はSceneについてある程度慣れ親しんでいる感じがありますが、アバター改変のみしている人はあまりSceneについて知らないことのほうが多いと思います。
身の回りで困っている人が居たら、是非助けてあげてください。
今回も長めの文章になってしまいましたが、ここまで読んでくださったあなたの好奇心・知識欲に敬意を表して、この文章を締めさせていただきます。
読了お疲れさまでした。
この記事が気に入ったらサポートをしてみませんか?