01. 着想の原点:2次元平面における定石パターンの限界
2014年に登場した『2048』って、ルールが極めてシンプルで誰でもハマる神ゲーですよね。ただ、ある程度やり込んだ人ならわかると思いますが、最終的には特定の角に最大数字を押し込む「角固定」の作業ゲーに行き着くわけです。この定石が身につくと、あとはルーチンの反復になりがちで、パズルとしてのワクワク感が薄れてしまう。
そこで思いついたのが、「X軸・Y軸の平面に、Z軸(奥行き)を足した立体にしたらどうなる?」という発想でした。上下左右の4方向から、奥・手前を加えた6方向へ。自由度が増えることで角固定の単調さが崩れ、外からは見えない中心マスや背面のブロックをどう管理するかという、新しいパズルが生まれるんじゃないかと思ったわけです。
02. 空間次元の設計:4×4×4から3×3×3への移行と計算量
最初の試作では、平面版の4×4をそのまま3Dにして「4×4×4」の立方体で作ってみました。ところが、これが見事に大失敗でした。4×4×4って全部で64マスもあるわけですよ。1手で湧いてくる新規タイルは1マスずつなのに、空間が広大すぎて、適当にガチャガチャ動かしているだけでも勝手に合体が連鎖して全然ゲームオーバーになりません。(シンプルに終わらんやん…と)。
テストプレイしてみたら、1ゲーム決着するのに1,000手以上かかって数時間プレイし続ける羽目になりました。通学電車の息抜きどころか、ただの苦行になってしまったわけです。パズルとしての適度な緊張感もゼロでした。
そこで空間を思い切って「3×3×3(全27マス)」へと縮小しました。2048のタイルを1つ作るには理論上1,024個の「2」が必要で、合成の過程で高数値ブロックが盤面を埋めていきます。27マスという広さは、最大数を角にキープしながら下位ブロックを合成する余白がギリギリ残る絶妙なサイズ感。1手のミスが即座に手詰まりにつながる緊張感が生まれ、平均10〜15分(直感プレイなら3〜5分)でテンポよく決着がつくゲームに仕上がりました。
03. 操作系の統合:2次元タッチ面から3次元ベクトルへの投影
開発で一番頭を抱えたのが操作性でした。PCならキーボード(矢印キーやWASD+QEキー)で6方向を押し分ければ済みますが、スマホは平らなガラス板なわけです。画面上のスワイプは上下左右の2次元移動量(dx, dy)しか取れません。
この問題に対し、画面下のD-Padボタンで直接指定できるようにするだけでなく、「カメラの視点角度に合わせて、画面の右・上を3D空間の軸へ動的にマッピングする」仕組みを実装しました。カメラが斜めを向いていようが裏側を向いていようが、画面上のスワイプ方向と直交6軸の内積をリアルタイムに計算し、一番平行に近い軸へタイルを滑らせる設計です。
さらに、キューブを触ればスワイプ、背景を触ればカメラ回転という直感的なハイブリッド操作にまとめることで、スマホの画面1枚でストレスなく遊べるようにしました。
04. 描画負荷の抑制:Three.jsによるモバイル描画の軽量化
ブラウザ上でアプリのインストール不要でサクッと動かすため、描画基盤にはThree.js(WebGL)を採用しました。ただ、ここで問題になったのがスマホの発熱とバッテリー消費です。3Dグラフィックスを毎秒60fpsで無条件に回し続けると、スマホがカイロ化してしまうわけです。
そこで、プレイヤーが考えている間は画面が静止しているパズルゲームの特性に着目しました。タイルが動いている最中やカメラを回している間だけ描画ループを動かし、動きが止まったらスリープに入る「オンデマンド描画」を導入したわけです。これで無駄な電力消費を大幅にカットし、長時間のプレイでもスマホが熱くならないようにしています。
05. まとめと今後のアップデート方針
「2048×3D」は、ただルールを3次元にしただけではなく、空間サイズの調整やスマホでの操作感、パフォーマンスの最適化を地道に重ねて今の形になりました。
今後も、スコア推移の可視化や実績機能など、遊んでいて楽しくなる仕掛けをぼちぼち追加していく予定です。ぜひブラウザからサクッと遊んで、立体の奥行きを体験してみてください。