見出し画像

おっさんの夏休み2020(ゲーム作り編)

夏休みである。35近いくたびれたおっさんの、短い夏休みである。

俺は都民ではない。しかし都内勤めである事は間違い無い。こんな状況で帰省でもしようもんなら、近隣の住民から石を投げられるかもしれん。噂話が高速で駆け巡るタイプのド田舎なので、割とガチだったりする。

それに、高齢の親に対して流行り病をデリバリーしようもんなら、後悔してもしきれん。実家に帰れば飯が自動的にできて、風呂も自動的に沸くという神秘体験ができるので楽しみにしていたのだが、東京の感染者数が500人を超えたその日に「もうむりぽ」と思って帰省の新幹線をキャンセルした。

引き篭もるか、出掛けるか

夏休みに入る少し前。巷を騒がすコロニャンのせいで、究極の二択を迫られていた。ひたすら鬼の様に引き籠もるか、近場に出掛けてエンジョイジョーイするかだ。

ひたすら引き篭もって趣味のゲーム制作に全力を出すべきだろうか。Unityで作ったゲームを投稿できる「unityroom」という神サイトが、1週間でお題に沿ったゲームを投稿しようぜという「unity1week」という神イベントをやるらしい。ちょうど開催期間と夏休みが被るので、5ヶ月ぐらい前から毎日シコシコとゲーム作って遊んでる身としては、是非参加してみたかった。

しかし、ちょっと待てよ、と。発想力が枯渇してるおっさんプログラマが考えたゲームだ。日本中、いや、下手したら海外からもガチ勢が参加してるであろう著名なゲームジャムで、頭角現せんのか?と。

こちとら本業は組み込み屋。クリエイターとは対角に位置する人間であり、顧客から求められている要件、答えの決められているモノを作る毎日である。自ら何かを考え生み出す、という行為が業務の中で殆ど無い。

なので企画力なんてものはゼロに等しく、数学的な知識も半端なので、日頃からおもろい事を考えてる人間や、ガチ理系のスーパープログラマーには到底敵う訳がない。例えここで本気で1週間頑張ったとしても、それは報われるのか?と。俺は根本がネガティブな人間なので、そんな感情が頭の中でひたすらぐるぐるしていた。

あともうひとつ、自信の無さを助長するものがあった。俺の中でゲーム制作のルールに「基本的に毎日、早朝の30分〜1時間しか使わない」という制約と誓約がある。クラピカだと幻影旅団絶対殺すマンになれるが、俺はそんなレベルの事は到底できない。

そんなことやってる理由としては、早朝という頭が比較的冴えてるタイミング、かつ出勤前の短い時間でないと、集中力が持続しないからだ。一週間、ひたすらゲームを作れるほどの集中力は絶対にないだろう。断言できる。絶対飽きて完成しない。

ではキッパリとゲーム制作を諦めて、近場にでも旅行へ行くのはどうだろう。「バーロー!それじゃ帰省と変わらねえじゃねーか!」と思う諸兄も居る事だろう。俺はそれにうまく反論できるほどの確固たる材料を持っていない。

しかし、観光業界のダメージ受けっぷりがここんとこ半端ないのは、様々なメディアが報じているとおりである。せめて、俺の推し観光地がこの先生
きのこる為に、少しでもお金を落としておきたい。それに、お盆を明けると都の感染者数は1日1000人超え出すかもしれない。そうなると、県外に出る事すら許されなくなるかもしれない。タイミングは今しかない、と思った。

渡りに船と言わんばかりに、お国は「GOTOキャンペーン」なるものをやっている。このタイミングなので批判殺到している模様だが、それも地方民からしてみれば仕方が無い事だとは思う。あと、俺だけかもしれないが、Cプログラマーとしてキャンペーンのタイトル(GOTO)が心臓にドチャクソ悪い。BASICだと空気の様な存在だったのになぁ・・・

まあそれはさておき、件のキャンペーンはざっくり言うと8月時点では「35%の宿泊費が補助される」という内容。こいつを使って、前々から泊まりたかった1泊ン万円のホテルに一度泊まってみたい、という気持ちがあった。詳細は伏せるが、割引前だとニンテンドースイッチ本体買えちゃうレベル。

「ゲームを作りたい」「近場に旅行したい」という2つの気持ちを天秤にかけた。しかし、どちらも捨てきれなかった。8月11日にホテルの予約を入れてしまったし、GOTO某の申請もしてしまった。そして8月10日からゲームジャムが始まる。どうすっかなぁ、と悶々とした気持ちを抱えつつ、8月9日は床についた。

ビールの力を勇気に変えて

ゲームジャムで出されるお題は、いかようにでも解釈してOKなのだという。ネットで調べた所によると、例えば「あつめる」であれば、「あ」を詰めるゲーム、としても問題ないらしい。奇抜な発想力や企画力、1週間でそれを実装に落とし込めるだけの実力が試されるイベントなのである。

8月10日の0時30分、ふと目が覚めた。Twitterを覗くと、今回のテーマは「ふえる」だった。寝起きの頭をフル回転させるが、全然捻ったアイデアが出てこない。「笛る」だとか「腐L」だとか、どうしても無理やり捻り出した感じになってしまう。

なんの気無しに、パソコンに電源を入れる。ふと、パソコンの横に置いてある俺の聖書(バイブル)、「ドラえもん」の単行本が目に入った。

・・・いや、あのネタはいかん、いかんぞ。絶対被るし、捻りも糞もない。

そうこうしているうちに、1時。パソコンは起動したが、まだ指は動かない。しばらくネットサーフィンして、ゲームジャムに参加する際の心得みたいなものを調べて回った。

その中で「数百作品も出てくる訳だし、ネタ被りなんて気にすんな。同じようなゲームでも、その人なりの個性が出て楽しいもんだぜ。」というアドバイスを目にした。

そうだなぁ、細かいことを気にしてたら、一歩も踏み出せない。肩の力を抜いていこう、と思った。しかし、踏ん切りがつかない。こんな時は、まるでだめなおっさん御用達の、魔法の力に頼るしかないだろう。

俺は冷蔵庫の扉を開けると、アサヒスーパードライを手にとった。

バイバインができるまで

一応解説しておくと、ドラえもんには「バイバイン」というひみつ道具がある。バイバインは目薬のような容器に入った薬物で、その液体を増やしたい物に対して一滴垂らすと、5分に1回、分裂して倍になる。2nの累乗で、指数関数的に増殖していくのだ。しかし、「食べた物については増殖が止まる」という性質も持ち合わせている。

のび太は、1つの栗まんじゅうをバイバインで増やしてたらふく食べるのだが、増殖のスピードが早くて消化が追いつかなくなる。親族や友人達に手伝ってもらうものの、結局食べきれずにゴミ箱へ捨ててしまう。その様子を見て驚愕したドラえもんは、クソデカ風呂敷に栗まんじゅうを包み込み、ロケットで宇宙に捨てる・・・という流れである。

考えるだけで恐ろしい。日常的にビット演算を扱うプログラマであれば、ビットを左に1個シフトしただけで、とんでもなく値が大きくなる事はお分かりだろう。1個の栗まんじゅうが32回分裂を繰り返せば、32bit値の上限である42億に達する。42億の栗まんじゅう。もぅマヂ無理。。。ロケットで飛ばそ。。。

この恐ろしさを、目に見える形でシェアしたかった。
それが、今回作るゲームの主題である。

画像1

苦いビールを口に運びながら、甘いものを作る。栗まんじゅうは、blenderでUV球を変形させて、栗まんじゅうの画像から色拾って雑にテクスチャペイントした。それをFBXにエクスポートして、Unityにぶちこむ。

画像2

なんか栗まんじゅう置くだけだと殺風景だったので、AssetStoreからムーディーな家のアセットを丸ごと持ってきた。アプリ容量クソでかいが、主犯はこいつである。

次は、栗まんじゅうを増やすアルゴリズムである。原作では5分で2倍になるが、ゲームでそのままにすると大変なので、5秒で2倍になる設定にする。

    // 栗まんじゅう生成くん
   private GameObject KurimanGen(Vector3 position){
       // なぜかモデル90度回転してるから補正する
       Quaternion rote = Quaternion.Euler(-90.0f, 0.0f, 0);
       return (GameObject)Instantiate(this.kurimanjuPrefab, position, rote);
   }

   // 5秒ごとに生成
   private IEnumerator kurimanCoroutine(){
       yield return new WaitForSeconds(this.genSpan);

       // 制限時間内
       if(this._mode == GameMode.Play){
           // 追加用栗まんじゅうのリスト
           List<GameObject> listAdd = new List<GameObject>();

           // 全栗まんじゅうのオブジェクトを走査
           foreach(GameObject g in this.listKurimanObject){
               // 栗まんじゅううにInstantiateしたオブジェクトを追加
               listAdd.Add(this.KurimanGen(g.gameObject.transform.position));
           }

           // 生成した栗まんじゅう達をリストに追加
           this.listKurimanObject.AddRange(listAdd);

           // もういっちょ
           StartCoroutine(this.kurimanCoroutine());
       }
   }

全体的に頭わるい感じだが、栗まんじゅうのオブジェクトをリストで持って、genSpanに5秒を設定、コルーチンで再帰的に呼び出す。

そのたびに栗まんじゅうを全走査して、同じポジションに栗まんじゅうを生成するだけである。同じポジションに生み出すことでBoxColliderによる衝突判定が働き、もちろんRigidbody(物理演算)が荒ぶって大変なことになるが知った事ではない。

この時点では、栗まんじゅうが増えるだけなので、ゲーム性は皆無だ。最初は倍々に増えていく栗まんじゅうの恐ろしさが伝わればそれでいい、と思ったのだが、最低限のゲーム性っぽい何かは付け足しておこうと思った。

じゃあ、タップされたら栗まんじゅうを食べたことにして、それを制限時間にどれだけ食べられるかって感じにしちまうか。もうどうにでもな~れ。

    // タップされたとき処理
   public void OnTap(){
       //Destroy(this.gameObject);
       this.isDead = true;
   }

栗まんじゅう側にはEventTriggerで呼び出されるタップ処理を実装。タップしたとき直接死ぬとリスト管理から変な外れ方してConsoleに赤シイタケが出るので、とりあえず死んだよフラグを立てるだけにする。(このとき、CameraからRaycast出す設定忘れてて判定取れず、10分ぐらい詰んだ。)

switch(this._mode){
   case GameMode.Play:
       // ゲームプレイ中はくりまんじゅうタップ監視
       for(int i = this.listKurimanObject.Count-1; i >= 0; i--){
           Kuriman k = this.listKurimanObject[i].GetComponent<Kuriman>();
           if(k.IsDead){
               // 食べたエフェクトを再生させようかと思ったけど
               /*
               Vector3 pos = k.GetPos();
               Instantiate(this.KillEffect, pos, Quaternion.identity);
               */
               this.listKurimanObject.RemoveAt(i);
               k.Kill();
               this.eatCount++;
               this.EatCountUI.text = this.eatCount.ToString()+"こ";
               // 効果音めんどい
               //this.audioSource.PlayOneShot(this.killSound);
           }
       }
      

ゲームの更新処理では、リストの中で死んでそうなやつがいたらリストから外してKill()経由でDestroy。アルコールに脳みそやられてる状態でコーディングしてるだけあって、ソースコードの随所から諦めが見て取れる。

ぶっちゃけリストのループ処理も走り書きだし、ロクに動作確認してないからバグあるかもしんない。あとは、いつものTime.deltaTimeで制限時間をカウントダウン処理をするだけの手抜き実装である。

まあ、これでゲームはできたと言い張ろう。あとはテキトーなタイトル画面をつければそれっぽくなるじゃろ。

俺はおもむろに画像加工ツールのGIMPを立ち上げた。最初は「バイバイン」とだけフォントを打ち込んでそれを加工して若干立体化させてみたが、なんだか味気なかった。スピード重視にしても、もうちょっとインパクトある感じにできんだろうか?

画像3

と、思い直してInkscapeで作りなおした画像がこちら。どうみても某アニメのパクリです本当にありがとうございました。いや、だいぶ前にパチンコで遊んだ程度の知識しか無いからよく分かってないのだけれど・・・おもしろいよねあれ。

そして午前4時前。酒の効力が切れつつあり、眠気も襲ってきた。ここで冷静になってしまうと、これまでの作業が無に帰す。限界だと感じた俺は最後の気力を振り絞り、Androidにエクスポートしてゲーム画面を一発撮り、WebGLにプロジェクトを吐き出してunityroomに投稿し、眠りについた。

それでもやっぱり酒を飲む

9時頃にのそのそと起き上がり旅行の準備を進めていると、Twitterの通知がやたらバンバン来てる事に気づく。4時頃のツイートが、やたら「いいね」や「リツイート」されていたのだ。

今回はせいぜい数十件程度なので、世の中の基準で考えると決して「バズってる」とはいえない量だが、それでも初めてなもんはビビる。自分のツイートが数百、数千、数万と伸びてる人はメンタル大丈夫なんだろうか。俺にはきっと無理だ。

俺は基本的にメンタル腐ってるので、「いろんな人に評価してもらえてる!うれC!」というより「あんな勢いだけの某を投稿して、真面目にゲーム作ってる人たちに申し訳ねえなぁ。」という負の感情が先に湧いてしまった。

そんな気持ちを和らげるには、とにかく酒だ。まるでだめなおっさんの発想力だが、今はこれしかない。冷蔵庫の扉を開けて、OKストアで87円(実際安い)のZIMAに手を伸ばす。ちなみに、原産国はアメリカ→中国→ベトナムと遷移してきたらしい。なんかIT業界のオフショアみを感じる。

なんにせよ、無鉄砲にハッシュタグをつけて投稿した事で、それなりの人達に見て貰えたのは事実だ。Twitterは身内向けだったのだが、今回のツイートでその界隈の人々に何名かフォローして頂いたので、感謝のフォローバックをぶん投げておいた。

俺は極度のコミュ障なので他人への絡み方はまったくわからないが、彼らもまた、unity1weekに参加している猛者達だ。俺はまだこの手のゲームジャムについて空気感が分かっていないので、他の人がゲーム開発に勤しんでいる姿を眺めてるだけでも、色々と参考にできる事もあるだろう。有用なAssetや技術について呟いてくれている人も居るので、自分の糧にもなる。

unity1weekは、他人が作ったゲームへの評価期間を含めてのお祭りなので、投稿したらそこで終わりではない。「俺ごときが偉そうに他人の作ったゲームに口出していいのか?」という感情が強いのでコメントするのは難しいかもしれないが、せめて自分が面白いと思った作品には、積極的に「いいね」的な奴をプッシュッシュしていきたい。

(Goto編につづく)

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