ブロック崩しで使いまわしやすいオブジェクトを作ってみた
先日から、ブロック崩しのアイデアが思いついたので新しく作っているcacaponです😄
ブロック崩し自体の進捗は諸々の事情で進んではいないのですが…💦
さて、今回のお題ですが
自動操作パドルを作った際に実現できたことのメモになります😄
今まで作っていたのは依存バリバリなオブジェクトを作っていたなか
今回は依存しないオブジェクトを何とか作れたので
それを紹介したいと思います😆
今回できたものはどんなもの?
自動操縦のパドルです
動画ではわかりにくいですが、上のパドルは
勝手にボールを追跡して跳ね返しています✨
デモ画面などに使う時に便利ではないかと思ってます😆
なんで依存しないオブジェクトを作ったの?
私が今まで作ってきたゲームの多くは
inspectorにオブジェクトを代入し
そのオブジェクトのデータを知る
といった形で作っていました。
しかしこのやり方だと、使いまわしが非常にやりづらいのです💦
例えば、Prefab化したパドルをテストステージシーンに置く、
本番ステージシーンに置くなどするときに、
毎シーン毎にボールのオブジェクトを紐づけないといけません😭
これはめんどくさい、というか保守できないなと感じたため
ならどうすれば依存しないというか、
Prefabをポンと置いたらどのシーンでも
使えるオブジェクトが出来たらいいなと思い、
それを目指して考えることにしました。
自動操縦パドルのアイデア
相手のボールの横位置が分かれば、
そこに向かって左右の位置を変える、
とすれば、自動操縦できると考えました😃
ロジックとしてはこんな感じでしょうか?
- ボールのオブジェクトを取得
- ボール.transform.position.xでx位置を取得
- パドル自身のx位置とボールのx位置を引いて距離を計算
- +か-かで左右どちらかに移動するか決める
今回問題になったのが「ボールのオブジェクトを取得」の部分😅
今まではinspectorでやっていたところを、
依存を無くすために別の方法で取得する必要がありました💦
結果、Triggerで相手を見つけるというアイデアを採用することに
色々考えた結果、
Triggerでボールオブジェクトを取得するのがいいんでないか?
という結論に至り、そこに向けて実装することにしました😄
まず、ボールオブジェクトを判定するために
オブジェクトにBallタグを追加しました。
次に、PlayerにBallを検知するためのコライダーを
広範囲に設定します。(このコライダーは is Triggerで設定)
そして、Player側のスクリプトに
OnTriggerStay2D
*1を実装する
コード例
private void OnTriggerStay2D(Collider2D other)
{
if (other.gameObject.CompareTag("Ball"))
{
float distance = other.transform.localPosition.x - this.transform.localPosition.x;
speed = other.gameObject.GetComponent<Ball>().speed;
if (distance + hitbetween < 0f)
{
mybody.velocity = new Vector2(-speed, 0);
}
else if (distance - hitbetween > 0f)
{
mybody.velocity = new Vector2(speed, 0);
}
else
{
mybody.velocity = Vector2.zero;
}
}
}
スクリプトの中で、ボールタグがあるか判断して処理しています😄
こんな感じで実装することで、inspectorにオブジェクトを入れず、
自動で追いかけるパドルオブジェクトが完成しました✨
もし、シーンにボールオブジェクトが無かったとしても、
追いかけないだけなので、他のシーンでもパドルをそのまま置く事は出来そうです😄
今回は、ブロック崩しのボールとパドルという限定的な関係の話ですが、
他のオブジェクトも依存を少なくして、
使いまわしがしやすいオブジェクトを作れるように
頑張っていきたいと思います😄
それではまた✨
*1:トリガー内にオブジェクトがあり続ける時に呼ばれるメソッド
2D用