Unityでの2Dアクションゲームにおける、コライダーの工夫の仕方。

  • 2
    いいね
  • 0
    コメント

Unity にて一時期、2Dアクションゲームを作ってみようと思い、スーパーマリオブラザーズの様なオーソドックスなアクションゲームを試みていました。Unity の Ver は 5.4.3f1 です。

しかし、Unity3D では Character Controller という簡易的で非常に便利な制御システムがあるんですが、実際に1からプレイヤーの制御を作っていくのは大変なんですね・・。

  • プレイヤーと地面との接地判定。
  • ジャンプの条件と軌道の調整。
  • プレイヤーがブロック等に横から当たった際の処理。

3番目の「プレイヤーがブロック等に横から当たった際の処理」については現在もどうしようか悩み中です。で、予想外に厄介だったのが、1番目の「プレイヤーと地面との接地判定」でした。
床については Scale 1×1 のブロックを敷き詰める感じで作っていくのですが、
『Scale X:1 Y:1 のスプライトを、Position X:1 の間隔で並べる』
上記の様に数値上はキッチリ設定しても、何故かSceneビューで確認すると、隙間が発生してしまいます。

Block01.png
※見た目的には問題無さそうですが・・

Block02.png
※実際はこんな風に・・。(注:数値上はちゃんと等間隔で隙間も出ない数値です)

Block03.png
※スプライトを消した状態。

この結果、どうなるかというと、プレイヤーのコライダーが四角形の場合、時折ブロックの継ぎ目の所で引っ掛かってしまうのか、それ以上右に進めなくなってしまうケースが発生してしまうのです。

ColliderBug01.png ColliderBug02.png
モーションとしては歩いていますが、実際はブロックの継ぎ目で引っ掛かって右に進めていません(の部分)。
こうなってしまうと、一旦ジャンプして継ぎ目を飛び越えない限り、いつまでも引っ掛かったままです。これはプレイヤーのコライダー形状が四角形だから起こる様です。

しょうがないから、Box と Circle の Collider をドッキングさせた形状にしてみました。
ColliderBun03.png
まあこれならブロックの継ぎ目には確かに引っ掛からなくなります。が、今度はブロックとプレイヤーとの接地面積が少な過ぎて、ブロックの端まで来るとそのままズルッと落ちていってしまいます。ブロックのギリギリ端までプレイヤーが進める仕様にしたい以上、これじゃ都合が悪過ぎます。ギリギリジャンプの際にもジャンプの高さがおかしな事になりますし・・。

しかし、これを解決してくれる材料を、Unityはちゃんと持っているんですね。
Inspectorビュー > Add Component > Physics 2D > Edge Collider という便利なコライダーです。これは、曲線こそ書けませんが、任意の形状(台形や三角形、六角形等)にコライダーを作る事が出来る様ですね。
EdgeCol01.pngEdgeCol02.png

※ Points の項目を開いて Size を指定し、頂点を編集していく事で右の画像の様なコライダー形状にも出来ます。

足元の両端のみ、上手く小さい切り込みを入れる感じで設定(の部分)。これにより、従来の Box Collider とほぼ同じ形状を維持出来る上に、これならブロックの継ぎ目で引っ掛かる事も無くなります。実際、これであれば、全く引っ掛かる事無くプレイヤーが進める様になりました。良かった良かった、これは素晴らしい!

・・本当は数値的に問題無い以上、継ぎ目で引っ掛かってもらっては困るのですが、仕方のない場合も出て来ると思います。そんな時は上手く別の解決策で解消しましょう。

以上、小ネタでした。

「さいたまげーむすライト」のページ。
https://play.google.com/store/apps/developer?id=さいたまげーむすライト

「さいたまげーむす」のページ。
http://saitamagame.com/