【研究作品】World
概要:様々なデザインパターンやシェーダ等の技術を色んなところに組み込んだ作品。
製作開始日:2023/6/28
制作期間:1ヶ月~
使用技術
- Composite
- Component
- シェーダ
- FlyWeight
- 当たり判定(球、直方体関係)
(今後も追加していく予定)
- Composite
Compositeについては、下記URLで使われているものを少し改変したものを使っています。
<変更点>
前回のコードだと他の処理もあり、一目でCompositeだと分かりづらいかもしれないと思いComposite自体を完全にクラス一つに独立させました。
UpdateとUpdateParent関数は少し名前が分かりづらいですが、UpdateParent内に派生クラスの処理を書くことで処理の順番を固定化し、間違えて別の関数を実行させて事故が起きてしまうケースを防ぎやすくしました。
- Component
このプロジェクトの中では特に力を入れていて、オブジェクトクラス内で必要に応じて追加することができるシステムになっています。より簡単に実装できるように、追加時の引数はできるだけ文字数を少なくさせています。
ただ、この実装のしかただと一覧(?)に必要な引数を載せる事ができません。現状このまま未解決なので、解決できるように取り組んでいきたいです。
コードを書く上で、できるだけUnityに近いコードの作りになるようにしています。Unityに近いコードで実装することができるような処理を書くのはとても苦労しました。
ただこの実装方法は、.cppに処理を書き込むと、「未解決の外部シンボル」となり、コンポーネントを新しく追加するにつれて
template void ComponentHolder::AddComponent<Behavior>(std::unique_ptr<Behavior>&& component);
template Behavior* ComponentHolder::GetComponent<Behavior>();
このようなコードを書かないといけなくなり、新機能の追加に時間がかかってしまいます。
なのでこの部分のコードだけは.hに書き込んでいます。
少し欠点はありますが、個人的に満足したものが出来たと思います。
- シェーダ
Componentとして実装できるようにしました。その際に、定数バッファをCPU内で編集する必要がありました。かなり無理やりなことをしているのかもしれません。
ただこれをすることによって、より簡単にシェーダの実装をすることができるようになりました。
- FlyWeight
主にテクスチャやモデルの管理に使っています。意味合いとしては間違っているかもしれません。
複数の別のオブジェクトに新しくテクスチャを貼り付けたりするとメモリ的に重たくなると思い、既に使うものを最初から実装し、それを使うようにしました。
ただ、もっといい感じの処理を作ることができるのではないかと考える事が多く、少しモヤモヤしているのが現状です。
- 当たり判定
シェーダと同じようにComponentとして実装できるようにし、より簡単に当たり判定をつけることができるようになりました。
個別で使えるようにする上で、オブジェクト毎に接触処理を変える必要があり、function型の変数を使うことで、それを実現させることができるようになりました。
直方体が関係する当たり判定では、ポリゴンの情報を用いて判定を取るようにしています。これをすることによって、様々な角度からでも当たり判定を取ることができるようになっています。
現在、VisualStudioの出力内に接触したことを知らせる処理しか書いていませんが、これを当たり判定クラス内の接触関数を呼び出すことで個別に処理できるようになります。
また、当たり判定管理クラスのコードも力を入れていて、できるだけ重複したコードを少なくできるように、テンプレートを活用しました。
この関数を実装することで、更新処理の中のコードがとてもスッキリしました