ワープギミックと黄金色の街 [ゲーム開発ログ 2020-11-22]

2020-11-22

広いマップは楽しいが、慣れると歩くのが面倒くさい

僕はゲームのマップを歩くのが好きだ。 まだ見ぬ景色を眺めながら道を開拓して、自分の中の地図を更新していくのが楽しい。

が、そんな僕でも以下のようなケースだとプレイしていて飽きが来てしまう:

  • だだっ広い空間や、長い一本道をただただ歩く
  • 何度も通った道を行き来する
  • 宝箱をとるなどした後に、来た道を戻る
  • うっかり落ちたのでまた登り直す

要は新しい道を歩くのは楽しいが、すでに通った道や見知った景色ではさっさと通してほしくなるのだ。 新しく得る情報がないために、ただの無駄な移動時間に感じてしまうからだと思う。

広い距離の移動には ファストトラベル と呼ばれるワープ機能が定番だが、 UI 上から行うファストトラベルは便利な反面、どうにも機会的な操作で味気なく感じてしまうところがある。 せっかくゲームの世界が存在しているのに、没頭感を作る境界が壊されてしまう感覚だ。

だから自分は、できるだけゲーム世界の景色の中でショートカットができるようにしたい。 ワープゲートが集まったポータルみたいなマップを作るのも良いが、 1 マップの中でもちょっとしたショートカットが欲しくなる。

実際、負荷検証のデバッグ目的でまあまあの広さがあるマップを作っていて思ったのだが、 やっぱりただ歩いているだけではそのうちに飽きてくるし、デバッグも時間がかかる。 何か移動のショートカットが欲しくなった。

タップで飛べるワープギミックを作る

ということで 要所要所にマーカーを置いて、タップするとその場所に瞬間移動できるやつ を作ってみた。

そしてこれがあると高いところにも簡単に移動できるようになるので、 高低差のある立体的なマップ が作ってみたくなり、そういう街のマップも作ってみた。

こんな感じ:

これが実装してみるととても快適で操作感も楽しかった。
気に入ったので、ゲーム本編にもこのギミックを使おうと思う。

遠くに見えるマーカーに一瞬で移動できるというギミック自体は 3D ゲームではよくあるもので、別段珍しくはない。 FF15 のシフトとか、スパイダーマンの電柱に糸で飛びつくやつとか、イース 9 のクリムゾンラインとか、様々なゲームに存在している。

が、モバイル向けのゲームで実装してみると、結構タッチデバイスの UI と相性がよいなと感じた。 画面内に複数マーカーが存在している場合でも、単純にタップした場所に行けるので、間違いがないし直感的だ。

実装メモ

マーカーは 2D の UI レイヤーで描画している。 3D 座標を 2D 座標に変換しているわけだが、これは Unity だと次のようなコードで簡単に算出できる:

Vector3 screenPos = Camera.main.WorldToScreenPoint(warpPoint.transform.position);

カメラの裏側に来た場合には画面上から消したくなるが、z 座標にカメラとの距離が入っていて、 裏側にある場合は z 座標がマイナスになるので、それで判定することができる。

ググると RectTransformUtility.WorldToScreenPoint() というのを使っている記事も出てくるが、 これは現在の Unity のドキュメントに出てこないので古い API なのかもしれない。 書いてみたら動いたが、z 座標が常に 0 でカメラの裏側判定ができなかったので、 基本的には Camera にある API を使えばよいと思う。

作ると凝り出してしまうデバッグ用マップ

これはデバッグ用途で作っていたマップなのだが、やっていると妙に凝りだして無駄に作り込んでしまう:

どうやら自分は 3D のマップを作るのが単純に好きなようだ。
一時期ドラクエビルダーズ 2 にハマって累計 200 時間以上プレイしたことを思い出した。

ジオラマの趣味とかやり出したら沼にハマってしまいそうなので、そっち方面には手は出さないようにしておこう。 やるなら Unity でやろう。