見出し画像

CCKのSubSceneを試してみた。


まえがき

モデリングでできることが増えてきたので
現在公開中の Club Wistariaの3Dモデルをリファクタリングしようと考えたときにCCKに「SubScene」というコンポーネントが追加されたことを知りました。

さっそく「SubScene」を触ってみたので、試行錯誤したものを書き残しておきます。(各コンポーネントの詳細については以下を参照してください。)

特に重要だと思ったのは以下の内容です。

シーンのロード状態はプレイヤーごとに異なるため、アバターやアイテムとサブシーンとのインタラクションは整合しない見え方になる場合があることに注意してください。

例えば、サブシーンが描画する領域にあるアイテムやアバターがサブシーンがロードされていない人から見た時に浮いてるように見えたり、物理挙動をするアイテムがサブシーンの Collider がある領域を透過したりします。

これらの問題を回避するために、 Collider をサブシーンではなくメインシーンに置いたり、大まかな見た目を SubSceneSubstitutes を使って表現したりすることができます。

Cluster Creator Kit ドキュメント

言葉だけで説明するので伝わるかが少し自信がないですが…。

メインシーンで手に持てるアイテムを作成しておき、メインシーンのアイテムをサブシーンで表示した部屋に放置してから、サブシーンが消える位置に移動するとサブシーンが非表示になったときに、メインシーンで放置したアイテムが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」を設定してみた。

2024/01/12 追記:
MeshFilterのMeshを削除した場合と
Mesh Rendererのチェックを外した場合を比較したが
メインシーンのサイズに違いはなかったのでMesh Rendererのチェックを外すほうが作業量は少なそう

EditOnly Objects

メインシーンで使用するReflection Probeをベイクするためのオブジェクト
(説明のために非表示を解除しているが、ベイクする時以外は非表示)

エレベーター内の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を利用する際のベストプラクティスを模索していきます。
以上!!

この記事が気に入ったらサポートをしてみませんか?