CCKのSubSceneを試してみた。
まえがき
モデリングでできることが増えてきたので
現在公開中の Club Wistariaの3Dモデルをリファクタリングしようと考えたときにCCKに「SubScene」というコンポーネントが追加されたことを知りました。
さっそく「SubScene」を触ってみたので、試行錯誤したものを書き残しておきます。(各コンポーネントの詳細については以下を参照してください。)
特に重要だと思ったのは以下の内容です。
言葉だけで説明するので伝わるかが少し自信がないですが…。
メインシーンで手に持てるアイテムを作成しておき、メインシーンのアイテムをサブシーンで表示した部屋に放置してから、サブシーンが消える位置に移動するとサブシーンが非表示になったときに、メインシーンで放置したアイテムがDespawn Heightの位置まで落下するという挙動をすることを確認しました。
実験をした時には1人だったので複数人がワールドにログインしている状態で同期処理によってどんな挙動になるかの実験はしていませんが、サブシーンによってコライダーの表示がかわるとまずそうなのでこの辺りの問題がおきなくなることを考慮してシーンの構成を考えてみました。
シーンの構成
リファクタリング中のワールドなので部屋が2つしかない状態ですが…。
以下の3つのシーンに分類してみました。
MainScene
エレベータ(スポーン地点)
SubScene001
クラブのエントランス
SubScene-ReflectionProbes
全サブシーンのReflectionProbesをまとめておくためのサブシーン
MainScene
Hierarchyの内容
Directional Light(省略)
Cluster Must Objects(グループ化用のEmpty)
Despawn Height(CCKの必須コンポーネント)
SpawnPoint(CCKの必須コンポーネント)
Reflection Probes(グループ化用のEmpty)
RP-elevator(エレベータ内のReflection Probe)
TMP-RP-roomA-Center(エレベータ外のReflection Probe)
Cube(Grabbableコンポーネントを付けた持てるアイテム)
BundleMainScene(エレベータの内装をまとめた Prefabs)
SubSecne Setteing(グループ化用のEmpty)
EditOnly Objects(グループ化用のEmpty:TagにEditOnlyをしているのでClusterにアップロードされないオブジェクト)
BundleSubScene_001(エントランスの内装をまとめた Prefabs)
ColiderOnly Objects(グループ化用のEmpty:サブシーンのコライダー設定をまとめたグループ)
BundleSubScene_001(エントランスの内装をまとめた Prefabs)
SceneLoadColiders(グループ化用のEmpty:Sub Sceneコンポーネントをまとめたグループ)
SceneLoadColiders-SubScene-ReflectionProbes(サブシーン:SubScene-ReflectionProbesを呼び出すためのコライダー)
SceneLoadColiders-SubScene001(サブシーン:SubScene001を呼び出すためのコライダー)
BundleMainScene
エレベータの内装をまとめた Prefabs
(メインシーンのオブジェクトなのでコライダー設定を付けた状態)
ColiderOnly Objects
BundleSubScene_001(エントランスの内装をまとめた Prefabs)から
BoxColiderのみの設定のみをまとめたもの
メインシーン内にすべてのコライダー情報を保持しておくことによって
サブシーンの描画や削除のタイミングによって当たり判定がユーザによって異なることを防いでいます。
容量の軽量化に繋がるかは実験をしていないが、今回はMeshFilterのMeshを削除している。
コライダーが不要なオブジェクトについてはTagに「Edit Only」を設定してみた。
EditOnly Objects
メインシーンで使用するReflection Probeをベイクするためのオブジェクト
(説明のために非表示を解除しているが、ベイクする時以外は非表示)
この「EditOnly Objects」を設定しないと、エレベータより外は何もない状態になるので、エレベーター内なのに物体の反射内容に「空」が映ることを防ぐ目的で用意している。
SceneLoadColiders-SubScene-ReflectionProbes
SubScene-ReflectionProbesを呼び出すためのコライダー
(今回はメインシーン以外のReflectionProbeを1つのサブシーンにまとめる想定のため、ワールド全体にかかるようにコライダーを設定した。)
SceneLoadColiders-SubScene001
SubScene001を呼び出すためのコライダー
(今回はまだ部屋数が少ないので「SceneLoadColiders-SubScene-ReflectionProbes」と同じ内容になっているがSubScene001が視界に入る部屋に設定するイメージ)
Reflection Probes:TMP-RP-roomA-Center
スポーン地点のメインシーンから、サブシーンがすぐ目の前にあるので
「SubScene-ReflectionProbes」の読み込みが完了するまでの一時的なSubScene001専用のReflectionProbe設定
(これがないとエレベーターまえの大理石のタイルに青空が映る)
「SubScene-ReflectionProbes」を読み込んだ時点で不要になるため
Sub Scene Substitutesコンポーネントをつかって非表示にする設定を追加している。
Sub Scene Substitutesの詳細については以下を参照してください。
SubScene001
Hierarchyの内容はオブジェクトが1つしかないので省略
BundleSubScene_001
エントランスの内装をまとめたPrefabs
コライダー設定はメインシーンで保持しているので不要
ReflectionProbeも専用のサブシーンを作成するので不要
とてもシンプル!!!
SubScene-ReflectionProbes
Hierarchyの内容
Directional Light(省略)
EditOnly Objects(グループ化用のEmpty:TagにEditOnlyをしているのでClusterにアップロードされないオブジェクト)
BundleMainScene(エレベータの内装をまとめた Prefabs)
BundleSubScene_001(エントランスの内装をまとめた Prefabs)
Reflection Probes(グループ化用のEmpty)
roomA-Center(エントランス用のReflection Probe)
EditOnly Objects
MainSceneの「EditOnly Objects」と同様にReflection Probeのベイクをする場合にだけ表示して、ベイク以外は非表示にしておくグループ
MainSceneの「EditOnly Objects」との違いは
全てのサブシーンの内装をまとめた Prefabsを設定すること
(今回はサブシーン内にメインシーンのオブジェクトが反射する位置にあるのでメインシーンのprefabsも含んでいる)
Reflection Probes
全てのサブシーンのReflection Probeをまとめておくためのグループ
動作検証
Windows メインシーンサイズ: 5.86MB
Windows サブシーン1サイズ: 0.89MB
Windows サブシーン2サイズ: 0.01MB
サブシーンの名称が表示されていないのでどっちがどのサブシーンかは
わからないがひとまず現時点でメインシーンの容量を約1MB減らせていそう。
引き続きSubSceneを利用する際のベストプラクティスを模索していきます。
以上!!
この記事が気に入ったらサポートをしてみませんか?