unityゲームプログラミング とにかくワラワラしたゲームを作るPart2 -最短距離の敵に向かうには?-
前回なんともシンプルなプロトのプロトを作った。
今回は前回ちょっと思っていた、最短距離の敵を探して向かうプログラムを作る。
大きな壁
プロトのプロトは完成したが、大きな問題がある。
それはどうやって敵を検出してその敵に向かうかだ。
現状まっすぐにしか行かない。敵もその直線上にしか配置していない。
一体ならその敵のポジションを取得して向かわせることはできるが、どうやったら一番近いと判定できるか?
あー、時間か。一定速度で移動してかかる時間で一番短い敵に向かう、的なものなら悪くないな。
サンプルを作って色々試す
一番近い敵を探して向かう。
これを一番シンプルにして考えてみると自分、敵それぞれ一体いるMAPで自分が敵の場所に行くことだ。
これは以前タップした位置に向かうサンプルと同じ仕組みなのでできる。
タップした位置の座標に向かう。
⇨敵の座標に向かう。
サンプルの仕組みではタップした位置に複数のGameObjectがそれぞれ向かう。
ある意味これは敵一体に対して仲間全員がワラワラ集まる感じだ。
敵が複数いる場合にどうするかだよな。
void MoveReadyClone() { for (int i = 0; i <= countClone; i++) { moveSpeedX = 0.0f; moveSpeedY = 0.0f; var disX = worldClickPosition.x - listClone[i].transform.position.x; var disY = worldClickPosition.y - listClone[i].transform.position.y; var disXTime = Math.Abs(disX) / MAX_MOVE_SPEED; var disYTime = Math.Abs(disY) / MAX_MOVE_SPEED;
最大速度でX,Yそれぞれかかる時間を割り出している。これは目標座標(1つ) * 仲間(複数)を行なっている。
目標座標もリスト化させて、目標座標(複数) * 仲間(複数)
目標座標(複数)と仲間(一つ)で最短の座標を割り出してそこに向かわせる * 仲間の数分。やるプログラムを書けばそれぞれ、最短の座標に向かうんじゃないか?
これを検証するにはどうしたらいいかな。
最短距離の敵を見つけたら、その座標に向かわせる。その座標に向かわせることはできる。
最短距離の敵を見つけることができればいいんだな。
頭の中ではイメージできてる。リストに入ってる敵のX,Y座標への最短時間を順番に計算していって、一番低い数字の敵のX,Y座標を記憶して、その位置に向かう。
とりあえず、Listに複数の敵を入れて、指定の敵に向かわせるようにはできた。
ここから最短の敵の座標を見つけるプログラムをかく。
とりあえず動くプログラムが書けた。
動作も重くなさそうだし、結構優秀かもしれない。
gameObjectをリスト化させるだけで、gameObject単体で紐づいているx,y座標などが簡単に取得できるおかげでだいぶ楽だった。
このあと『最短距離の敵を見つける』以外に
- 敵の周囲を飛ぶように
- 白玉が攻撃するように
- 敵がやられるように
などを実装して見たら下記のように自立型ドローンのシューティングゲームができた。
もうこれに強化要素足して、見た目を整えたらこれはこれで立派なゲームになる。
次回はもともと考えていたWaraWaraGameの続きを作る。
最短距離の敵に向かう
を実装する。