物作り冒険譚この広告は、90日以上更新していないブログに表示しています。)先日ラジオを聞いていたら「1から10の数字であなたが好きなのは?」という質問がありました。自分は、6月生まれというのもあってか、「6」という数字が好きです。曲線が可愛くて、温かみがある気がします。リスナーの投票ランキングでは不人気な数字でした。∠):_さて、余談からになりましたが、前回の記事では「タイルマップの自動生成アルゴリズム」の解説をしました。今回はそれに関連して、これまた「Trocco」で使用した敵AIの作り方を紹介していこうと思います。0、実際の敵の挙動まず簡単に説明すると、前回解説した通り、1平方メートルを1マスとしてマップが作られるので、マップ上を移動するキャラクターは、碁盤のようなマス目を基本として移動するようにします。クロッシーロードのプレイヤーキャラの移動方法みたいな感じです。Whale)しかし、移動したいマスに障害物やアイテムがあった場合には、別の移動可能なマスに移動するようにさせる必要があります。プレイヤーが障害物を破壊した場合には、もうそのマスには移動可能になるので、それを敵AIが判断できるような仕組みを作る必要があります。実際に、ピンクの敵キャラ「うさぎソックス」が、プレイヤーが宝箱を壊した後にそのマスに移動している様子がこちらです。http://gph.is/28P31vP宝箱を壊す前は、宝箱と反対のマスに移動し、破壊後は宝箱があったマスに移動したのが確認できたと思います。これを実装するには、どんな風に考えていけばいいでしょうか。1、考え方まず前提として、基本的な敵の動きは、「プレイヤーに近づくこと」です。以下のようなマップがあるとします。この場合敵がプレイヤーに近づくための最短ルートは下のマスに移動することですが、マップ上ではないため、移動できません。次に最短ルートを移動するために左右のマスに移動できるか判断します。左はマップがありませんが、右はマップ上なので移動可能です。こんな感じでプレイヤーへ近づくための最短ルートを基本にして、そのマスに移動可能かどうかを調べ、可能なら移動、もしダメなら次のルートを調べる、といった考え方になります。右側に障害物があった場合には、最短ルートは上に移動することになります。いうわけで、移動先のマスが「マップ上で障害物等の移動を遮るものがない」ことがわかればOKです。それではどうやって調べれば良いでしょう・・・?早速ネタばらしをしてしまうと、これを実現するには配列を使用します。敵の移動は「最短ルート」を選ぶようにすると説明しましたが、これを遵守するとあまり賢くないAIができてしまいます笑たとえば以下のようなマップの場合、2つのマスの間を行ったり来たりするだけの挙動になってしまいます。「一個前にいたマスは他に移動できるマスがない限り移動しない」といった処理などを書く必要があります。本当に賢いAIを作りたいのであればこれでも不十分ですが、Troccoではそれほど敵を強くする必要はないと感じたので、これさえ実装していません。先ほどの図の例で考えていきます。Z]になり、すべてに「0」が格納された状態です。次にマップが生成されるので、マップチップがある場所に「1」を入れていきます。1;と書く感じになりますね。これで上の図を反映させた「array_MapList」の中身はこんな風になります。0=地面なし、1=地面あり011110111101111000110111101100あとは敵が移動先を決める時に、この配列の中身を見てあげるようにすれば良いだけです。「0」が返ってきたら移動できないので、「1」が返ってくるまで次のルートを探索するようにすればいいですね!ここまでわかれば障害物の確認も簡単です。障害物設置時に「array_MapList」に「2」を入れておきます。0=地面なし、1=地面あり、2=障害物あり011110111101211000120111101100となります。プレイヤーが障害物を破壊した時には、この配列にその障害物のXとZ位置の値を渡して、「1」を入れてあげれば、敵もそのマスに移動ができるようになります。敵どうしが同じマスに移動しないようにするのも、敵の移動時にこの配列に適当な値を入れてあげて、そのマスから去った時にまた「1」に戻してあげれば簡単に実装できます。3、敵AI以外の利用この方法はすごく便利で、敵の移動以外にも利用できます。Troccoではレールを敷いてプレイヤーキャラを動かしていくのですが、レールを敷いたマスに障害物がある場合はレールの色が赤くなって、障害物があることをわかりやすく示すようにしてます。http://giphy.com/gifs/26BRs32mvJY82zlFSこれも配列を参照して、障害物がある場合にはレールを赤くしておき、障害物が消えたら元の色に戻す、といった使い方をしています。他にも、破壊した時にたまに周りにちびキノコを増殖させる障害物のキノコも、周りのマップ状況を配列で確認して、他に障害物がなければ、増やすかどうかの判断をしています。http://giphy.com/gifs/l46C8EZqscIfQ3R3Gといった感じで、配列でマップの情報を簡単に確認できるので、タイルマップはとても便利です。ʕ•̫͡•ʕ*̫͡*ʕ•͓͡•ʔ-̫͡-ʕ•̫͡•ʔ*̫͡*ʔ-̫͡-ʔあと最後になりましたが、説明しやすいので配列を使いましたが、エンドレスなマップ生成をする場合はListを使ったほうが良いかと思います。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。