Labyrinth – レベルストリーミング

概要

Labyrinthはモバイルをターゲットにしていることから、レベルのロケーションにおける全ての背景アセットをロードしておくのは無理があります。

例えば、部屋①、部屋②があって現在部屋①にいる場合、部屋②はアンロードの状態にしておきます。

部屋②に近づいた際に、レベルストリーミングの機能を使って指定した背景サブレベルをロードしたりアンロードしたりすることで、メモリ使用量や描画負荷を抑えることができます。

※背景以外にVFXや環境音などもレベルストリーミングの対象にします。

設計

レベル構成の文書に記載の通り、マップをいくつかのエリアに分けてアセットを管理します。

Labyrinth – レベル構成

2019年12月4日

現在プレイヤーがどのエリアにいるかによって、必要なサブレベルをロードし、不要なサブレベルをアンロードします。

サブレベルの管理

エリア毎のサブレベルの管理はExcelで作成し、JSON形式で扱います。

この画像では、プレイヤーがAreaAに入ると、背景サブレベルのAreaAとAreaBがロードされ、AreaCがアンロードされます。

API

外部マクロ

LbLoadSubLevelsFromAreaName

  • 引数
    • Area Name
      対象のエリア名
  • 戻り値
    • 実行ピン

LbWaitVisibleSubLevelsFromAreaName

  • 引数
    • Area Name
      対象のエリア名
  • 戻り値
    • 実行ピン(Out)
    • 実行ピン(Completed)

LbASyncLoadAreaSubLevels

  • 引数
    • Area Name
      対象のエリア名
  • 戻り値
    • 実行ピン
  • 詳細
    内部的にLbLoadSubLevelsFromAreaNameLbWaitVisibleSubLevelsFromAreaNameを呼び出します。

内部実装

GetAreaName関数

  • 引数
    なし
  • 戻り値
    • Area Name
      現在のエリア名
  • 詳細
    ゲーム進行、プレイヤーの現在値などを元に、現在のエリア名を取得する。Gameflowサブレベル毎に実装する。

シチュエーション別実装例

部屋①と部屋②が直線の通路で繋がっている

  • 部屋①と部屋②は互いの部屋から見ることはできません。
  • 部屋①と通路、部屋②と通路の間には扉があります。

この場合、部屋①から通路半分までをAreaAにして、通路残り半分と部屋②をAreaBにします。
通路はAreaAもAreaBもロード状態に設定します。

部屋①から通路に出て、部屋②に近づくとAreaBに入ります。この時に部屋①をアンロードし、部屋②をロードします。

部屋①と部屋②が扉一枚で繋がっている

  • 部屋①と部屋②はお互いの部屋から見ることは出来ません。
  • 扉を開いた際には扉越しに両方の部屋が見える状態になります。

このままの仕様では、扉を開いている間はお互いの部屋を見ることが出来るため両方ロードしておく必要があります。

しかし部屋というロケーションは要素が多く、メモリ的に「1部屋まで許容するのか、2部屋まで許容するのか」によって部屋の作り込みに大きく差が出てしまいます。

どうにかしてメモリに乗せるのは一部屋分にしたいところです。

以下、検討中

案:移動時にカットシーンを挟んでロード

部屋①にいる間は部屋②をロードしない。部屋②へ繋がる扉などを調べた際に短いカットシーンを挟み、その間にロードする。

参考