unityゲームプログラミング とにかくワラワラしたゲームを作るPart3 -最短距離の敵を探して向かう 実装-
前回テストプロジェクトでこねくり回して目的の
『最短距離の敵を探して向かう』
動きを達成したあと、気づいたらシューティングゲームになってしまっていた。
リストの使い方がだいぶ成長した。
ということで復習しながら、本来の目的の
『最短距離の敵を探して向かう』
をWaraWaraGameに実装する。
-最短距離の敵を探して向かう 実装-
目的を逸脱する前はこんな感じに仕上がった。
すごい数の白玉が出て、一番近い赤玉に向かっているのがわかると思う。
動画よりgifの方がわかりやすくていいな。データ容量少なくていいな。
現状はこんな感じ
クリックorタップすると白い玉が大きくなり、成長しきると、まっすぐ上に進む。
赤の玉にぶつかるとどちらも消滅する。
まぁとにかく、やり方はわかっているのでこれに『最短距離の敵を探して向かう』を追加する。
(やっぱり動画やgifがあるとパッとわかっていいな!
Part1,2はむちゃくちゃ思考をそのまま文章にしている+文章だらけなので、見にくさMAXだが、gifを入れることでグッと伝わりやすくなった。と思う。)
敵をPrefab化する
現状赤玉はGameObject直置きなので、Prefab化させて、ランダムに配置されるようにする。
できた。
できたが、fieldを設定してるのだが壁の役目のcolliderが薄っぺらいので外に漏れ出てしまった。
box colliderにして分厚くした。
だいぶ漏れにくくはなったが、ここまでたくさん作るならもうちょっと対策しないといけないな。
リストをたくさん使って色々管理
List<GameObject> listClone = new List<GameObject>(); List<DateTime> listStartTime = new List<DateTime>(); List<float> listMoveTime = new List<float>(); List<float> listMoveSpeedX = new List<float>(); List<float> listMoveSpeedY = new List<float>(); List<bool> listIsAttack = new List<bool>(); List<float> listAttackDelayTime = new List<float>(); List<GameObject> listTargetEnemy = new List<GameObject>();
今見て見たらTestで使ったListはこんなにあった。
もうちょっとわかりやすくしたいが、うーん。
まずGameObject型List
とりあえず、赤玉と白玉どちらもGameObject型のListを作り、Prefab生成時に入れる。
これはpublicにして赤玉、白玉それぞれのスクリプトで扱えるようにする。
public List<GameObject> listEnemy = new List<GameObject>(); public List<GameObject> listPlayer = new List<GameObject>(); void CreateBacteria () { nowBacteriaCount ++; var pf = Instantiate<GameObject> (bacteriaPf); pf.transform.SetParent (gameBack.transform, false); listPlayer.Add (pf); } void CreateEnemy () { var pf = Instantiate<GameObject> (enemyPf); pf.transform.SetParent (gameBack.transform, false);
なんか前も思ったが、もっとパッとさっと以前作ったスクリプトを他のゲームでもすぐに使えるようにしたい。iTweenみたいな感じで呼び出すだけでできるようにしたいな。
PlayerとEnemyをGameManagerで統括してるけど、これも引数で呼び出すことで、Listに追加できるようにして、リスト自体はそれぞれのManagerで管理できるといいな。
よくわかってないけど、基本的な部分は継承できるスクリプトとして整理して、やるといいのかな。
継承の継承できるのかなと思って調べたらできるみたい。
自分が思っていたのは単一継承というのか。
単一継承時のメモリ レイアウト
継承元AがMonoBehaviourを使っていれば、Aを継承したBはMonoBehaviourが使えるということ。
これは本当に使えるのかどうか試して見ないとわからない。
待てよ、そもそもGameManagerでListにいれなくても、Player側でstart関数に
Array.Add (this.gameObject);
を入れれば、普通にListにいれられるのか?
public staticにすれば普通に扱えた。ただ、staticにすることで関数内にいれられなくなったりする気がする。
PlayerでenemyのListを使いたいから、あれ、使えたな。staticを関数内で使えないのはstatic関数だけか?試してない。
Prefabにscript紐付けたらList使う必要がなかった…
ひえー、スクリプト分けたら、Listがenemyの一つのみでよくなった。
なんか以前タップで菌たちが移動するものを作った後にPrefabで分けようとしたことがあったが、だいぶ手こずって結局うまく分割できなかったことがあった。
だから今回も無理だと勝手に思っていたが、しかし、今回すっと実装できてしまった。
これも成長か?
成長だな。成長したな〜!笑
で完成したのがこれ。
きちんと最短距離の敵が消滅した時は次の敵に方向を変えられている。
次はノックバックを見た目的にいれて見たいが、ちょっと思いつかない。
次の記事で少し考えよう。
全然関係ないが、やっぱり集中したいときは暑すぎるのはよくないな。
今年初エアコンをつけたが、集中力が維持するのがイージーモードになった。