OpenAssetOrgのアセットで2Dゲームを作る⑥ マウスカーソルに向けて矢を放つ
「シューティングというと、ショットの角度は固定で自機が動くパターンが多いけど、今回は自機は動かずに射撃の角度を変える方法で、マウス操作でも遊びやすいような感じにしようと思う」
「最初にマウスカーソルの表示をしてから、クリックした時に自機がカーソルの方を向いて、矢も同じ方向に撃つような仕掛け」
妹「これってカーソルの位置はどんな感じになってるの?」
「いくつか方法があるんだけど、2Dゲームの場合は今回使ったConvertMouseLocationToWorldSpaceノードが使いやすいと思う」
「これは画面上を適当にクリックして、ConvertMouseLocationToWorldSpaceの結果をPrintStringで表示したもの。Yは200固定で、XとZは中心が0で、外にいくとマイナスかプラスに偏っていく」
「この座標の設定通りになる」
妹「Yの200というのは?」
「カメラが置いてあるY座標。ただし向いてる方向によっては別の数字になる。カメラ位置を基準にした架空の平面と考えてるというか。今回はカメラは平行投影で、かつ等倍表示だから、カメラ上のXとZと、ワールド上のアクターのXとZは完全に一致してる」
妹「パースがついてると一致しないの?」
「カメラの平面と同じ場所にアクターがある時だけ一致する。今回のカメラの向きでいうと、カメラとアクターのYが同じ場合だけ、XとZも一致する」
妹「それより遠いとちっちゃくなっちゃうからかな。なんとなくわかるような」
「このへんは考え方は平行投影の方がシンプルでいい。立体的なマップでやる場合は別のノードを使ったり、レイを飛ばしたりして調べないと、単純にX,Y,Zだけではわからない」
妹「ウィンドウを拡大した場合は?」
「その場合は拡大縮小に合わせて変わる。例えばウィンドウサイズを倍にしても、カーソル位置が倍になったりはしない。カメラの設定は全く買えてないから。ただ、中途半端に拡大するとカーソル位置が小数になる、ウィンドウの縦横比を変えるとカメラの外側をクリックして範囲外の数字も出せる、といったあたりは注意が必要」
「角度はこのFindLookAtLocationで計算する。start から target の方を向く角度だから、startに自機位置、targetにカーソル位置を入れてる。カーソルが遠くても近くても角度はキッチリ合わせられる。Yを0で統一してるのは、角度に奥行きの角度がついちゃうから。2DゲームのYはただの表示順だから、角度に反映されると困る」
妹「例えばピンを分割して、XとZだけつないでも良かったのでは?」
「あ、それでもいいよ。Yもゼロに限らず同じ数字ならいい。ピンの数が増えるのと、ノードの数が増えるのとで、見栄えとしてどうやるのがいいかという話になると思う。何度か使いそうだから適当な部分をマクロ化するのも良さそう」