unityゲームプログラミング とにかくワラワラしたゲームを作るPart4 -ノックバック-
前回でリアルタイムに白玉が個々に一番近い赤玉を探して、向かうというプログラムが完成した。
次の段階は現状のプロトのプロトからゲーム的に少し整えたい。
だが、なんかノックバックを作りたいと思ったので、この記事はゲームとして整える前に白玉と赤玉が接触した時のノックバックを考えたいと思う。
ノックバックはどう実装する?
白玉は進んでる方向はデータとしてあるので、その方向に * -1 して一定距離離れさせればノックバックになると思う。
しかし、赤玉はもともと止まっている。
ちらっとOnCollisionEnter2Dについて調べてる時に
『接触時の座標を取得できる』的なことが書いてあった気がする。それを使って赤玉の中心座標と接触座標を比較して、接触座標の方角と反対側に移動させれば、ノックバックが実現できるかもしれない。
赤玉がそれでできるなら白玉もそれで実装する。
イメージ構想
構想的に白玉(味方)はプレイヤーの意志で動かせるようにしようと思っている。且つ敵も攻めてくるものを想定してるから、白玉が止まっているところに赤玉が突っ込んでくるシチュエーションが必ずある。
後、接触判定をOnCollisionEnter2Dを使っているためEnterした後Exitしないと接触の再判定が行われない。
お互いノックバックを起こせば、強制的にExitさせることができる。
Collider2Dについて調べて見た
Materialってなんだろうと思って調べてみると2Dの場合は摩擦と弾性を決めることができるらしい。その数値をMaterialといったもので管理するようだ。
参考記事:Physics Material 2D - Unity マニュアル
実際に使ってみると他のGameObjectに対しても物理的な動きを与えるようだ。これは対象がRigidBodyをコンポーネントに追加しているものだからかもしれない。
RigidBodyをいれないでColliderだけいれているGameObjectはぶつけられても動かなかった。そりゃまーそうか。それを使って壁を作ったわけだし、そうだな。
今度はRigidBody2Dを調べて見た
参考記事:Rigidbody 2D - Unity マニュアル
RigidBody2DにはBodyTypeというものがあり、3種類ある。
- Dynamic (動的)
- Kinematic (キネマティック)
- Static (静的)
物理演算を使いたい場合は動的を選ぶらしい。動的の説明を読んでいるとtransformコンポーネントでいじらないでくださいって書いてあった。
自分の使い方だとRigidBodyは被らないようにするためだけに使っている。
処理的に動的が一番重いらしい。動的な使い方必要ないのに、無駄に負荷をかけていたことになる。
途中だが、この続きは次の記事で書く。
(記事作成途中で長い間放置してしまったため、一旦区切る)