ushibutatorism

がんばって言語化するぞ(カテゴリごちゃ混ぜです)

【unity1weeks】宿題消化:現在地周辺のオブジェクトだけを生成する

背景

先日のUnity1Weeksで公開したゲームについて、まとめ記事を書きました。

note.com

色々勉強しなきゃいけないことがどんどん溢れ出てきて、気づけばずっと同じゲームのコードばかり弄っていました。

これではいかん、もっと違うゲームも作りたいと思ったので、汎用的な勉強課題は次のゲーム制作時に取り組むことにして、とりあえずこのゲーム固有の、かつ簡単そうな宿題だけ消化することにしました。

宿題

https://assets.st-note.com/production/uploads/images/41954737/picture_pc_2f08f1c10ec7055ff43779903e3d4803.png?width=800

リリース時は、上記のような状態でゲームが動作していました。

現在地から見えない範囲もすべて開始時に生成してしまっています。

100×100などの大規模ダンジョンを想定した時に、今のつくりだと超大量のオブジェクトを生成することになるのでさすがに無駄が多すぎます。

これをどうにかする宿題が残っていました。

修正

ObjectPoolの仕組みが向いてそうだったので、ObjectPoolを使って現在地周辺のマス目のみを動的に生成するように修正しました。

  • 現在地の更新時
    1. 周辺のマス目データ(ドアや壁の有無など)をモデルから取得する
    2. 範囲内に未生成のオブジェクトがあればObjectPoolから取得(Rent)する
    3. 範囲外に出たオブジェクトはObjectPoolに返却(Return)する

f:id:ushibutatory:20210115141944g:plain
ObjectPoolを使って現在地周辺のみ生成する

一番右のゲーム画面だけでは分かりづらいですが、左のhierarchyを見ると、きちんとオブジェクトが使いまわされていることを確認できます。
(自身の周辺 5 × 5 = 25個 と、移動後に範囲外になってプールに返却された5個の、最大30個)

おわり

現状、甘いところは多々あると思いますが、ずっとこればっかり触ってても勉強速度が上がらないので、この宿題の解決を区切りとしたいと思います。

ソースコードは以下 github.com

余談

本当はこの記事、元記事と同じくnoteに投稿するつもりだったんだけど、アニメーションgifの貼り付けがうまく行かなくて諦めました。