sound sepher's PASTIME

ゲーム開発で思ったことや、趣味などの話を書き綴っていきます。

【Unity】Tile World Creatorまとめ

TIle World Creatorについて

  • 3Dマップ自動生成機構
  • さいきんバージョンが3にアップデートされて便利になった
  • どんな機構かについては、アセットストアにて
  • マニュアルはここ
  • この記事は自分用の覚書なのでわかりにくいです

概要

  • TileWorldCreatorコンポーネントをオブジェクトにつける
  • ブループリントで生成ルールを設定してアセット指定してビルド
  • 生成位置はコンポーネントをつけた位置を基準に生成
  • コンポーネントにつけたアセット名が親オブジェクトになる
  • 同シーン内で複数マップを生成したい場合はアセット名を変えること

タイルの作り方

  • 図説したほうがわかりやすいので図説
  • 4タイルと6タイルルールがあるが、ここでは4タイルルールを採用

f:id:Ashtarte:20220327050116p:plain

これだとexteriorとinteriorをTilePreset設定で90度回転させる必要があった

f:id:Ashtarte:20220327050540p:plain

TilePreset設定(改善の余地あり)

ブループリント機能

ジェネレータ

DSP Dungeon
Cellular Automata
  • 島や大陸風のマップを生成
  • 細胞を増殖して消滅するまでの仕組みを利用して実装するやつ
L-System
  • 樹枝状に枝分かれする道を生成
Maze
  • そのまんま迷路を作る
Random Noise
  • 適当にノイズをちりばめる
  • Expand、Smoothで形を整えると大陸っぽい外観のマップができる
Paint
  • ツクール風に手動でタイルを塗るようにしてマップを描く

モディファイア

Add
  • 指定レイヤーにこのレイヤーを加算
Expand
  • タイル境界線を外側に1タイルぶん拡張
Shrink
  • タイル境界線を内側に1タイルぶん縮小
Invert
  • マップ配置を反転
  • 通常は外側へ開くが内側に閉じる作りにするのに使う
  • 屋内マップを作るのによく使う
Offset
  • 配置を指定方向へずらす
Overlap
  • 指定した2つのレイヤーの重複部を結果に出力
PlayerPosition
  • 図を3x3に分割して位置を指定すると、そこに1タイルぶん生成される
Select
  • ボーダー、エッジなど条件をもとに選択し、そこに結果を出力
  • ルールを使うと特定の位置に配置する
Smooth
  • 入力値ぶん、マップデータをなめらかにする
Subtract
  • 指定レイヤーからこのレイヤーを減算

生成用コード

SetCustomRandomSeed(int value)
  • シード値をセット
ExecuteAllBlueprintLayers()
  • ブループリントからデータを生成
ExecuteAllBuildLayers(true)
  • 生成されたデータをもとにビルドを実行
  • ランタイムでも実行可
  • ExecuteAllBlueprintLayersの実行が終わった後に実行するのがベター
OnBlueprintLayersCompleteイベント
  • ブループリント生成完了後に発火
  • ここにExecuteAllBuildLayersを実行するメソッドを登録すると良い
OnBuildLayersCompleteイベント
  • ビルド完了後に発火
  • ブループリント生成完了後に実行すること
  • デフォルトでは完了通知はここで出力するしかない

f:id:Ashtarte:20220327052447p:plain

実行はこんな感じで、完了後にイベント登録解除すること

バグ(Version 3.1.2p1 - December 09, 2021)

Tile Colliderの南方向当たり判定が反転している

  • スラッシュ型になっていないとならないのに、バックスラッシュ型になっている
  • 要するに、中に入れるけど外に出れない状態
  • これに付随してCollider Border Offsetも反転している
  • 修正コードは下記

f:id:Ashtarte:20220327052849p:plain

f:id:Ashtarte:20220327053334p:plain

エンバグが起きる可能性もあるので修正は自己責任で

Collider Border Offsetをマイナス値設定すると、コーナーの一部に当たり判定がつかない

  • これは仕様かなと思う

f:id:Ashtarte:20220327053609p:plain

赤矢印方向にぶつかると入れてしまう

見落としがちなミス

ランタイムでマップビルド時に「Cannot combine....」とエラー表示される

  • 使っているfbxの設定を参照、read/writeフラグを立てる

AddressableAssetSystem使用中、ビルド環境でのみTileWorldCreatorコンポーネントのアセット参照が切れる

  • おそらくどうしようもないので、他から参照を埋め込むコードを作る

参考

doorfortyfour.github.io