疎結合たのしーーーするためのメッセージライブラリ。Audioの再生・破棄等が気軽にできるライブラリ。Tweenライブラリ。設計を無視したら最悪になった最初はこのゲームを簡単なものと見積もり、「設計を一旦無視したらどうなるのか試してみよう」とテキトーにコードを書いていました、が。3日くらいで普通に拡張性ゼロのコードになってしまい、これは最悪でした。そもそも想定の5倍くらいは実装のムズイゲームだったので、あまりにも舐めていたというしかないです。「設計一旦無視したらどうなるのか試してみよう」の答えとしては、「どうも何もヤバイ」です。こんな実験みたいな体で横着はしません。グリッドベースかfloatベースかの見積もりが甘かった最初、ステージのサイズを管理するクラスはこんな感じでした。Vector2で書きました。!namespace表記は省略します。}}ですが、ステージ自体はグリッドベース(なんならTileMapでやろうと思ってたくらい)で十分だったので、ここはもっと違和感を覚えるべきでした。座標が1つズレている等のバグがなかなか治らなかった原因がこの辺の記述をあいまいにしてたからなので、もっとさっさと考え直すべきでした。この場合は、intとVector2Intに型を修正することによってバグが分かりやすくなりました。ブロックの判定に使うコードなのにカメラ端が端点になっているのが直感的にあまりにも分かりづらかった...識別で困ったらID作ってRepository/Registryに!カメラ移動を実装するには画面外の壁を動的に生成・破棄する必要があると分かり、壁オブジェクトを管理する必要が出てきました。最初はWall.transfrom.positionを一々見る感じで壁オブジェクトを識別しようかと思いましたが、それだとパフォーマンス的にも微妙だし、ちょっとわかりづらいなと感じました。}}そこで、個別にIDを用意し、Dictionaryを作って処理しました。これならアクセスの計算量はO(N)からO(1)に減りますし、コードの意味も分かりやすいです。wall);}ちなみに、DictionaryのKeyにあたるオブジェクトにはIEquatableを実装しておきましょう。標準で実装できるrecordなどを使うのもいいでしょう(Unityでrecord使うのちょっと面倒なので使ってませんが)。/*...[Riderで自動生成したIEquatableの実装コード]...*/}そしてDictionaryのアクセスを認めるだけのRepositoryクラスを作ればなおよかった気がします。実際には処理系を中に色々書いちゃったし、このクラス参照してDictionary見てるだけのクラスとかある。あと、こういうとき、Repositoryよりしっくりくる名前が欲しいけど分からない。ModelはModelできるだけViewとModelは分けて書くように意識しましたが、それでもまだまだだなと思いました。カメラの移動量を制御するのにCameraMaxMovementなるクラスを最後らへんに作ったのですが、もうちょい早めに気づいてもよかった気がします。最初はCameraMovementというMonoBehaviour継承クラスにフィールドとして置いていたので、他クラスで使えない状態でした。_isDone;みたいな状態を定義して書くことが多かったので、これの解決法を考えたいです。以下のコードならこう書きかえられることが分かりました。状態が減って分かりやすい。});}参考:https://qiita.com/yaegaki/items/bea845df0b011d515afbレベル設計が面倒だったレベルをUnity上で作成するとき、テンプレートとなるオブジェクトを早めに作っておきたかったのですが、イマイチ上手くいかず、この辺どうすればいいのかなと悩みました。VContainerのConfigureのSerializeFieldに突っ込む作業を毎レベルごとにやらないといけなかったのは、単純にシーン設計ミスったからだなーと今になって思いました。理想はVContainerの設定をするLifetimeScopeとレベルのGameObjectだけをヒエラルキー上に配置し、あとはUIやらなんやらは自動生成という感じなのかなーとか、色々と考え中です。あと、不要なオブジェクトを選択して誤って消したり移動したりしてしまうケースが多々あったのですが、編集をロックする方法があるようです。Tilemap辺りをあまり知らないまま使ったので、めちゃめちゃ判定の実装等で沼りました。勉強必須だなと感じました...。CompositeCollider2DはデフォルトでOutlineの設定になっており、境界線でしかColliderの判定がされないので、OverlayPoint2Dを使っても上手くいかない。OverlayBox2Dも境界線に触れてないと判定されないので注意。TileBaseからそのGameObjectを取得することは多分出来ない。Tileを使って動的な生成・破棄をする。LayerMaskの作り方(ビットを使ったり参照したり)などで3日くらい沼りました。なんかその時は体調も悪かった。あとはVContainerもちょっと仕様が分からず結構時間がとられました。それでもDIコンテナ使うと楽なのでトータルだとプラスな気もしますが。Factoryの作り方がイマイチ分からなかったので記事にしました。https://zenn.dev/qemel/articles/6dcafbc4ff3987おわりに今回もu1wでは色々勉強になりました。ゲーム制作したくてそこそこ暇な人はぜひ参加しよう!!次回はライブラリの説明や良かった部分について振り返ります。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。