【Unity2D】掴める壁と掴む処理の実装【未完】
こんにちは。なおキーヌです。
ブログ毎日更新は323日目になります。
前回「【Unity2D】移動処理とスプライト分割見直し」にて移動処理スクリプトの最適化とUnityEditorの拡張とかをやりました。
今回から本格的にコードを書いていきましょう。
今回は押す引く処理をするための前提になるであろう「掴む」処理に注目していきます。
処理をネタバレしておくと、掴むボタンを押したときに前方に掴めるものがあるかどうかを調べます。
真なら掴みモーションに切り替えで偽なら特に何もしないといった感じですね。
それでは作っていきましょう。
壁を実装して衝突判定を付ける
壁となるオブジェクトを作りましょう。
16×16の四角を作ってみます。
てきとうに16×16ドットの壁でも作ってみましょう。
テストなので一旦16×16のサイズの画像を作ってスプライトのテクスチャとしましょう。
Canvasの直下に「GrabWall」という2DSpriteオブジェクトを付け、壁テクスチャを適用しました。
このままだとプレイヤーがめり込んでしまえるので、プレイヤーオブジェクトと壁オブジェクトに
AddComponentで「Physics2D→BoxCollider2D」コンポーネントを実装してみましょう。
プレイヤーにはRidigBody2Dのコンポーネントも取り付けないとめり込んでしまいますので注意しましょう。
その際にGravityの値を0にしないとプレイヤーが下に落ちていってしまいます。
これで衝突判定が出来たので、プレイヤーがめり込まなくなりました。
壁にもRigidBodyを取り付けると何もしなくても押す処理ができあがってしまいます。
これはUnityの物理演算なので2Dゲームにはあまり向かない処理ですね。
最悪の場合めり込んでゲーム進行不可とかになるので極力は2Dでは物理演算でなにかするというのは使わないでおきましょう。
理解が深まってから導入してみると面白いかもしれませんが、初めのうちは扱いが難しいですね。
掴む判定のためにオブジェクトにタグを付ける
Unityにはオブジェクトにタグを付けることが出来ます。
タグをつけていると、そのタグを持つオブジェクトだけを調べるという事もできる優れものです。
結構古い情報なのですが、スクリプトでゲームオブジェクトを検索すると重くなっちゃうので
全てのオブジェクトにタグを付けて管理して無駄な検索をしないようにすることでゲーム処理を軽くする方法というのがあったのですが今でも有効なのでしょうか。
気になる所ではありますが、とりあえず掴む判定を取るためにオブジェクトにタグを付けましょう。
オブジェクトを選択してプロパティの名前の下にある「Tag」を選択して「Add Tag…」を選択すると
タグを自作することが出来ます。
ここでは「GrabOK」というタグを作りました。
プレイヤーの前方の調べ方
次に壁が目の前にあるかどうかを調べる必要があります。
これは色んなやり方があるのですが、せっかくなのでUnityの衝突判定(BoxCollideの衝突判定検出)を使って行きたいと思います。
ココは結構難しいのでしっかりと覚えましょう。
私が思いついた仕組みとしては、プレイヤーの向いている方が右だとしたら
プレイヤーオブジェクトのY座標は右端でX座標は中央(テンキーでいえば6の部分に該当)から
1px~5pxほど右にあるオブジェクトを取得します。
そしてそのオブジェクトがタグ「GrabOK」であればTrueを返してそうでなければFalseを返すようにしたいと思います。
恐らくもっといいやり方があるかもしれませんが、とりあえず思いついた処理を実装してみるのもプログラミングの勉強の1つです。
色々調べていると、どうやら「Physics2D.BoxCast」という命令が使えそうです。
これは特定の方向に四角の衝突判定を飛ばして衝突を検出するというものです。
これを前方に飛ばしてぶつかっているオブジェクトが掴めるものであれば掴むという事ができそうですね。
他にも方法としてスクリプトだけで現在座標の前方の1点を調べて、そこにオブジェクトがあるかどうかを調べるという方が軽そうですが、
折角なのでUnity2Dで用意してくれている命令を使ってUnityに慣れておきましょう。
……と、ここで少し詰まっています。
少し勉強不足なのでBoxCastについてちょっと勉強してきます。
判明次第追記します。
合致したら掴むアニメーションに切り替える
BoxCastでTrueが取れたら掴める状態なので、あとはアニメーションをその時に切り替えればOKです。
アニメーションの切り替えは歩くときや攻撃する時と同じにしておけばOKですね。
これについては簡単なのでこれ以上の解説はありません。
問題はBoxCastを使ってどうやって判定を取るかです。
中途半端な記事になって申し訳ないですが、ここでタイムオーバーです。
勉強することが増えましたね。
それでは。