見出し画像

Unityのエッジコライダー2DをC++でオマージュしてみる。 仕様を考える編


はじめに

今回は、C++でUnityのEdgeCollider2Dを作ります
なぜ、作ろうと思ったのかというと
2Dアクションゲームを作ろうと考えたときに
今まで、斜めのコライダーを作る技術がなく
四角形のコライダーと、円のコライダーで
誤魔化してきていたので
それを解消し、なおかつゲームの世界観をより
深いものにしたいと考えて作ろうと思い立ちました

……わざわざUnityの機能を再現するなら
ゲームエンジンでゲームを作ればいいのではという言葉が出てきそうですが
私は、プログラミング技術の向上も兼ねてゲームを作りたいので
あんまり、興味ないです

確認事項

・今回の作成は以下の環境で行われます
 ・Visual Studio 2022
 ・DxLib.vc.140
 ・使用言語 C++
・この記事の知識がすべて正しいとはかぎらない
・拙い文章
・誤字脱字

エッジコライダー2Dとは?

UnityにおけるEdgeCollider2Dとは
線(エッジ)で2Dコライダーを形成するコンポーネントです。一般的なBoxCollider2DやCircleCollider2Dとは異なり、単純な輪郭を作成するために使用され、複数の直線エッジでオブジェクトの形状を定義できます。

Copilotより

利点
・タイルコライダーを1つ1つをコライダーで生成するよりも
 大きな塊としてコライダーにできるので、軽量にできる
・コライダーを好きな形にできる上、回転できる
・ステージの地形をより、リアルなコライダーを付けることができる
・構成するのは主に点(座標)のみなので、事前に形決めやすい

欠点
・おそらく、大量のエッジを使うと計算処理に時間がかかる
・高速移動するオブジェクトとの衝突処理には、不具合がある可能性

新しい名前を決める

まずは、名前から決めましょう
私は今回作成するコライダーのクラス名前を

PositionsCollider2D

としました
そのまま「EdgeCollider2D」でもいいのではと思われそうですが
今の私が、エッジと言われて線だという意味に気づくのに慣れていないので
代わりに「座標の集合」というイメージを持って
「Positions」と表現しました

コライダーの完成イメージ

このコライダーは表示するとおそらく下のようになります

PositionsCollider2Dのコライダーのイメージ

うん☆圧倒的な画力不足☆
座標の集合体(コライダーの角)は、一本の線(コライダーの枠)で
結ばれておりそれによって
内積か外積を使えば衝突処理ができると見込んでいます

クラス設計(属性)

このクラスが持つ「属性」について考えてみましょう
私がまず思いついたのは
不特定多数の座標の情報を保存するための配列です

m_positons: vector<Position2D>

こんな感じでしょうか、不特定多数の配列情報を保存するためのvectorと
XとYの2次元座標の自作クラス、Position2D
これで、点の集合になったと思います

次に必要なのは、この座標をまとめて動かすための中心となる
座標情報でしょうか

m_transform: Transform2D

ちなみに、このTransform2Dは座標と向きの要素を持つクラスです

クラス設計(操作)

このクラスの「操作」を考えていきましょう
まずは、コンストラクタとデストラクタですね

PositionsCollider2D():
PositionsCollider2D(_transform: const Transform2D&, _positions:        vector<Position2D>):
~PositionsCollider2D():

この3つは最低でも必要でしょう

次は、他のコライダーと重なっているかを調べるための関数が必要でしょう

Intersect(collider: const PositionsCollider2D&): bool

「Intersect」は、交差の意味を持つそうなので
ちょうどいいと思ってその名前にしました

次は、衝突処理が必要になりますね

Hit(collider: const PositionsCollider2D&): void

簡単に「Hit」にしました
ちょっと微妙なセンスかも……

後は、設定や取得ですがそこまで考えるのは面倒なので
割愛させていただきます

設計のまとめ

ひとまず、一度ここまでをクラス図にしていきましょう
クラス図の書き方は間違ってない……はず

PositionsCollider2Dのクラス図

どちらにせよ、一人だから一度作ってみないと何もわからない
多分、作成するのに十分なクラス設計ができました

おわり

今回は、「Unityのエッジコライダー2DをC++でオマージュしてみる。 仕様を考える編」ということで、大まかな仕様を考えてみました
次回は、「Unityのエッジコライダー2DをC++でオマージュしてみる。 作成編 その1」というタイトルで来週にでも投稿しようと思ってます

それと、もっとちゃんと練ろうよと言われそうな気がしますが
どちらにせよ、一人で考えていることなので
一度、使える形にもっていった上で
再度仕様を修正し、確定させようと考えています

良ければ、次回も見てもらえるとうれしいです
それでは、これを読むあなたに良いことがあらんことを……

いいなと思ったら応援しよう!