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」と表現しました
コライダーの完成イメージ
このコライダーは表示するとおそらく下のようになります
うん☆圧倒的な画力不足☆
座標の集合体(コライダーの角)は、一本の線(コライダーの枠)で
結ばれておりそれによって
内積か外積を使えば衝突処理ができると見込んでいます
クラス設計(属性)
このクラスが持つ「属性」について考えてみましょう
私がまず思いついたのは
不特定多数の座標の情報を保存するための配列です
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」にしました
ちょっと微妙なセンスかも……
後は、設定や取得ですがそこまで考えるのは面倒なので
割愛させていただきます
設計のまとめ
ひとまず、一度ここまでをクラス図にしていきましょう
クラス図の書き方は間違ってない……はず
どちらにせよ、一人だから一度作ってみないと何もわからない
多分、作成するのに十分なクラス設計ができました
おわり
今回は、「Unityのエッジコライダー2DをC++でオマージュしてみる。 仕様を考える編」ということで、大まかな仕様を考えてみました
次回は、「Unityのエッジコライダー2DをC++でオマージュしてみる。 作成編 その1」というタイトルで来週にでも投稿しようと思ってます
それと、もっとちゃんと練ろうよと言われそうな気がしますが
どちらにせよ、一人で考えていることなので
一度、使える形にもっていった上で
再度仕様を修正し、確定させようと考えています
良ければ、次回も見てもらえるとうれしいです
それでは、これを読むあなたに良いことがあらんことを……