やおよろず

ゆるふわな内容を書いても良い。と言うか何でも良い。そんな自由度の高いブログをめざします。

合宿でUnityを触ったきりだった話

この記事は カレーのち ぴょこりんクラスタ Advent Calendar 2018 - Adventar のために書いたものです。

スマブラのアドベンチャーをクリアして全キャラ解禁しました。
VIP部屋は遠いです。やっていきます。

はじめに

脱出ゲームってあるじゃないですか。
フラッシュゲームが元ネタだと思いますが、ここ数年はリアル脱出ゲームという形でもかなり広まってきた感がありますね。
自分は何度かリアル脱出ゲームのお誘いを受けて遊ぶ機会がまた増えてきたのですが、
謎を解きつつアイテムを集めて少しずつゴールに近づいていく感覚はやはり面白いものです。

本題

既にある合宿参加者の記録 - お菓子食べる部などでも言及されている合宿のころから、
自分はUnityを使って脱出ゲームっぽい者をが作れないか?と思っていました。

結果としては、全然作りきれませんでした

途中経過の内容が以下になります。 https://yaoshimax.github.io/MagicRoomEscape/

やれること

  • 十字キーで移動
  • マウスカーソルで丸い水晶とか紙の目元かランタンとかクリックできる
  • ランタンを取るとItemの所に炎マークがつく
  • ランタンを取った状態で暖炉をチェックすると暖炉に火がつく

今回は、合宿前後で自分が行った事について書いていこうと思います。

合宿前:事前準備

Unityのチュートリアルは玉転がし・シューティング・2Dローグライクあたりまで一度やったことがあったのですが、
完全忘却済みだったので、玉転がしのチュートリアルを再び復習しました。
【Unity 入門】【チュートリアル】玉転がしゲームを作る - コガネブログ

後は、とりあえず部屋を作った上で、
プレイヤーが十字キーで移動ながら、プレイヤー視点でカメラが移動していくような状態を作ろうとリハーサル。

しかし、実はこの時点でいきなり暗礁に乗り上げていました。

はじめはプレイヤーとしてただの円筒形オブジェクトを用意し、オブジェクトにカメラをくっつけ、
その円筒形オブジェクトを操作するscriptを書いて…という実装をしていたのですが、
部屋の隅っこに行った際にうまく止まってくれない現象に長らく悩まされていました。

悪戦苦闘の末、CharacterControllerをつかってプレーヤーを動かす - Taka8’s blogにあるような、
こういうときに使うのにうってつけのControllerがあることに気づき、ようやくスタートラインに立てた気分になります。

ぶっちゃけ、これだけで結構な日数を使ったし、これだけで合宿の準備は終了です。 ただ、これすら調べてない状態で合宿に入っていたら、きっと悲惨なことになっていたでしょうね。

合宿当日

室内のレイアウト周りの調整

ひとまずはリハーサルの成果により、部屋の中を人(with カメラ)が動き回る状態を作り、 その後はアセットストアと戯れながら適当に家具を設置するなどしました。

Unityはアセットを使えばそれなりの見栄えのものができるので、ついつい作業できた気になりますよね。

ただ一方で、イメージに100%合致するアセットはなかなか存在しないのが悩みどころです。

例えば自分の場合「なんか、占い師が使いそうな、丸い水晶みたいなヤツ」が欲しいなぁと思ったところ、 アセットストアでよさげな者を見つけることが意外と難しいものでした*1

仕方がないので、水晶はsphereオブジェクトによさげなテクスチャを張り付けて自動生成。
水晶を乗っけるクッション?みたいな者は、座布団のフリーアセットを流用する、などの運用でカバー案を考えながらレイアウトをしていきました。

あと、暖炉のアセットを壁に埋め込ませようとしたら、継ぎ目の部分がどうしても浮いてしまう、と言う問題にもぶち当たっていたのですが、
これは解決方法が分からなくて諦め。こういうのって皆さんどうしてるんだろう。詳しい人教えてください。

アイテムを見つけて、クリックしたらメッセージが表示される仕組みを作る

ここからはひたすらググりながら実装しています。

  • アイテムにオンマウスで色がハイライトされる
  • クリックすると、別途用意されたレイヤーにテキストオブジェクトが表示される

的な実装です。こう言うと簡単そうですが、 実際にはテキストオブジェクト表示中にさらにプレイヤーが動けちゃったりとか、さらにクリックできちゃったりする現象が発生するので、地味に手間取りました。

クリックでアイテムを取得する仕組みを作る

ググりながら色々と考えつつ実装していきます。

基本的には、先述の「クリックしたらメッセージがでる」仕組みの派生で、 常に描画されてるエリアをつくり、そこに特定条件したでオブジェクト表示をするようにしました。

本当は複数アイテムの取得などの対応も考えたかったのですが、合宿中だったし、シンプルに。 地味に取得したアイテムを非表示にするなどに手間取ったりもしました。

オブジェクト表示についても、本当はアイテムの3Dオブジェクトその者を小さく乗せたかったのですが、 これが結構大変で挫折。

アイテム取得時に特定箇所をクリックするとイベントが発生する仕組みを作る

ランプを持った状態で暖炉をクリックすると暖炉が光る(ランプを投げ込むイメージ)
と言う仕組みを作りました。
このあたりまでくると既存の知識の組み合わせではあったので、割と終了間際にざくざく書いた気がします。
大分実装がごちゃごちゃである自覚は、ある。

おおよそ、合宿中に行えた実装範囲はこのくらいだったかとおもいます。

合宿後にやったこと

合宿メンバーは特に分かると思うんですが、正直あまり進展はないです。

というのも、暗証番号入れたら箱の鍵が開く仕組みを作りたかったんですが、
よさげなアセットがない&自力でやるのが難しくてまごついてます。脱出ゲームとしては個人的に必要不可欠だとおもうんですけどね。。。

というわけで、やったこととしては、

  • 細かなバグ修正(暖炉の火をつけた後にまた暖炉が選択できて、『暖炉の火が消えそうだ』とか言われていた
  • 光源の設置と明るさの調整(合宿時は暖炉の火が小さすぎて全然見えなかった)
  • 棚の扉がクリックで開くようにする
    • 実は直前までこれバグってると思ってて非公開にするつもりだったが、WebGLビルドしてみたら動いていた…
  • WebGLでのコンパイルと公開

あたりです。

終わりに

Unityはアセットの組み合わせで簡単に色々作れると言われますが、
実際は組み合わせ方なり、何もないばあいに自分で作る所なり、結構な地力が必要だなぁと思います。
ただ、プログラマたるもの(?)、ゲームを作るのはやっぱり一度はやってみたいところですし、
今後も引き続き開発できると良いなぁ…と思います。

*1:現時点ではまだ有料アセットを使ってません