続・Unity1週間ゲームジャムに間に合わなかった話

#はじめに
また、Unity1週間ゲームジャム(#unity1week)に間に合いませんでした。

前回
https://qiita.com/pio/items/f9734ad96cf088b321a5

ということで、今回も失敗したところや作業のタイムテーブルをまとめたいと思います。

#作ったもの

流行りのオートチェスを作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113293/b34b204f-9f6e-06c0-1f69-adc29cb7f4de.png)
https://unityroom.com/games/autokanjichess

漢字がユニットで、四字熟語シナジーや部首シナジーでユニットを強化して戦うオートチェスです。
漢字にした理由は、キャラクターのアイデア出しやリソース作成の手間を省きたかったから。
更に、シナジー効果も漢字だったら部首を使えばとっつきやすくて一石二鳥だ、ということで「AutoKanjiChess」の開発がスタートしました。

#失敗したところ

- ユニット周りの実装で悩んだ
- 徹夜したら体壊した

前回の失敗から、今回は**クラス設計はしませんでした。**おかげで、戦闘時にユニット動かすクラスが勝敗判定したり、手持ちユニットを管理するクラスがシナジーの計算したりと、**神クラスがちらほら生まれました**が、長考することは少なくなり、後半はシナジーシステムを2時間で実装出来たりとスピード感を持って開発出来ました。

また、今回もUniRxを使いました。今回はお金の増減時の通知などゲームロジック側にも通知を活用しました。結果、お金の増減処理のロジック部分にUIの動きを記述しなくて済み、コードの見通しがよくなりました。UniRxの恩恵を感じることができたような気がします。

##ユニットの実装

オートチェスのユニットは、**買ったり売ったりつまんだり戦ったり…**といろいろやることが多いです。この辺りの実装がだいぶ苦戦しました…。
正直あまり苦戦しないだろうと思い、**作り始めるのがちょっと遅れたのが一番痛かった**です。前回もゲームのメイン部分を作り始めたら「あれ？時間かかるぞ…」ってなったので、成長していない…。

ゲームのメイン部分が無いと**「オミット」**すら出来ないので、最初に時間を取ってメイン部分は形作るのが良さそうです。スタートダッシュです。

ちなみに、悩んだところとその実装は以下になります。

### ユニットの戦闘と準備中の状態遷移
実装：戦闘になったら、盤上の手持ちユニットから戦闘用のユニットを作成した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113293/b25e60b9-d371-88ef-44c6-53025293fe46.png)

AutoKanjiChessでは戦闘中はユニットが動いて、戦闘が終わると元の場所にユニットが戻ります。
戦闘管理用の**神クラス**と手持ちユニット管理の**神クラス**の**2柱**のクラスが居るので、ユニットのクラスは自発的に動かないような作りにして、これらの神クラスから動かすようにしました。
そして、戦闘が始まったら、

- 手持ちユニットから、戦闘管理用の神クラス側にユニットを生成
- 手持ちユニット側のユニットは隠す

という処理をして、切り替えを実現しました。

おかげで、戦闘管理用のクラスと手持ちユニット管理のクラスで、似たようなユニット操作の関数が生まれたりしました…。重複した記述はまずいので、片方のクラスにstatic publicで統一したりしましたが、見るに堪えないコードになりました…。

### ユニットのマス単位のドラッグ操作

実装：各マスの中心に「マスオブジェクト」を作成して、ドラッグ中は一番近いマスオブジェクトにユニットをくっつけた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113293/8863f31b-c998-f2fd-d6c4-82768597966a.png)

普通のマス目状のゲームなら「マス目のサイズ分ずつずらす」とかのアプローチを取るんですが、オートチェスでネックになるのが「手持ちユニットのマス」。
盤上とは別のマスなので、盤上のマス目で移動させるとズレてしまいます（手持ちのマス目も盤上のマス目に合わせて配置するという手もありますが）
そこで、位置調整用の「マスオブジェクト」を移動可能なマスに設置して、距離を計算するというアプローチを取りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113293/8fa61340-1e49-14af-59fd-f0e7da4f7fff.png)


これは結果的にマスのエフェクトを出す時にオブジェクトにくっつけるだけで良かったり、移動範囲を制限する際にオブジェクトを生成しなければ良かったりと使い勝手が良かったです。

##徹夜したら体壊した

7月5日金曜日、飲みがあり作業時間が取れなかったのと、翌日土曜日の朝にBBQがあったので、徹夜を決行しました。
そして土曜日、BBQから帰ってきたら、頭がボーっとする…。一回寝ても体調が回復せず、体温を測ったら**38度**まで熱が上がってました…。
幸い鼻水とか咳とかはなかったですが、脳みそが半分ぐらい働いてませんでした…。

やっぱり徹夜は悪い文化…。作業時間の見積もりも徹夜前提は絶対やめましょう…。

#実作業タイムテーブル

前回と同じくメモしましたので載せておきます。

総作業時間は大体45時間でした。メモ忘れもありますが50時間は切るぐらいかと。

###7/2(火) 作業時間:2.5h
2200-2230
素材集め
2230-2330
盤面シェーダー作成
2330-0030
ビルド、実環境確認

###7/3(水) 作業時間:2h
2200-0000
ユニット設計
MVPとかで迷走して手付かず。
フォント変えたりもした。

###7/4(木) メモ忘れ
たぶんユニットの見た目作ってたハズ。

###7/5(金) 作業時間:9.5h
2200-0730
ユニットの動きを作成
かなりバグだらけで萎えるわ、集めるテーマに必要ないことに気づいて更に萎える

###7/6(土) 作業時間:2h
1530-1600、2330-0100
朝出かけて、お昼過ぎに帰って作業しようとするも、力尽きてダウン。夜起きると熱が…。
ユニット購入、ユニット数、ラウンド数、所持金、タイマーのUIを組んだ

###7/7(日) 作業時間:7.5h
1030-1330
GameTimer,MoneyController作成
2000-2200
ショップ、手札作成
2300-0130
ショップ購入作成、ユニット

###7/8(月) 作業時間:5.5h
2130-2300
ユニットのドラッグ処理
2300-0300
ユニットの合成処理

###7/9(火) 作業時間:6h
2100-0100
ユニットの出撃、敵ランダム編成、出撃数制限（売却）

0100-0300
勝敗判定、勝利時のラウンドループ、ループさせた時のデバッグ
デバッグ内容
	戦闘開始時に前の戦闘結果が残る
		コピーコンストラクタ作って対応
	戦闘したユニットがドラッグできなくなる
		有効無効化でSubjectの初期化をしないように。

###7/10(水) 作業時間:6h
0700-0930
勝利敗北演出作成
タイトル作成
ここでゲームループ完成

1630-1730
ランキング実装、ラウンド進めると歩ける場所が減るバグ修正、
移動で固まる問題修正（移動先かぶったら移動しない仕様がそもそもバグ）

####1745 投稿！

2300-0030
★4できちゃう問題デバッグ
ユニット売却
7/10 0030-0130
音探し、音付け

###7/11(木) 作業時間:4h
2300-0100
データうち。シナジーデータ10種、漢字44種

0100-0300
シナジー実装

作業終了

#おわりに

今回も「なぜ間に合わなかったか」をつらつら書こうと思いましたが、やめました。
何故かと言うと、今回のUnity1Weekでは私のゲームと同じく遅刻組の「REC」が1位を取っていらっしゃったからです。

> https://unityroom.com/games/rec

Ryosukeさんの開発記事はこちら

> https://ryo620.org/2019/07/unity1week-game-jam-6/

遅刻してもモノを作れば**ちゃんと評価される**のがUnity1Weekの良いところです。
拙作の「AutoKanjiChess」も「面白かった」とコメント頂けたり、作者である私のハイスコアを超えるぐらいやりこんでくださった方がいらっしゃったりと、開発者としてすごく嬉しい反応を頂けました。

もちろん遅刻しないに越したことはないと思いますので、前回、今回を踏まえて、次こそは期間内に投稿したい…！