見出し画像

「時空運送」開発・1週間の記録

  また一週間でゲームを一本つくるやつをやりました。

 この記事はunityroomで開催された Unity 1週間ゲームジャム (以下unity1week) の2020年12月の回(お題:あける)に参加した記録になります。この記事をお読みの方は既にご存じかもしれませんが、ざっくり説明すると「1週間でお題に沿ったゲームを一本つくる」イベントです。

 unity1weekには過去5回参加しており、そのたびにブログに開発記録を書い(たり書かなかったりし)ているのですが、今回はnoteに。なんでもUnity Technologies Japanとnoteのキャンペーンで、noteにunity1week参加の記事を書くと色々もらえるらしいので。

 それでは早速、まずは作ったゲームの紹介から。

 「時空運送」というゲームをつくりました。このゲームは箱を押して道を作るパズルの定番「倉庫番」に、タイムトラベル要素を持ち込んでみたものです。ステージ上のワープゲートに箱を押しこむと、その箱は未来や過去にワープします。このワープゲートにはプレイヤー自身も入ることができ、プレイヤーと箱が時間軸上を行ったり来たりしながら、目的の箱をゴールへと運んでいきます。

 この1週間の使い方はこんな感じでした。

○月曜日:ゲームのテーマとタイトルの決定、基礎の実装
○火曜日:絵作りの方針決定、基礎の実装
○水曜日:UI制作、基礎の実装
○木曜日:ステージエディット機能実装、WebGLビルドテスト
○金曜日:ステージエディット機能実装、ステージ制作
○土曜日:ステージ制作、細部のブラッシュアップ
○日曜日:サウンド、ステージ制作、細部のブラッシュアップ

 今回はあんまり記録を残してないのでうろ覚えですが、概ねこんな感じです。以上よりなんとなく時系列に沿って各作業をどのように進めていったか紹介していきます。

ゲームのテーマ決定

 今回のお題は「あける」。シンプルなようで意外と難しいテーマでした。時空運送は「時空に穴をあける」という着想でアイデアを広げていきました。ひとまずはワープ要素のある倉庫番を作ろうと考えていたのですが、ちょっとシンプルすぎるかなあと思っていました。そのうえ、壁に穴をあけるパズルゲームといえば言わずと知れたPortalがあるので、その焼き増しになるのはちょっとヤだなという思いも。そこで「時空に穴をあける」という当初の発想に則り、空間だけでなく時間のワープも作ろうということに決めました。

 しかし、倉庫番に時間ワープを取り入れたとき、いったいどんなゲームになるのか?というイメージが全くつかめませんでした。しかも実装難度が相当高いだろうという予想は容易に立てられました。面白いかどうかよくわからないうえに、作るのは超たいへん。しかしそれよりも、これがどんなゲームになるのか見てみたい。そして、このアイデアが上手くいけば、とびきり斬新なパズルゲームが作れるのではないか?という期待が大きかったです。PortalやBaba is You、Superliminalのようなコンセプトのインパクトがデカいタイプのゲームに対する大きな憧れがあり、その方向の驚きを与えられるものが作れるんじゃないか、という予感があったのです。無理にでも実装してみようという考えに至りました。

実装

 このゲームはプレイヤーが過去に箱を送ったり、過去に移動して箱を動かすことによって過去を改変することができます。しかしどんな改変でも許されるわけではなく、既存の行動との矛盾が起こらないようにする必要があります(矛盾が発生すると画面に警告が表示され行動がキャンセルされる)。また、過去改変をパズルの要素として活かすために、「過去に送った箱が過去のプレイヤーの移動を妨げる」のは現在のプレイヤーに対する矛盾を生じるのでNGとしますが、「過去に送った箱を過去のプレイヤーが押す」だけなら矛盾とはみなさず、パズルを解くための行動として利用できるようにしました。

画像5

▲ごちゃごちゃタイムラインの様態

 さて、この時間移動をどうやって実装したかなんですが……ちょっとひとことで説明するのはムリそうです。ざっくり言うと、過去改変があった際はそこから現在に至るまでの盤面の状態を更新しなおす、といった感じです。簡単に言っていますが実際には一筋縄ではいきません。ここにアンドゥやワープ、過去の状態プレビュー、パフォーマンスの問題などが合わさってくるのでもう大変です。そのへんを無理やり解決してなんとか動かせるようになっています。また、問題を少しでもシンプルにするため、この盤面のロジック自体はUnity側の要素(GameObjectやMonoBehaviourなど)に依存せず、Pure C#だけで実現できるように工夫しています。

絵作り

画像3

▲実は3Dでしたっていうスクショ

 今回はクォータービューを採用しています。側面を表示することによってワープゲートを柔軟に配置することができるため、このパズルとの相性がよいです。当初は2Dスプライトによる表示を行おうと考えていましたが、スプライトサイズや配置の調整が予想よりも大変そうだったのと、今回はあまり複雑な形状を用いない見込みであったことから、3Dで描画することにしました。実際今回はモデリングソフトの類を一切使用せず、Unity標準のプリミティブメッシュ+カスタムシェーダーによる表現を行っています。プレイヤーの柔らかくぷにゃぷにゃしたアニメーションも3D描画のおかげで実現しました。また、Unity公式の2D Pixel Perfectパッケージを使用し、3D描画でもドット絵っぽく見せるのをやっています。

画像2

▲おまけ:初日時点の絵

エディット機能

 このゲームはユーザーが自分でステージをデザインすることができます。これにはもちろん、ステージ作成をひとつの楽しみとして含め、既存ステージの不足をカバーするという目的もあるのですが、半分くらいは自分が使うためにつけた機能です。何せパズルが複雑なので、デザイン⇄テストプレイのサイクルを素早く回せる環境が必要だったのです。エディタでも無いととても作問できん。

画像6

 作ったステージはQRコードの形式で保存することができ、他人の作ったステージもQRコードを共有することで遊ぶことができるようになっています(画像形式ならTwitter等での共有が容易なので)。unityroomのようなWebGL環境でファイルの入出力を行う実装は結構大変でしたが、なんとか動かせるようになりました。このファイル入出力の実装はGitHubで公開してるので、もし必要なことがあれば自由にご活用ください。

画像1

▲おまけ:さっき作ったステージ

ふりかえり

 というわけで、なんとか間に合いました。時間移動の実装はなかなか欲張りで無謀な挑戦でしたが、形にすることができたのでよかったです。正直、過去参加したunity1weekの中ではかけた時間はおそらく最長、一番大変でした……。そのぶん反響も過去イチいただいたので、もうちょっと時空運送の開発を続けてみようと思ってます!(もともとモバイルを意識してUIなども作っていたので、モバイルリリース目指しちゃう……?)

画像7

▲おまけ:タイトル画面かべがみ


この記事が気に入ったらサポートをしてみませんか?