Unity1週間ゲームジャム(お題「あける」)に参加しました

はじめまして。ub_nyaoiixです。

文章を書くのが苦手ですが、Unity1週間ゲームジャムに参加した備忘録を残したくなったので note に投稿することにしました。

決してユニティちゃんのフィギュア目的じゃないんだからね!


ちなみに今回作ったゲームはこれ

ゲームの内容

年があけるということで、年賀状の写真に初日の出を収めようと思い、山に来たユニティちゃん。
しかし、たくさんの登山客がいて写真が撮れない!
夜があける前に、登山客にカメラの前をあけるように説得しよう!

3つのあけるが詰まったゲームです。

遊んでくれると嬉しいです。



【1日目(月)】

まず「あける」をテーマにどのようなゲームを作るか考えた結果、思いついたのがこれ。

画像2

(よめねぇ...)

いろいろ考えた結果、時期的に年が "あける"を使いたかったので、年が明けるゲームの候補を考えてみました。

①初詣客の密を防ぐゲーム

初詣に来た客をドラッグで掴んで距離を"開ける"ゲーム。密になったらゲームオーバー。

画像3


②初日の出を撮影するゲーム

登山客を蹴散らして初日の出を撮影するゲーム。

画像4

①は作業ゲーになりそうということで②を採用しました。

...ということでまずは初日の出を実装してみました。


[参考] 作って学べる Unity本格入門


【2日目(火)】

カメラ視点のカメラを追加したのと、ユニティちゃんを操作をできるようにしました。(なぜか走るときにモーションが切り替わらなくて時間かかったけど...)


【3日目(水)】

大ニュース!!!

なんと!今回のUnity1週間ゲームジャムに参加すると!!!

ユニティちゃんのフィギュアが貰える!!!

これを聞いてよりモチベーションが上がりました!!!


作業の方は、カメラで撮影した写真をどうやって表示しようかといろいろとググった結果

 ・特定のUIを除いて画面のスクリーンショットを撮影する

がヒットしたのでこれを参考にした結果、うまく写真が撮れるようになったのでこの日の作業は終了。

(...このあととんでもないことが起こるとも知らずに)

※この辺から動画撮影してないです...


【4日目(木)】

とりあえずBGMと効果音探し。

登山客をぶっ飛ばすときに爽快なBGMないかなぁって探していた時にユーフルカさん

 とある勇者の戦いの記憶

がしっくりきたのでこれを採用。


【5日目(金)】

この日はオフにする予定だったので、簡単に登山客のアニメーションや当たり判定の設定して WebGL でテストする予定でした...

WebGL...

そう。ここまで WebGL でテストしていなかったのだ!!!

なんと WebGL で写真を撮影すると画像が荒くなるのだ!

(※パニくってたので画像キャプチャしてないです...)

WebGLの設定を見直したりいろいろ試しても直るどころかどんどん酷くなるだけなのでいったん作業終了(オフにするどころか午前3時ごろまで作業してました...)

【6日目(土)】

いろいろ試してもうまくいかず、この日のツイート

もはやお手上げ状態と思いきや

 ・Unityでスクリーンショットを撮って、それを画面に表示&シェア出来るようになったよ。

 ・【Unity】Social ConnectorでTwitterにスクショを投稿する

を参考にしてうまく撮影できました。わっほーい!

写真が撮影できない問題を解決した後は一気に進み、翌日の朝5時まで作業...

この日にやった作業

 ・登山客をランダムに生成

 ・登山客をぶっ飛ばす

 ・ユニティちゃんと登山客がカメラに写っているかの判定(後述参考)

 ・写真のスコア計算(後述参考)

 ・スコア表示画面

 ・ツイート、ランキングボタンの実装

 ・ツイート、ランキングボタンのデザイン作成

 ・ざっとタイトル画面の作成


【7日目(日)】

いよいよ最終日、タイトル画面の作りこみやデバッグ作業を終えて

ついに...

完成しました!!!

正直20時までに間に合うと思いませんでした!!!


【スコア計算について】

まず高得点を取る方法としては基本的に周りの登山客を蹴散らして終了間際に↓の位置に行ってポーズを決めればOKです。(※減点対象の登山客の位置は1体0~2.75点の間違いでした)

ユニティちゃんが映っていないと0点になります。

この「ユニティちゃんがカメラに写っているかどうか」の判定は

 ・【Unity】オブジェクトが画面外かどうかを判定する方法(まとめ)

 ・特定のカメラに映ってるかの判定【Unity】

を参考にして OnWillRenderObject() メソッドで判定するやり方を採用しました。(こんな感じで)

public class WillRenderObject : MonoBehaviour
{
   [SerializeField] UnitychanController unitychanController;

   // Start is called before the first frame update
   void Start()
   {
       unitychanController.isReflectedSubCamera = false;
   }

   // Update is called once per frame
   void LateUpdate()
   {
       unitychanController.isReflectedSubCamera = false;
   }

   void OnWillRenderObject()
   {
       if (Camera.current.tag == "SubCamera")
       {
           unitychanController.isReflectedSubCamera = true;
       }
   }
}

​ちなみに OnWillRenderObject() はUpdate() とLateUpdate() の間で呼ばれることに注意。

OnWillRenderObject() メソッドでカメラに写っているか判定してLateUpdate() でリセットする感じです。

ただ、OnWillRenderObject() で判定するやり方は、ユニティちゃんが登山客に隠れているときもカメラに写っていると判定されるので、↓の画像でもそこそこのスコアが出せてしまいます...

スクリーンショット 2020-12-30 013649a


【Unity1週間ゲームジャムに参加するメリットとデメリット】

メリット

 ・1週間+αの期限があるのでダラダラ作業して未完成というようにならない

 ・プレイしてくれる人が多いのでモチベーションアップにつながる

 ・実況プレイをしてくれる人がいるので、自分のゲームの欠点や評価がわかる

デメリット

 ・作業が長引いて睡眠時間が不規則になる(昔、交代勤務して自律神経崩壊させた身としては徹夜作業は避けたかった...)


【まとめ】

早めにWebGLでテストでしろ!!!

以上

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