0113 NPCをいい感じに歩かせるために
はじめに
今回の記事は進捗の報告ではなく少し技術的な話であり、
プログラムに詳しい方に意見をいただくことを目的としたものです。
少しだけメイドさんゲーについても触れますが、あまり興味のわく話ではないと思います。
進捗記事は別で作成しますので、そちらをお読みいただければと思います。
メイドさんをいい感じに歩かせたい
現状ではこんな感じで通路の真ん中ではなく端を歩くようになっています。
理想としてはこんな感じに通路の真ん中を歩いてほしいと思っています。
どうでもいいかなとも思われるかもしれませんが、トラップを仕掛けるという遊びがあるので、できるだけわかりやすく動いてほしいんですよね。
端を歩くより極力、直進する方が進路を予想しやすいかと思います。
動画を見る限り出来ているように見えますが、場合によってはうまくいかないのが現状です。
A*アルゴリズム
ツクールMV では A*アルゴリズムという計算方法を使用しています。
これはマウスクリック時にプレイヤーが移動する際に使用されています。
Game_Character.prototype.findDirectionTo というやつです。
A*アルゴリズムでは通常ノード間の移動コストを踏まえて最短経路を導き出すのですが、ツクールMVのデフォルトの実装ではその仕組みがありません。
リージョン設定でマスごとの重みを指定することで
優先度を加えた経路探査が実現できるのではないかと思いここ二日ほどは
A*アルゴリズムを使用した経路探査を自作していました。
このページを参考にしています。
https://yttm-work.jp/algorithm/algorithm_0015.html
再実装した経路探査
元々のツクールの経路探査
自作の経路探査
使用したマップ
リージョン無しは移動不可
リージョンの数値ごとに移動コストが必要となる仕組みです。
14マスの山道(コスト4)を進むルートと
33マスの平坦な道(コスト1)を進むルートを比較して
よりコストが少ない平坦な道がルートとして選ばれました。
そしてこちらが自作の経路探査プラグインです。
https://github.com/Shun13156/MVplugins/blob/master/AStarSample.js
NPC用に作ったものですが、わかりやすいようにプレイヤー用に使える仕組みにしています。
コードを読んでいただくとわかるのですが
WeightedGraphで各マスのノードを初期化しているのですが、ほぼ使用していなかったり、本当にこれでいいのかなぁと思うような箇所があります。
詳しい方がいらっしゃったらアドバイスを頂けると助かります。
よろしくお願いします!