前回までの続きです。
今までは、大きく分けて二つの処理、
・全マスの主人公からの距離を判定
・それを使って追いかけるキャラの移動
この二つを一つのコモン内でやっていました。
ところがそれでは距離判定が終わるまでキャラは動けません。
距離判定には短くても2秒くらいはかかります。
休み休み、立ち止まりながら追いかけてくることになってしまいます。
やっぱり追う時はたとえ移動速度はおそくとも途切れずに追い続けてほしいですよね。
そこで距離を判定する処理と移動させる処理とを二つのコモンに分離しました。
そうすることで理屈上は、最適なタイミング、つまり移動終了直後に次の移動開始ができるようになりました。
当然、移動頻度もあがった、はずなんですが・・・。
しかし実際には体感的にはあまり変化はありませんでした。
特に主人公と追うキャラとの距離が遠い場合はそれが顕著です。
それはなぜか。
判定距離の確定範囲は主人公を起点に広がっていきます。
なので追うキャラが離れていると距離未確定の時間が長いのです。
距離判定を行うたびに、距離の値を格記録している可変DBをいったん初期化していました。
だから距離が未確定の時間ができてしまうわけですね。
なのでその待機時間を減らすために、初期化しないように作りかえました。
DBには「前回判定時のそのマスの距離」を保持しつつ、新規の判定でそれに上書きしていきます。
そうすることで追うキャラはどこに移動したらいいかが常にわかるのようになりました。
待機時間はなくなり、途切れることなく歩き続けるようにできました。
けれどもそれはそれで、また別の不具合がでることがわかりました。
追うキャラがちゃんと追ってきてくれない時があるのです。
その状況には二種類あります。
一つは主人公が直進移動しつづけている場合。
追うキャラは常に追ってきて、距離判定も常に繰り返しているのですけれども。
距離判定を開始した直後くらいのタイミングに問題は起こります。
主人公の足元の主人公からの距離は0です。
けれども新規に判定が確定した範囲がまだ広がっていません。
そのために、主人公が移動してきた数歩前の地点にも同じく距離が0の地点があります。
主人公がいるとみなされる地点が二つできてしまうのです。
これは前回判定時の記録を消さないようにしたことの副作用です。
追ってくるキャラは、実際の主人公から少し離れたその距離0の位置で移動を終えてしまいます。
しばらく立ち止まりつづけ、距離判定の新規更新の波が届くに及んでやっと正常な接近を再開します。
もう一つは主人公と追うキャラの距離が短時間に大きく変化した場合。
距離が接近すれば、当然追うキャラの足元のマスの距離を示す値は小さくなります。
その後に何らかの理由で距離が離れると、主人公の足元から再判定した距離が広がっていくのですが、それが追うキャラに近づくころには距離の値は大きくなります。
高い値の波がやってきた時、追うキャラは値の小さい方へ移動するように設定されているため、逆戻りをしてしまいます。
主人公に接近すると距離が高くなると誤判定されてしまうのです。
これら二つのケースの問題があって、初期化しないというのもそれはそれで問題があると気づきました。
これはいったいどうすればいいのか。
初期化はしつつも判定待ちの待機時間をなくす方法も考えました。
たとえば判定待ちなら停止でなくウディタ標準機能の「主人公に接近」をさせてお茶を濁すとか。
でもこれは逃げですよね。
上手くいく状況もあるけれど、くぼみに向かってツッコんでいく場合もある。
そんなものを作っても意味はりません。
やっぱり、「現在の瞬間の正確な距離」が測定できていないのに、追うキャラに移動開始させるなら誤作動は避けられないかもしれません。
わずかな待機時間には目をつぶるしかないのか・・・。
部分部分を補う処理は思いつくんです。
主人公と追うキャラの双方が一直線上にいて、全てのマスが通行可能なら「主人公に接近」させるとか。
それでけっこうな部分はカバーできると思うのですが、それもやっぱり付け焼刃だしなぁ。
一度確定した「主人公と追うキャラを結ぶ最短の動線」から離れた位置にある袋小路などは判定の必要のないマスとみなし、処理速度を上げることも可能ではありそうです。
だけどもそれにしたって判定頻度を常に高く保っておかないと主人公がぴゅっとそこに突っ込むとかありえるし、やはり課題は残りそうです。
こうして文章にすることで、自分の作りたいものが改めて整理されてきました。
・適切なマスに移動する。
・できるだけ途切れず移動し続ける。
・処理落ちからくる移動速度低下を起こさない
これらを満たす仕組みを作りたいと思います。
王道ですが、処理を少しでも軽くして判定時間を短くし、判定頻度を上げるしかないかもしれません。
今からはちょっと処理速度を気にしてやってみます。
ウディタ界隈でよく知られているだめだめはきだめさんの情報を参照させてもらいます。
まさかこんな情報を使うシステムを作る時が来るとは思っていませんでした。
ウディタリバーシに参加した時も、他の方が思考に時間をかけているのを見てぼくにはとてもできないと思っていたものですが。
現状ではマスの通行可否を何度も判定し直していますが、それも最初に全部を一回だけ見てDBに記録し、そっちを参照した方が速いかもしれない。
また50万回エラー防止のウェイトをどこに置くのがいいのか、1フレーム当たりの処理が何回を超えた時に挟むのがいいのか、いろいろ試してみようと思います。
ラベル:コモン
【関連する記事】
- <ウディタ>歩行グラを顔グラとして使う
- Yahoo!知恵袋で「この写真の人の名前を教えてください」という質問に答えてみて..
- Google Lensで画像を探す方法
- ウディタで直線を引く
機能を使う - ねこさんぽをプレイしました
- さよなら、ネオ繚乱記
- 驚き!パパイヤの種で、口の中が甘くなる!
- 単細胞的思考(上野 霄里:著)という本の前半の紹介と感想
- バリバリダアが面白い。そして対戦という形式の有用性について。
- 扉は君の鍵で開く 離心円 が公開されました
- オーラをまとう(主人公演出コモン)に需要が・・・!
- 暗黙のルール、こわっ!って、政治家の炎上を見て思いました
- <Excel>日付を変えて一枚ずつ印刷する方法
- カステラを二等分するシステム
- 医療費のお知らせをもらいました
- 呼吸と湿度
- ゲーム以外のことも書いていきます
- 「扉は君の鍵で開く」ウディコン4位に!
- ウディタの基本
- メールアドレス変更のお知らせ
ゲームAI -基礎編- 『知識表現と影響マップ』
の記事が参考になると思います。
コモンだと、「最短経路探索」や、「ルート検索」ですかね?
リンクも書きたかったですが、なぜかコメント投稿失敗するのでなしで投稿。
おひさしぶりです。
情報ありがとうございます!
ぐはっ!
となりました。
いやほんとに。
コモンは昨日完成しました。
コメントに気づいたのが今日でよかったです。
「追いかけ」とか「接近」とかで検索してもなかったので・・・。
はりきって作りました。
あると知ってたら作らなかった・・・。
今回の場合は、何も調べなかったです。
どんな処理をさせたいかは明確だったので、それをどう組むかだけを悩みました。
楽しかったです。
まさしく車輪の再発明ってやつですね。
ありがとうございます。