2024/12/23-29 Unity1週間ゲームジャムの記録

# はじめに
22日に枠を確保して23に書き始めるというおかしいことをしていますが、これは名工大 Advent Calendar 2024の記事になります。書きたいことがぱっと思いうかばなかったので何を考えて作ったのかを書いていこうと思います
(2日目の自分から追記です。やりたいことやる→書くっていう流れになった結果マジで殴り書きになってます。1日目まで読んだら流し読みでいいです。)
ちなみに直前までにじさんじ歌謡祭を友達とカラオケで見てました。ぜひDay1のラスト「双竜会」を見てくれ。くそかっこいいから。なんならこの記事読まなくてもいいから

https://adventar.org/calendars/10625

https://www.youtube.com/watch?v=a1HkbyhpFOw

# Unity1週間ゲームジャムとは
UnityRoomが企画する一週間で特定のお題に沿ったゲームを作って公開しようというお祭りです。一週間で作って、一週間で互いを評価しあって、高評価だといいよねっていう感じ。

# 今回のお題
**「ない」** だそうです。

# ゲーム案の考え始め
まずはどういうアプローチがあるのかを考えていきます
- 「ない」が「ある」ゲーム
    - 空っぽの枠だけ用意して好きに調整できるタイプ
    - クイズノックの動画で得点のルールを書き換えていいみたいなやつがあった
        - 好きな特殊効果を付け替えて戦うのは楽しそうだけど面白味が怪しいかも？
        - レベルアップ条件とかもいじれるようにしちゃえばいいのか。面白そうかも
    - 「ない」を使ってパズルとかできないかな
        - 「ない」という属性をぶつけてオブジェクトを消せるみたいな
- ゲームによくあるものをなくしてみる
    - 基本を疑うみたいなよくある手法
    - RPGから「目的」を無くして「なににでもなれる」的な
        - ちょっと規模が大きくなりすぎそうだなぁ
        - 倒す相手に応じて勇者orならずものor懸賞金ハンターを自由に選べる感じならできそうかも？
    - 音ゲーから「スコア」を消してみるとか
        - 何をモチベーションにやるようになるんだろう
        - むずいな

# 方針決定
「ない」が「ある」ゲームを作ってみます。
- レベルアップ条件
- 特殊攻撃の内容
とかにドロップしたルールのかけらをはめてゲームを作っていく感じにしたい。
タイトルはゆっくり考えましょう

# 実装検討
Funcをうまく使っていく感じになるだろうな。関数をうまく連結させるイメージ。
ドロップとかアイテム一覧は使い慣れてるScriptableObjectでつくってinspector登録で実装が楽そう。情報としては所持、効果、効果対象(ルールのどこに使えるか)、表示レベル(図鑑一覧に所持前から表示させるか)くらいあればいいかな

# シーン検討
どういうシーンが必要かを考えましょ
- タイトル
    - ゲーム開始ボタン
    - (続きから　保存まで実装できるかなぁ)
    - オプション
        - マウス感度
        - 音量
- メイン
    - ゲームのメイン操作全般
    - HPバー
    - (MP 精神力使う系の技あるといいよね)
    - メニュー
        - オプション(前述)
- ゲームオーバー
    - いらないかも...?

# ステージ検討
どんなステージにしましょうねぇっていう。雑にTerrainにしとくのが丸いか
# 考えないといけないこと
- ゲームバランス
    - HPとかMP消費させようとしてもつけないほうが得な場合がほとんどな気がする
        - 威力1.5倍とかと一緒にルールのかけらにしちゃえばいっか。
- ルールの形
    - 特殊攻撃「火の」「弾」を生成し「10」ダメージを与える
    - レベルアップ条件「敵を倒したら」「1」レベルアップする


# タスク整理
簡単にNotionで管理することにします。時間優先で進めてるので結構雑な運用になるけど
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821450/78f5b7e7-425d-6e20-617e-06a0bcd131ed.png)
ついでにここで使用素材もメモっちゃいましょう。あとで分からなくなりがちなので

# 開発開始
ひとまずGithubを用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821450/1213caa7-df8f-af22-be01-e8544d42cf81.png)
どんどんやっていきます。細かい報告面倒なので日ごとに進捗を書き連ねていく感じで

# 1日目進捗
プロジェクト作成
ルールのデータ作成
なんとなくPostProcessingで雰囲気いじって遊んでみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821450/0e18edf5-7c46-c8e1-a04b-5c65be46f1b3.png)
簡単な移動の実装した後Chinemachine使ってカメラを作った。
その後タイトルを仮実装して、試しにDoTweenを使った動きをつけて遊んだ
シーン遷移にはネットに落ちてるFadeManagerを使って一瞬で遷移しないようにしてる

一旦Titleの仮実装→Mainへ移動→操作までのTPSテンプレート的なとこまで4hくらいで終わり。この後は友達と歌謡祭を見る会vol2があるので夜まで飛びます

帰宅後ステージにAssetStoreから木とか家を持ってきて配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821450/b42d7deb-cb52-bad0-67e6-ae8d00497b85.png)
UIの整備をした
そしてルールの実装開始したがきれいな実装がマジで思いつかない。いったんゲームオーバー条件を初期化するところまではできたけど...うーん
変更手順でブロックをはめていくみたいな処理をしたかったけど一週間できれいに作るの無理かも。一覧から順に選ばせる形式なら実装方針立ちそうだからそっちを検討してみます。
明日に続く
...と思ったが実装を考えてたら寝れなかったので9時前まで延長戦
処理しやすい順番にルールのかけらを選ばせることでゲームオーバー条件をHP<=0からHP<=1とかに数値変更できるとこまで実装完成。激アツ
コードは汚いけど個人的に拡張性ある実装にしてあるから条件増やす分には何とかやれそう。
朝?昼?飯食べて寝ます。明日はルールのかけらを選ぶ部分をきれいにするところからやって、その後攻撃か敵の実装をやろうかな
おやすみなさい

# 2日目進捗
今日はまふまふのアルバムのフラゲ日だったので聞くところから始まりました。
ぜひまふくんの曲を聞いてくれ、めっちゃいいから。

さて、実装を進めましょ
まずはルールのかけらを1とおり作ってボタンに設定するとこまでやろうかな
ということでデータ一覧からボタンを作る→要求されたかけらの種類以外を押せないように修正→それぞれの処理がうまく動くように実装を変更ってとこまで完了。
Qボタンを押したらゲームオーバーにできるようになった！熱い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821450/3325f84a-b69d-b99e-0d8e-f9542468962f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821450/e583bd65-7c35-4ba2-7b80-5555cf6086f6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821450/ec9105e0-99be-f7ad-75bb-62088ba08fdd.png)

この辺で気づいたけどタスクリストまともに動いてないね。忘れそうなことのメモ帳になってる。まあちょうどいいか
思い出したのでダッシュ時の条件も追加済み

次は攻撃処理をルール化したいから敵とプレイヤーのHPバー実装からかな。ルールの言語化は面倒なのでいったん放置します。
今回は後で使うからプレイヤーの更新処理にUniRxを使って実装。

その後は攻撃処理をルールベースで記述して初期ルールを生成するとこまで完成
ついでにルールのかけらの取得状況をObserveEveryValueChangedで監視させて入手のフラグを取得できるようにした。これで獲得のポップアップを出せる
敵の実装もビジュアル以外はOK。ドロップ処理とGeneratorをざっくり実装し切った。

次は攻撃処理のルール記述かなぁ。と思ってたけど、現状の実装で欠陥を発見。HPをバーで表示してたけどこれだと数値わかんないじゃん。10/10表記に変えるかぁ。
直しました。

一旦選択中ルールの記述に行きます。
選択中のIDをうまく消去しながら進行中のIndexを戻すことで実装済み。長くなると文字数があふれそうなんよなぁ、後々修正

そろそろルールを翻訳してわかりやすくするとこやるかぁ。そこが終わればあとは攻撃処理のルール変化でほぼやりたいことが終わりそう。
流れは次に何を選択させるのかを表示できるように記載→確認画面でちゃんと日本語にできるように実装で

次の選択は別で内容をメモったリスト作ってそこを参照させた。
ルールの文章化はルール自体の形式が固まってたからそれを分岐させるだけでよかった。コードは汚いけどね。しらない。

ここまで来たら攻撃処理のルール変更処理を書いていくターンです。分岐面倒だけどやること単純だから何とかなるだろ...
というかコードマジで汚いの課題だなぁ。設計勉強しないといけないんだろうなぁ。

続きは寝てからやります。結局7時くらいまで作業してたわ。結構さぼりながらだけど。

# 3日目進捗
おはようございます、クリスマスの17時起床は最高ですね。
ルール記述をやっていくんだが、まだ眠いのでいったんオプションでマウス感度調整+BGM音量をやるかな。雑にBGMもえらんでこよ
一旦OK。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821450/e0196842-6fd5-a5f8-21c9-5f3b96dc5789.png)
さて攻撃処理行きますかぁ

終わりました
ルールをインターフェイスで管理して分岐できるようにしてたのでながれを記述するだけで何とかなりました。追加効果的なものはまだ実装してないけど、威力とか変更できるようになった

攻撃間隔0秒にしたら完全に崩壊するのおもろい。

というわけで追加効果を除いて一段落。いったんレポートをやります
ついでにテストプレイで意見をもらいにいく時間。


レポート放置してたつけが回ってきています。内容まとめたのにページ数足らない...
テストプレイではうまくルール変更が反映されない場合があったので収穫がありました。人にやってもらうのは大事

# 4日目進捗
テストプレイの返信が返ってきたので対応
- 特殊攻撃の更新ができない
    - ボタンの設定ミスってただけ、置き換えたらなんとかなった
- 発射処理をHP条件にしたら発射されない
    - HPを渡す処理が正しくなかった。面倒なので直に参照させてしまった。構造としては明らかに欠陥な気もするけど
- カメラの配置
    - 「ちょっと離したほうが酔わなさそう」「弾が見ずらい」などの意見があった
    - 一旦離してみた
    - 見づらい問題は検討するけど横にずらすにも量とかエイム調整がねぇ...
- ある範囲に敵がどれだけいるか？の追加
    - 条件文の構成を一部変更して複数の値を参照できるように
    - あとは敵のカウントシステムを組めば何とかなりそう
- 攻撃間隔の検討
    - やっぱ遅いよなぁ
    - 数値ルールに*0.1を追加する方向で動こうかなぁ
    - いや、条件増やすと言語化厄介なので0.xをそのままルールに追加しちゃいます
    - と思ったけどめっちゃ面倒だこれ。HPが整数値で組んじゃったせいで全体に変更が必要になるわ。
    - さすがに厄介すぎるので攻撃間隔は*0.1を常に付与する形にしちゃおう
- ルール形式の表示
    - 間に1Pはさむことで形式を見せるようにしようかな
    - それだとパネルの表示処理挟むだけだから簡単かも


敵の数検出作るときに条件文の解読が面倒な実装になってたので整理。
リストを渡したら条件文のFuncと使用したインデックスを返すことでまとめて計算できるように

さて、あとは追加条件を実装するだけです
と思ったけどMP回復機構作ってないわ。5秒で1回復の機構作っちゃいましょ
さて、以下のものを作りますかねぇ
「追加なし」
「HPを1回復」
「MPを2消費」←これをデフォルトにすることで追加効果なしのルールに価値

実装完了
残りは選択中のルールをわかりやすくする実装をやるかなぁ
β版として完成でもいいくらいの自己評価なのでデバッグして気力があればかな

ルール組んでるときにどこを選んでるかを赤色で表示できるようにしてみた
まあ及第点かな

(敵の範囲条件を複数で設定すると範囲ずれる問題あるけど大分厄介になるから放置します)
いろいろがばがばではあるけど形にはなったので満足

完成でーす