![見出し画像](https://assets.st-note.com/production/uploads/images/127345430/rectangle_large_type_2_e6d293795fbbfc3c1afcb8e887ee18fc.png?width=800)
CCKのSubSceneを試してみた。
まえがき
モデリングでできることが増えてきたので
現在公開中の Club Wistariaの3Dモデルをリファクタリングしようと考えたときにCCKに「SubScene」というコンポーネントが追加されたことを知りました。
さっそく「SubScene」を触ってみたので、試行錯誤したものを書き残しておきます。(各コンポーネントの詳細については以下を参照してください。)
特に重要だと思ったのは以下の内容です。
シーンのロード状態はプレイヤーごとに異なるため、アバターやアイテムとサブシーンとのインタラクションは整合しない見え方になる場合があることに注意してください。
例えば、サブシーンが描画する領域にあるアイテムやアバターがサブシーンがロードされていない人から見た時に浮いてるように見えたり、物理挙動をするアイテムがサブシーンの Collider がある領域を透過したりします。
これらの問題を回避するために、 Collider をサブシーンではなくメインシーンに置いたり、大まかな見た目を SubSceneSubstitutes を使って表現したりすることができます。
言葉だけで説明するので伝わるかが少し自信がないですが…。
メインシーンで手に持てるアイテムを作成しておき、メインシーンのアイテムをサブシーンで表示した部屋に放置してから、サブシーンが消える位置に移動するとサブシーンが非表示になったときに、メインシーンで放置したアイテムがDespawn Heightの位置まで落下するという挙動をすることを確認しました。
実験をした時には1人だったので複数人がワールドにログインしている状態で同期処理によってどんな挙動になるかの実験はしていませんが、サブシーンによってコライダーの表示がかわるとまずそうなのでこの辺りの問題がおきなくなることを考慮してシーンの構成を考えてみました。
シーンの構成
リファクタリング中のワールドなので部屋が2つしかない状態ですが…。
以下の3つのシーンに分類してみました。
MainScene
エレベータ(スポーン地点)
SubScene001
クラブのエントランス
SubScene-ReflectionProbes
全サブシーンのReflectionProbesをまとめておくためのサブシーン
MainScene
![](https://assets.st-note.com/img/1704976785425-tQOnVakYzx.png?width=800)
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
![](https://assets.st-note.com/img/1704979673154-KSlFY0ltpJ.png?width=800)
エレベータの内装をまとめた Prefabs
(メインシーンのオブジェクトなのでコライダー設定を付けた状態)
ColiderOnly Objects
![](https://assets.st-note.com/img/1704977577524-Rx2oXCTEwe.png?width=800)
BundleSubScene_001(エントランスの内装をまとめた Prefabs)から
BoxColiderのみの設定のみをまとめたもの
メインシーン内にすべてのコライダー情報を保持しておくことによって
サブシーンの描画や削除のタイミングによって当たり判定がユーザによって異なることを防いでいます。
![](https://assets.st-note.com/img/1704977732573-Qf5X6xZl0X.png?width=800)
容量の軽量化に繋がるかは実験をしていないが、今回はMeshFilterのMeshを削除している。
コライダーが不要なオブジェクトについてはTagに「Edit Only」を設定してみた。
2024/01/12 追記:
MeshFilterのMeshを削除した場合と
Mesh Rendererのチェックを外した場合を比較したが
メインシーンのサイズに違いはなかったのでMesh Rendererのチェックを外すほうが作業量は少なそう
EditOnly Objects
![](https://assets.st-note.com/img/1704977973296-Cj3lJoXud6.png?width=800)
メインシーンで使用するReflection Probeをベイクするためのオブジェクト
(説明のために非表示を解除しているが、ベイクする時以外は非表示)
![](https://assets.st-note.com/img/1704978196550-jUyWOb81Gu.png?width=800)
この「EditOnly Objects」を設定しないと、エレベータより外は何もない状態になるので、エレベーター内なのに物体の反射内容に「空」が映ることを防ぐ目的で用意している。
SceneLoadColiders-SubScene-ReflectionProbes
![](https://assets.st-note.com/img/1704978671812-9DzeE9471z.png?width=800)
SubScene-ReflectionProbesを呼び出すためのコライダー
(今回はメインシーン以外のReflectionProbeを1つのサブシーンにまとめる想定のため、ワールド全体にかかるようにコライダーを設定した。)
SceneLoadColiders-SubScene001
![](https://assets.st-note.com/img/1704978822402-dTFrlSkgSG.png?width=800)
SubScene001を呼び出すためのコライダー
(今回はまだ部屋数が少ないので「SceneLoadColiders-SubScene-ReflectionProbes」と同じ内容になっているがSubScene001が視界に入る部屋に設定するイメージ)
Reflection Probes:TMP-RP-roomA-Center
![](https://assets.st-note.com/img/1704979081709-uoc2rZ965m.png?width=800)
スポーン地点のメインシーンから、サブシーンがすぐ目の前にあるので
「SubScene-ReflectionProbes」の読み込みが完了するまでの一時的なSubScene001専用のReflectionProbe設定
(これがないとエレベーターまえの大理石のタイルに青空が映る)
「SubScene-ReflectionProbes」を読み込んだ時点で不要になるため
Sub Scene Substitutesコンポーネントをつかって非表示にする設定を追加している。
Sub Scene Substitutesの詳細については以下を参照してください。
SubScene001
Hierarchyの内容はオブジェクトが1つしかないので省略
BundleSubScene_001
![](https://assets.st-note.com/img/1704980032738-AuWzcXkVG3.png?width=800)
エントランスの内装をまとめたPrefabs
コライダー設定はメインシーンで保持しているので不要
ReflectionProbeも専用のサブシーンを作成するので不要
とてもシンプル!!!
SubScene-ReflectionProbes
![](https://assets.st-note.com/img/1704980434708-RzsPOWv8Oy.png?width=800)
Hierarchyの内容
Directional Light(省略)
EditOnly Objects(グループ化用のEmpty:TagにEditOnlyをしているのでClusterにアップロードされないオブジェクト)
BundleMainScene(エレベータの内装をまとめた Prefabs)
BundleSubScene_001(エントランスの内装をまとめた Prefabs)
Reflection Probes(グループ化用のEmpty)
roomA-Center(エントランス用のReflection Probe)
EditOnly Objects
![](https://assets.st-note.com/img/1704980876474-x4tBGN88Mb.png?width=800)
MainSceneの「EditOnly Objects」と同様にReflection Probeのベイクをする場合にだけ表示して、ベイク以外は非表示にしておくグループ
MainSceneの「EditOnly Objects」との違いは
全てのサブシーンの内装をまとめた Prefabsを設定すること
(今回はサブシーン内にメインシーンのオブジェクトが反射する位置にあるのでメインシーンのprefabsも含んでいる)
Reflection Probes
全てのサブシーンのReflection Probeをまとめておくためのグループ
![](https://assets.st-note.com/img/1704981087737-QH6IpDNqht.png?width=800)
動作検証
![](https://assets.st-note.com/img/1704981481061-UOhhOztJZV.png?width=800)
Windows メインシーンサイズ: 5.86MB
Windows サブシーン1サイズ: 0.89MB
Windows サブシーン2サイズ: 0.01MB
サブシーンの名称が表示されていないのでどっちがどのサブシーンかは
わからないがひとまず現時点でメインシーンの容量を約1MB減らせていそう。
![](https://assets.st-note.com/img/1704982064934-SrSLlybXdO.png?width=800)
引き続きSubSceneを利用する際のベストプラクティスを模索していきます。
以上!!
この記事が気に入ったらサポートをしてみませんか?