ツクールMVの経路探索が重い(SmartPath.js)

ツクールMVには標準で経路探索機能が付いています

ツクールMVのスクリプトファイル「rpg_objects.js」内に「Game_Character.prototype.findDirectionTo」というメソッドがあり、ここで経路探索の処理が定義されています。

中身までしっかりと読んでないので詳しい処理は分からないのですが、A*アルゴリズムという効率的な方法で目的地までの最短距離を計算しているらしいです。

この機能を使えば特定のイベントを目的地に導いたり、プレイヤーを正確に追いかけたりとかなり精度の高い誘導が可能なのですが、標準のイベントコマンドから使用する事はできません。

経路探索を簡単に使用するには、公式プラグインの「SmartPath.js」を使用します(RPGツクールMVのユーザー登録が必要です)

SmartPath.jsプラグインの経路探索が重い

自分自身、制作したゲームで追いかけてくる敵から逃げるシーンにSmartPath.jsプラグインを使った経路探索を使用しているのですが、この処理が何故かすごく重い。

パソコンやタブレットではあまり気になりません。しかし、スマホでブラウザプレイするとはっきり分かるほどにカクカクして処理が追いつかないのです。

特に、下の画像のように移動経路が無くなった時に一気に処理が重くなります。

これは経路探索が目的地までの最短距離を見つけた時点で計算を終了するのに対して、壁などに遮られて目的地までの距離が遠くなると、遠回りをしてでも辿り着こうと限界まで処理を続けるためと思われます。

正直、スマホでは壁に引っかかった経路探索中のイベントが1つ存在するだけでプレイ継続が困難になるほど重い時があります。

追記:改めて調査した結果、それ以上に重くなっている理由が判明しました。
SmartPath.jsプラグインではキャラクターが停止している時に次の経路を探索するのですが、壁などにぶつかっている状態も「停止」していると見なされるため、毎フレーム、1秒間に60回も経路探索の計算を行っていました(そりゃ重くなるわけだ)

ツクールMVの公式プラグインは権利の関係上、再配布ができないので各自でプラグインを改造するなどの対策をお願いします。

探索範囲の上限値を変更してみる

妥協案になりますが、経路探索の範囲の上限を制限する事で処理の軽減をしてみようと思います。

経路探索の処理を定義している「findDirectionTo」のすぐ下に、「searchLimit」というメソッドがあります。

Game_Character.prototype.searchLimit = function() {
  return 12;
};

ここにある「return 12;」の数字を変更する事で、探索範囲の上限を変えられます。上限値を低くすると、経路探索の精度が低くなる代わりに処理は軽くなります。

自分はゲーム制作時、「return 6;」と標準の半分の値にしてみました。それでもイベントが壁に詰まった時はカクつきますが、最初よりはだいぶマシです。

逆に、「return 100;」とかにするとマップのどこにいても追いかけてくるレベルの敵イベントが作れるでしょうね(パソコンでもカクつく重さになりますが)

上限値を下げて処理を軽くする際に上手くイベントを追跡させるためのポイントは以下の通りです。

■マップを小さくする■
経路探索の計算が少なく済むので処理が軽くなります。

■イベントの移動速度と移動頻度を上げる■
追跡対象に近い速度で追跡できれば、対象と離れすぎて探索範囲外に出てしまう事を防げます。

探索範囲を変更するプラグイン

ツクールMV標準の経路探索範囲の上限を変更するだけのプラグインを作りましたので、よろしければご利用下さい。