葉脈と潮流

純粋さを磨き、迷わない。

Unityで9日間でゲームを作ってみた

 こんにちは、藍鼠です。3DCGデザイナーもしくはプログラマーとして就職活動中です。誰か職をください。

 

 さて、プログラマーとして就職活動しようにも何も作った実績がないため、何か制作物が欲しいと思っていました。また、その一方で最近「Unityの教科書」という本を手に入れてUnityの勉強をしていたため、Unityで何かを作りたい気持ちもありました。

 それらの思惑が混ざり合い、5月後半はUnityでゲームを制作することにしました。目標は1週間~2週間です。ちょろっと遊べるミニゲームならその程度で作れるでしょうと考えていました。

  

 さて、ゲームを作ろうにもゲームの仕様書が無いと何も始まりません。とはいっても突然何かが思いつくわけでもないので、仕様書は自分の好きなゲームから拝借することにしました。イラストで言うなら模写のようなものです。(僕はプランナーになりたいわけではなく、仕様書通りにプログラムを作るプログラマーになりたいため、公開範囲を制限すれば仕様書を拝借しても問題ないと考えました。問題があれば言ってください。)

 

www.youtube.com

 今回作るゲームはこちら、プレイステーションで発売されたXI[sai]というゲームです。キャラクターを動かしてダイスを転がし、同じ目のダイスを目の数だけ並べるとダイスが消えるというゲームです。

 特にその中でもランダムパズルという、「盤面が4×4」「ダイスの数は6つ」「ダイスの初期位置はランダム」「手数は20」というものを作ってみることにしました。

 

1日目

 1日目はとりあえずオブジェクトを作成しました。ダイスや盤面などは自分で作らないといけないので、サイコロの3Dモデルや盤面のテクスチャなどを描きました。何気にこれに1時間くらいかかっちゃってます。

 それと、ダイスの回転を実装しました。Unityではものの回転をTransformコンポーネントから簡単にできることは理解していましたが、任意の軸を中心に回転する方法は分かりませんでした。調べたらコード1行でそれができる方法が見つかった*1のでそれを参考に実装しました。

 ついでに原作通りダイスの上にキャラクターを配置しました。Unityちゃんを使ってもよかったんですけど、せっかく自分の作ったモデルがあるので設置してみました。カワイイですね。

 

2日目

 2日目はダイスを複数作り、ダイスを転がす先にすでにダイスがある場合にそのダイスに乗り移ることを実装しました。意外とこれが難しく、動く先にダイスがあることが分かってもそれがどのダイスか判別を付けるのに苦労しました。

 2日目はこれに苦労して殆どこれだけしか実装が進んでいません。

 

3日目

 3日目はゲーム内でそれぞれのダイスにおいてどの目がでているかどうかの追跡を追加しました。

 人には見て明らかですが、コンピューターにはいちいち教えてあげなければいけません。いくつか方法が思いつきましたが、ダイスがある状態の時、ある方向に転がったら次はどの向きになるというのをプログラムで表す*2という方法にしました。

 また、左下と右下にデバッグ用UIとして盤面を表示するようにしています。左下がどの目が出ているかで、右下がサイコロの固有タグですね。

 

4日目

 4日目は初期位置のランダム化を行いました。

 これもrandom関数を使えば簡単なプログラムに見えますが、ランダムに作ったサイコロの向きを実際に再現するのに時間がかかりました。結局、以下のようにサイコロの出目と向き24通りについて初期のRotationを手動で描きだすというあまりエレガントでない方法になってしまいました。

f:id:indigomou5e:20200521233058j:plain

 

5日目

 5日目は日曜だったのでお休み。神様も日曜には休めって言ったり言ってなかったりするらしいし。本当は4日目の深夜にSEKIROして心身共に疲れ果てたせいなんだけど…

 

6日目

 6日目はダイスがいくつ繋がってるかの記述を追加した。

 メソッドの再帰呼び出しを使いつつ、ダイスを転がすごとにその目がいくつ繋がっているかを調べる。目の数以上につながっていた場合、ダイスが赤く光り沈んでいく…のだけどとりあえず赤く光るところまで。

 なにげにこの実装のためにスクリプトからマテリアルの変更を行ったりしている。色々なことに手を出して経験を積めるのはいいですね。

 

7日目

 6日目は赤く光ったダイスが沈んでいき、消えるところまで実装。

 消えたダイスをちゃんと消去したり、データ内でもちゃんと消去したり、けっこう手間がかかりました。消えたはずのダイスが目の判定だけ残ってて、勝手にダイスが消えたり…といったバグもあったりして、その修正にも追われてました。

 

8日目、9日目

 でもこれでゲームとしてはほとんど完成したようなものです。あとはリトライ機能を付けたり手数に制限を加えたり、ハッピーワン*3を実装したりといったこまごましたことばかりです。

 何となく山場を越えるとやる気がなくなるもので、これらの実装に何気に時間がかかっちゃいました。でも手数制限を加えると一気にゲームっぽくなりますね。スリルが出てきて、遊んでて楽しいです。

 

 

 というわけで、終わってみれば9日でプログラムを完成させることができました。仕様書丸パクリということで公開はできないのが残念ですが… 次は自作のゲームを作って公開したいですね。就活の合間にそんな時間があるかちょっと不明ですけど。

 それでは、また。

*1:Unity様々っすね…

*2:例えば奥に転がせば手前に見えている目が上に来ます

*3:1の目の消し方。詳しい条件はここでは割愛