続々ウディタ3.5開発中 経路探索 & キャラレイヤー強化ほか!
引き続きウディタ3.5への改修作業を続行中です!(3.40呼びしてましたが搭載予定の新機能が多くなりすぎるので、3と4の中間大規模修正として「3.5」呼びにすることにしました)
ここまでにご紹介した目玉新機能は「空イベントの生成機能」「フォント暗号化」など!
今回も、「作れる内容」や「作り方」が大きく変わる目玉の新機能が続々登場です!
◆ウディタ3.5の新機能予告、続き!
○経路探索機能!
まず「経路探索機能」とは、スタートとゴールの座標だけ指示したら、ゴールまでの道順を自動的に算出してくれる機能のこと!
紹介動画を作りましたので、見られる方はまずそちらをご覧ください! 直感的に理解できると思います。
https://www.youtube.com/watch?v=3HYipq_Kn-8
私の環境だと、迷路みたいな道でも500マスまで先の道の経路を1msくらいで算出可能でした!(1フレーム16.6msなので、それを超えない処理時間に抑えれば処理落ちはしないことになります)
まともにコモンイベントとして作ると10マスくらいの経路探索でも重くなることがあるので、この速度で動作する経路探索処理が基本機能として使えるのはかなり大きいと思います。
【どういう場面で使える?】
経路探索が簡単にできれば、以下のような処理の実現可能性がグッと上がります!
●マウスクリックした地点まで、NPCや障害物を避けてキャラを移動させることが簡単に!
●ガイドボタンを押すと次の目標地点までの道順がラインで表示される、みたいな演出も当然可能!
●生活系ゲームで、キャラがベッドから起きて仕事場に行って食堂でご飯食べてまたベッドに戻る、みたいな処理だって従来より非常に簡単に作れます!
●建物も自分で設置できるクラフトゲームや開拓シミュレーションゲームでも、経路を自動認識して移動させることが簡単に! 木こりして指定箇所に木材を運ぶ、みたいな処理も実現しやすく!
●ローグライク(不思議のダンジョン)系ゲームでも、モンスターの移動経路や最短の接近ルートが簡単に算出可能になります!
●タワーディフェンスゲームで「敵の侵攻ルート」を算出したり、「自分の設置物で敵のルートが変わる」「ちゃんと味方陣地までの経路が空いているかを調べる」といった処理も低コストで実現可能になります!
●追いかけっこ展開でも障害物を避けて移動可能です!
【経路探索機能の使い方】
使い方はちょっとマニアックです!
たとえば「文字列操作」の「隠しコード実行」コマンド(Ver3.5で搭載されます)から
<<FIND_PATH_DIR8_SX=1/SY=2/EX=6/EY=5>>
と指定すると、マップの(1,2)座標[SX=/SY=の値]から(6,5)座標[EX=/EY=の値]までの道順を、以下のような文字列として得ることができます。
966662222/END
算出された移動経路は、テンキーに対応した1~9の方向を羅列した文字列で示されています。
9なら「右上」、6なら「右」、2なら「下」なので、上の経路は【スタート地点の(1,2)座標から右上、右、右、右、右、下へ4歩すると(6,5)に着きます】という意味になります。
方向じゃなくて1歩ずつの座標で知りたいよ! という人も安心! 隠しコードに「/POS」を追加すれば、以下のように得られる経路の文字列が「1歩ずつの座標」として返されます。
<<FIND_PATH_DIR8_SX=1/SY=2/EX=6/EY=5/POS>>
↓結果
2,1/3,1/4,1/5,1/6,1/6,2/6,3/6,4/6,5/END
あとは「文字列操作」でいいように切り取って使ってください! という感じです!
なお、この経路探索は今のところ「1マスごと」の処理のみ可能です。1マスまるまる通行可能でないマスの場合、「通行できる」と認識されない可能性があるので、そこは注意してください。
【イベントの当たり判定を考慮した経路計算も可能!】
このコマンド、素のまま使うと「マップの通行判定だけ」を考慮したルートを算出するのですが、隠しコードに「/EV=-2」(-2=主人公、ここには動かすイベントのIDを入れる)と入れると、『イベントの当たり判定を考慮した経路』を算出できます!
コマンドは <<FIND_PATH_DIR8_SX=1/SY=2/EX=6/EY=5/EV=-2>>みたいな感じですね。マップイベントを動かしたいときは、マップイベントID3なら/EV=3みたいに指定します。
以下の投稿みたいに、多数の猫が上下してる道でも猫を避けて移動が可能です! ただしイベントのように動くものも考慮する場合、毎フレーム経路を計算しなおさないといけませんので、計算負荷は上がります。
https://twitter.com/WO_LF/status/1844753966934204915
【経路探索にはどういうアルゴリズムを使ってるの?】
ここは余談ですが、経路探索アルゴリズムとしては、高速に最短経路の近似解を求められる「A*(エースター)」アルゴリズム(Wikipedia、処理見本アニメあり)を使用させていただいております。
すごく簡単に言うと、「目的地への道の中で、より近そうな道から優先して探すことで、全ての道を試すよりもずっと速く経路を見つけられる」という仕組みのアルゴリズムです。
ただし、このアルゴリズムで得られるのはあくまで近似解なので、常に「【最も短い】経路」が算出できるとは限らないことに注意してください。2番目くらいの距離の道を最終結果として返すことも多いです。
ですがプロのゲーム開発の現場でも使われているくらいの優秀なアルゴリズムで、だいたいは良い経路を算出してくれます。多少最適じゃない道を出しても、ゲームという媒体なら「キャラやナビがポンコツだから」などで説明できますから安心!(?)
【いずれはもっと簡単に使えるようにしたい!】
こんな風に隠しコードを使ったり、「文字列操作」を駆使しなければならないことから、いまのところ経路探索機能は『自作システムを組める人向け』の機能と言えます!
が! もし(私の作業負荷とゲーム内負荷の両方の意味で)軽い負荷で作れそうなら、「動作指定」内に、目標地点まで自動で移動してくれる「自動移動」処理なども入れたいなあと考えています。
うまくいけば、一歩ずつ歩く方向を指定する必要があった時代が終わるかもしれません! そうなればイベントシーンの作成負荷も大幅削減されますよね。
ということで、自作システム作者さまにも普段使いの方にも夢が広がる経路探索機能の搭載、お楽しみに!
○キャラチップレイヤー機能が強化! レイヤー無制限化+サイズ不問+1レイヤーごとにエフェクト可能に!
ずっと『(α版)』と書いてあった「重ねキャラチップ」機能ですが、今回の修正でたくさん進化して正式版となります!
こちらも映像を作りましたのでよければご覧ください!
【レイヤー5枚制限が撤廃、無制限に! レイヤー番号も好きに指定可】
これまではキャラの「上」のみに5枚までしか置けなかったキャラチップレイヤーですが、これからはキャラの「上下」に「無制限に」重ねられるようになります!
さらにレイヤー「-1000」みたいに好きな番号を入れても問題なく動作します!
扱いがかなり雑でもよくなったので、キャラメイク系のゲームでもキャラチップに色んな服を着せたり武器を持たせたりできるようになるでしょう。
【キャラ本体の裏側にも追加可能に】
さっきもチラっと言いましたが、キャラの「裏側」にもレイヤーを追加可能です!
あとから表にも裏にも好きに追加できるので、これまでのような少ない枚数をギリギリで運用する必要がなくなります。ザツに管理できるのは大事!
【重ねる画像サイズが自由に!】
これまでは「重ねるキャラチップ」は『本体とまったく同じ画像サイズ』でなければダメでしたが、最新版ではそこが自由になります!
ちょっとくらいフォーマットが違ってても大丈夫!
本体よりだいぶ大きい乗り物に乗せることだって可能になります。
【1レイヤーごとに色を変えたりXY座標をずらしたりできるように!】
さらにレイヤー1枚ごとに色相や彩度、明るさを変えたり、XY座標をずらしたりが可能になります!
色違いの服を用意する必要はなくなりますし、レイヤーごとに多少のずれがあった場合はこれで補正可能です! これで開発コスト削減!
やり方は以下のように、画像ファイルの前に<>で挟んでオプションを指定するだけ!
<X+=4/Y+=-2/HUE=90>CharaChip/Chicken.png
この例だとX座標に+4、Y座標に-2、色相90(0~360の範囲)の補正をかけたChicken.pngのレイヤーが表示されます。
他にも、/HALFと入れると画像サイズを半分にしたりできます! ウルファールを1/2サイズにちっちゃくして船に乗せたりも!
○『ピクチャ挙動Ver2』が搭載!
これまでのピクチャ挙動は、「表示」時の挙動が状況次第で違ってややこしかったり、ピクチャを挟めるレイヤーが少なかったりして少し不便でした。
同じIDのピクチャを使った場合、文字列ピクチャを「表示」し直すたびに不透明度ゼロから表示され直したり、文字列から画像ピクチャを出すとワープしたり、画像ピクチャから画像ピクチャを出すとワープせずに移動したりと一貫性がありません! 「消去」指示すると「移動予定先」にワープしてから消えるという変な動作もありました。
なので、ここでいろいろ整理しようと『ピクチャ挙動Ver2』の搭載を決定しました!
Ver1の旧挙動とVer2では、以下のような挙動の差があります。
●これまでのピクチャ挙動Ver1[旧挙動]
・レイヤー挙動:ピクチャ番号マイナス時の表示レイヤーが以下のようになります。
「-1~-99999の場合は『キャラの下 ・ マップの上』に表示」
「-100000以下の場合は『マップの下 ・ 遠景の上』に表示」
・【表示】コマンド時の挙動:
すでに同IDでピクチャが表示されている場合、「異なる画像で【表示】」または「文字列ピクチャの【表示】」をした場合に、
- 処理時間が残ってる状態だと『不透明度』が「直前のピクチャ指定時点の値の状態に戻る」
- 文字列から画像、画像から文字列、文字列から文字列に切り替わるときに「新しい場所に瞬間表示される」という挙動になります。
- 「ファイル読込ピクチャ」で全く同じ画像を【表示】した場合のみ、【移動】と同じ処理になります。
- 他にも、「処理時間」ありで「消去」されるときは「移動予定先に瞬間移動して消え始める」という挙動になっています。
という具合になかなかのカオス具合になっていました。
↓
●ピクチャ挙動Ver2[ver3.5以降]
・レイヤー挙動:ピクチャ番号マイナス時の表示レイヤーが以下のようになります。
「-1~-99999なら『フォグの下 ・ ★マップチップの上』に表示」
「-100000~-199999なら『★マップチップより下 ・ キャラや▲マップチップの上』に表示」
「-200000~-299999なら『キャラや▲マップチップより下 ・ マップの上』に表示」
「-300000~-399999なら『マップより下 ・ 遠景の上』に表示」
「-400000以下なら『遠景の下』に表示」
・【表示】コマンド時の挙動:
すでに同じIDでピクチャが表示されている場合、処理途中でも「座標」や「不透明度」はその瞬間のパラメータを常に引き継いで処理されます。
- すでにピクチャ表示済みの場合、常に【移動】コマンドと同等の処理が行われます。シンプル!
- また「処理時間」ありで「消去」される場合も、「実行された瞬間の座標」で止まって消去される自然な動作になります。
という感じです! これまで開発されていた方はVer1のままにしておく方が安全ですが、今後の新作開発ではVer2をご利用になることをおすすめします!
特に「★チップの下・キャラの上」あたりのレイヤーは従来ではピクチャを挟むことができなかったので、ムズムズしてた人も多いと思います。
今後はもうちょっとピクチャも扱いやすくなると思います!
○マップだけをピクチャに取り込む『<MAP_SCREENSHOT>』機能が搭載!
すでにVer3.0で、画面全体をピクチャとして取り込んで使える「<SCREENSHOT>」が搭載されましたが、Ver3.5ではマップ画面だけを取り込む「<MAP_SCREENSHOT>」機能が搭載されます!
使い方はピクチャの画像ファイル名に、「<MAP_SCREENSHOT>」と入れるだけ!
そうするとその瞬間のマップがピクチャとして表示できます!
https://twitter.com/WO_LF/status/1844334442049057134
【「全画面取り込みと変わらないんじゃ?」って? いえいえ違うんですよ!】
このマップ取り込み機能、画面全体を取り込むのとあんまり変わらないように見えますが、重要なのは「ID0以上のピクチャを無視できる」という点!
というのも、全画面を取り込んだピクチャを毎フレーム更新したりすると「2フレーム目から出した全画面ピクチャそのものも取り込んで表示してしまうので見た目がカオスになっていく」という問題があったのです! 絶妙に使いにくい!
ですが今回取得可能になったのは「マップのみ」なので、これを使えば「メニューやメッセージウィンドウ」、「直前に出した全画面ピクチャ」を取り込んだりせず、きれいなマップだけが使えます! よって、さらに画面取り込みの使い勝手がよくなるわけです!
【<MAP_SCREENSHOT>で何ができる?】
マップのみを毎フレーム「表示」し直せば、当然リアルタイムのマップがピクチャとして好きに表示可能! これでできる表現の幅も格段に広がります!
たとえば何に使えるかというと、演出強化の面では「画面を斜めや上下逆さにしたり」、「サイケな画面演出や崩れたマップ画面を演出したり(細かくパターン分割して座標をずらしたり動かしたり、個別に色変えしたり)」、「【イラスト上のディスプレイ画面】にマップ画面を自由変形ではめ込みしたり、その状態のままゲームを続行させたり」なんてことも可能になります!
他にもプレイ面での強化としては「広大な範囲の全マップを裏で出しておいて、プレイ時はそれをCUT機能で切り出してピクチャ拡大して表示し、別々の場所で起きていることを分割映像で見せる」なんてことも実現可能です。「ダンジョンに侵入者が入ってきた! 今の侵入者はこういう動きをしている!(侵入者付近のマップ画面を切り取ってピクチャ表示する)」なんていうライブカメラ的な演出もできます! 画面内に全マップをおさめるのがちょっと難しいですけども。
【ミニマップ作りにも!】
さらにマニアックな話をすると、ウディタにおける「マップ画面」とはすなわちピクチャIDが「-1」以下のレイヤーでもあります!
つまり『マイナスのピクチャでお絵かきした内容を<MAP_SCREENSHOT>で保存しておいて使う』という画像バッファみたいな使い方も可能!
特に便利そうな用途として考えられるのがマップごとの「ミニマップ」自動生成機能です! マップに侵入した際やロードした際、裏でミニマップの画像を作って「<MAP_SCREENSHOT>」で撮影しておき、あとはそれを「切り出し」表示したり「マスク」を使ったりして表に表示することで、良い感じにミニマップ自動生成&表示ができそうです!
実装できる技術さえあればアイデアは無限大! ぜひ色々考えてみてください!
という感じで、ここまででさえ、「作り方そのもの」や「作れるゲームの幅」まで変わってしまう修正が盛りだくさん!
私の介護もいったん終わり、長時間集中し続けてもよくて夜ずっと寝られる環境を得たことで5年ぶりくらいに全力が出せるようになってるので、プログラミング筋(きん)も絶好調です!
さらに他の新機能にもチャレンジしていきますのでお楽しみに!
便利度が上がるたびに「なんで自分の『片道勇者2』の開発でこれがなかったんだよォォォォー!」ってすでに何回か叫んでいますが、もっと自分が叫んじゃうような新機能も入れていきたいですね。
引き続きがんばります! 次回の新機能紹介もこれに劣らないものが出せればと思いますので、お楽しみに!