こんにちは、藍鼠です。3DCGデザイナーもしくはプログラマーとして就職活動中です。誰か職をください。
さて、プログラマーとして就職活動しようにも何も作った実績がないため、何か制作物が欲しいと思っていました。また、その一方で最近「Unityの教科書」という本を手に入れてUnityの勉強をしていたため、Unityで何かを作りたい気持ちもありました。
それらの思惑が混ざり合い、5月後半はUnityでゲームを制作することにしました。目標は1週間~2週間です。ちょろっと遊べるミニゲームならその程度で作れるでしょうと考えていました。
さて、ゲームを作ろうにもゲームの仕様書が無いと何も始まりません。とはいっても突然何かが思いつくわけでもないので、仕様書は自分の好きなゲームから拝借することにしました。イラストで言うなら模写のようなものです。(僕はプランナーになりたいわけではなく、仕様書通りにプログラムを作るプログラマーになりたいため、公開範囲を制限すれば仕様書を拝借しても問題ないと考えました。問題があれば言ってください。)
今回作るゲームはこちら、プレイステーションで発売されたXI[sai]というゲームです。キャラクターを動かしてダイスを転がし、同じ目のダイスを目の数だけ並べるとダイスが消えるというゲームです。
特にその中でもランダムパズルという、「盤面が4×4」「ダイスの数は6つ」「ダイスの初期位置はランダム」「手数は20」というものを作ってみることにしました。
1日目
1日目はとりあえずオブジェクトを作成しました。ダイスや盤面などは自分で作らないといけないので、サイコロの3Dモデルや盤面のテクスチャなどを描きました。何気にこれに1時間くらいかかっちゃってます。
それと、ダイスの回転を実装しました。Unityではものの回転をTransformコンポーネントから簡単にできることは理解していましたが、任意の軸を中心に回転する方法は分かりませんでした。調べたらコード1行でそれができる方法が見つかった*1のでそれを参考に実装しました。
ついでに原作通りダイスの上にキャラクターを配置しました。Unityちゃんを使ってもよかったんですけど、せっかく自分の作ったモデルがあるので設置してみました。カワイイですね。
Unityで某ゲームの模写?というか真似事でコードの練習をしています。 pic.twitter.com/arYg5RVm4c
— 藍鼠 (@indigo_mou5e) 2020年5月13日
2日目
2日目はダイスを複数作り、ダイスを転がす先にすでにダイスがある場合にそのダイスに乗り移ることを実装しました。意外とこれが難しく、動く先にダイスがあることが分かってもそれがどのダイスか判別を付けるのに苦労しました。
2日目はこれに苦労して殆どこれだけしか実装が進んでいません。
3日目
3日目はゲーム内でそれぞれのダイスにおいてどの目がでているかどうかの追跡を追加しました。
人には見て明らかですが、コンピューターにはいちいち教えてあげなければいけません。いくつか方法が思いつきましたが、ダイスがある状態の時、ある方向に転がったら次はどの向きになるというのをプログラムで表す*2という方法にしました。
また、左下と右下にデバッグ用UIとして盤面を表示するようにしています。左下がどの目が出ているかで、右下がサイコロの固有タグですね。
ダイス間の乗り移り、どの目が上を向いているかの追跡を追加。とりあえず土台が完成といったところかしら。 pic.twitter.com/HK8Zjp7Fs1
— 藍鼠 (@indigo_mou5e) 2020年5月15日
4日目
4日目は初期位置のランダム化を行いました。
これもrandom関数を使えば簡単なプログラムに見えますが、ランダムに作ったサイコロの向きを実際に再現するのに時間がかかりました。結局、以下のようにサイコロの出目と向き24通りについて初期のRotationを手動で描きだすというあまりエレガントでない方法になってしまいました。
5日目
5日目は日曜だったのでお休み。神様も日曜には休めって言ったり言ってなかったりするらしいし。本当は4日目の深夜にSEKIROして心身共に疲れ果てたせいなんだけど…
6日目
6日目はダイスがいくつ繋がってるかの記述を追加した。
メソッドの再帰呼び出しを使いつつ、ダイスを転がすごとにその目がいくつ繋がっているかを調べる。目の数以上につながっていた場合、ダイスが赤く光り沈んでいく…のだけどとりあえず赤く光るところまで。
なにげにこの実装のためにスクリプトからマテリアルの変更を行ったりしている。色々なことに手を出して経験を積めるのはいいですね。
初期位置のランダム化とバニッシュ判定を追加。判定だけなので今のところ光るだけ。沈むなどの挙動はこれから追加する。 pic.twitter.com/JcaPshS2LT
— 藍鼠 (@indigo_mou5e) 2020年5月18日
7日目
6日目は赤く光ったダイスが沈んでいき、消えるところまで実装。
消えたダイスをちゃんと消去したり、データ内でもちゃんと消去したり、けっこう手間がかかりました。消えたはずのダイスが目の判定だけ残ってて、勝手にダイスが消えたり…といったバグもあったりして、その修正にも追われてました。
8日目、9日目
でもこれでゲームとしてはほとんど完成したようなものです。あとはリトライ機能を付けたり手数に制限を加えたり、ハッピーワン*3を実装したりといったこまごましたことばかりです。
何となく山場を越えるとやる気がなくなるもので、これらの実装に何気に時間がかかっちゃいました。でも手数制限を加えると一気にゲームっぽくなりますね。スリルが出てきて、遊んでて楽しいです。
プログラム模写、完成した!600行くらい。疲れたー。 pic.twitter.com/cH9MWgAOhF
— 藍鼠 (@indigo_mou5e) 2020年5月21日
というわけで、終わってみれば9日でプログラムを完成させることができました。仕様書丸パクリということで公開はできないのが残念ですが… 次は自作のゲームを作って公開したいですね。就活の合間にそんな時間があるかちょっと不明ですけど。
それでは、また。