雑学豚の巣穴

盛大なメモ帳

アクションゲームの仕様と実働

アクションゲームを作るという概要は決まったけれど

何をしたいかという基本的な設計と

その基本を実現させる詳細な設計が必要になる。

 

プレイヤーと地面があって

プレイヤーは重力を受けて下方向に引っ張られる

プレイヤーは地面の中に進入できない

左右ボタンを押して左右に移動してジャンプボタンで縦方向上に移動する

無限ジャンプ禁止のため地面に乗ってる時だけジャンプが有効
などなど…
 
日本語でやりたいことを決めたが、
無限ジャンプ禁止のため地面に乗ってる時だけジャンプが有効
なんかは言葉にすれば簡単だがどうすれば地面の上なのか?というのは詳細に決めていかなければならない。
 
・地面の判定
参考にしたサイトは2つほどあるが、
足元に当たり判定無いオブジェクト置いてそのオブジェクトが地面接触してるかフラグ持てば良くない?」という解決法を提案されている。
プレイヤーとは別の足元っていう物体を用意してそこに何かが通過したら地面かどうか判定する。敵かどうかも判定できるし。
 
対して思うところは、
「プレイヤーの当たり判定で地面の当たり判定と当たってんだから
足元に変なのくっつけるよりそっちの本体だけで判断するのが直感的じゃない?」
と、なる訳でー調べてみると
「足元にある物体の設定(タグやレイヤー)が何であるか?を調べて地面と一致すればいい」となる
足元の物体が地面だったら地面の上!そりゃそうだ。
 
しかし参考サイトでは、当たり判定の主たるコライダーじゃなくてオブジェクトの足元がどうかで判断してるのが見受けられた。
プレイヤーの画像の足元じゃなくて当たり判定の足元が地面かどうか調べたいの!
プレイヤーの画像より当たり判定のが小さいのはシューティングとかでよく見る感じだし。
まずはこれを参考にしてコライダーに変えればいいや
 
日本語にすれば、
本体のコライダーの位置取得してー足元の位置割り出してーそこまでに地面のタイル判定があったら地面に接地してるよ!…
日本語にすれば早いが特定の位置数値はなんやねんどうやって取って来んねんと
 
まずは使ってるカプセルコライダーのリファレンスマニュアルを見る。
次いで親のコライダーのクラスを見るboundsってのがワールド座標うんたらで怪しい
Collider2Dのスクリプトリファレンスコピペ

attachedRigidbody The Rigidbody2D attached to the Collider2D.

bounciness Get the bounciness used by the collider.

bounds コライダーのワールド座標のバウンディング空間

composite Get the CompositeCollider2D that is available to be attached to the collider.

density 質量の計算に使用されるコライダーの密度( auto mass が有効の場合)

friction Get the friction used by the collider.

isTrigger コライダーはトリガーとして設定されているかどうか

offset コライダージオメトリのローカルでのオフセット。

shapeCount コライダーに含まれる領域の数

sharedMaterial The PhysicsMaterial2D that is applied to this collider.

usedByComposite Sets whether the Collider will be used or not used by a CompositeCollider2D.

usedByEffector コライダーが Effector をアタッチしているかどうか。

 

 

ところどころ翻訳しないちょろめさんそのままコピペ

 

 
Boundsクラスも確認する
Boundsのスクリプトリファレンスコピペ

変数

center バウンディングボックスの中心座標

extents The extents of the Bounding Box. This is always half of the size of the Bounds.

max ボックスの最大値。常に center 変数と extents 変数を足した値となります

min ボックスの最小値。常に center 変数から extents 変数を引いた値となります。

size ボックスのサイズ。常に extents の 2 倍です。

 
bounds.centerで座標取れそう(コライダーの中心座標)
bounds.extentsのy(コライダーの半分の高さ)を足したのが足元座標って事かな?
足元座標そのままだと怪しいからミリ下の物体の情報を取るため定数も足す
0.005fを足した。
 
本体のコライダーの位置取得してー足元の位置割り出してーそこまでに地面のタイル判定があったら地面に接地してるよ!
Collider2Dのbounds.centerからbounds.extents.yと接触幅定数分だけ下にある物体のレイヤーが地面だった場合、そのCollider2Dは地面に接している。
 

f:id:rrroo:20200323205306p:plain

地面の上に居る
中心部分だけだとギリジャンできないから左右…extentsのxを足したり引いたりした位置の足元も地面か調べよう。

f:id:rrroo:20200323210237p:plain

このままだと赤が地面かは調べられるけど黄色が地面かは調べられない
理論上はできたから実行
…してみたらたまに上手くいかない。
 
ジャンプして着地したら地面乗ってない判定が出る…なんでや
そう!いくら足元直下情報が欲しいとしても0.005が小さすぎたのである!
0.03くらいで運用する。
 
テストしていると左右の足場判定も怪しい事になっていた
壁に突撃してると地面に乗ってる判定が一瞬出るのである!

f:id:rrroo:20200323210826p:plain

黄色部分がめり込んで足場判定が一瞬出る
詰まった所を紹介
横の足元はめり込む前提のちょっと内側配置にしてみるとかで対応。
 
こういう足元チェック関数を作っていると頭上の頭ぶつけた関数もすぐ作れるから良しっ!
重力反転ってステージ作る場合があってもすぐ対応できるのが魅力である。