第56回 長野高専工嶺祭 SJ合同企画「OVER ～そして物語は加速する～」出展企画「BLinDISM」開発後記

# はじめに
こちらは[長野高専 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/nnct) の21日目(10本目)の記事となります。
生まれて初めて記事を書くので何もわかりません。玄人の皆さんお手柔らかにお願いします。
この記事は文字主体となっており、感想メインで**非常に**長いです。予めご了承ください。また、ブログ的文章となっておりますので、感想が嫌いな方はブラウザバックをお願いします。

この記事では10/15(Fri)～10/17(Sun)にあった第56回工嶺祭で、S科とJ科合同で行った企画の[「OVER ～そして物語は加速する～」](https://over.nnct18j.com/)にJ科企画として出展したゲーム[「BLinDISM」](https://over.nnct18j.com/game/blindism)について述べます。
表向きの仰々しいお話は[BLinDISMのレポジトリ](https://github.com/K-White0529/BLinDISM)のREADMEに書きましたので、こちらでは制作に至った経緯から、出展が終わるまでの裏話等を書いていけたらと思います。
![BLinDISM_header.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764338/04d9055b-789a-b6de-43a2-5aab85dde431.png "見れるといいね")

# お前誰だよ
HN：K_White
所属：長野高専電子情報工学科4年
やってること：Javaアプリケーションの開発(卒研)
　　　　　　　Unityでの3Dゲーム開発(まさにこれ)
　　　　　　　太鼓の達人(関係ないよね！？！？)
好きな言語：**C**, C#, **Java**

# BLinDISM制作前のお話
本章では、私がゲームを作る前のことについて説明する。

## 3年次(2020年)
NNCT18Jでゲームセンターを作ろうという案が出たのは**3年次の**工嶺祭企画案でした。
当時はJ科のみの展示で、展示作品も3作品ほど出る予定でした。主に[Bony_Chops](https://qiita.com/BonyChops)が主導してプロジェクトを進め、設計班は筐体デザイン及び寸法の設計、開発班はゲームコンセプトの会議を行っていました。当時のBonyは(4年次も勿論)工嶺祭のプロジェクトにめちゃくそ熱を注いでおり、周りもそれについていくようにプロジェクトを進めていました。

**しかし**、世間に重大な影響を与えたCOVID-19により、工嶺祭はリモートでの開催となりました。対面で実際に筐体に触れながら遊んでほしいという考えだった我々は、完全にメンタルブレイクしてしまいました。当初は延期による対応で開催できるかも...？という望みもありましたが、こちらのプロジェクトは2021年度へ持ち越しとなりました。

## 4年次(2021年)
ゲームセンター企画が延期になってから半年後の4J 4月に、工嶺祭企画を話し合う機会がありました。前年度持ち越したゲームセンターを復活させよう！ということでプロジェクト再始動です。

ここで、昨年度の3S(NNCT18S)の企画について少しお話します。
NNCT18Sが3年次に展示しようと進めていた企画は「レーザーモジュールを用いたリズムゲーム」です。彼らも18J同様、対面での展示をモチベーションにプロジェクトを進めていましたが、リモート開催となってしまい、来場者に実際に体験してもらうことはできませんでした。

このプロジェクトを復活させ、ゲームを完成させることを目標としていた4Sと、同じくプロジェクトを復活させてゲームセンターを作ろうとしていた4Jの目的が一致しました。
企画係と統括係、開発部が話し合い、**合同企画の実現**に向けて動いていきました。企画係を筆頭に、(恐らく)前例のない、合同企画について工嶺祭実行委員会に交渉しました。少し難儀でしたが、企画係の大きな尽力により企画を進められることとなりました。企画係、本当にありがとう...

# BLinDISM
本章では、経緯、開発中のこと、当日について説明する。
## 制作に至った経緯
なぜUnity 3Dを用いたゲームを作ろうと思ったか なのですが、前述した4Sの作成していたリズムゲームの動作を目の当たりにしたことが、大きな理由です。
ゲーム制作者を含む友人数名と、寮の談話室で**前期期末試験**の**テスト勉強**をしていた時だったと思います。(うろ覚えです...) 4Sの友人が例の音ゲーをいじっており、ゲーム画面を見たときにその完成度とアイデア性に圧倒されました。開発プラットフォームを聞くとUnityと答えたことから、「俺もUnityでゲームが作りたい！！！！」と心が決まりました。

当時自分の周りでは(音ゲーに関わってかな？)Unity学習が流行っていて、それもあってUnityの勉強を始めました。夏休み前にクラスメイトからUnityの参考書を借用し、長い[^1]夏休み期間で学習を進めようと意気込みました。
[^1]: 約1.5ヵ月、長い！
テスト終了と夏季休業の間が3日ほどあり、その時間を使ってゲームコンセプトを練り上げました。世界観はこうで、キャラクターはこんな感じで、ステージはこんなふうにして、画面はこうレイアウトして...と、実装前に完成形を想像して書き出してみました。この紙が今後の開発の進捗に大きく影響しました。
![blindism_note.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764338/5a46bdba-29ce-4e9f-cf3f-a4b2f539cdb0.jpeg "BLinDISM原案")
原案を見てみると、没案もいくつかありますね。これらは**技術的には不可能です**なことや、作っていくうちにいらないと判断したものになります。裏設定とか考えてる部分もありましたが、実際にはあんまり深くやってません。(中二病的設定が多いので見るならサラッとお願いします...)

## 開発中のこと
非常に長い[^1]夏休みを利用して、ゆっくりと勉強および開発を進めようと考えていた私ですが、**大事なこと**をいくつか忘れていました。

- インターンシップ[^intern]
- プレ卒研[^presotsu]
- I先生の授業の課題[^ITO]

[^intern]: 2週間(平日10日間)行います
[^presotsu]: A先生の研究室に配属されているのですが、夏休みでプロジェクトへの理解を深めておいてね、と言われていました
[^ITO]: 掲示板を作るやつです。基本はシンプル故凝らないといけないものでした。きつかった...

完全に忘れていました...1.5ヵ月でこれらをしなければならないと気づき、絶望しかけました。
ノープランで物事を進めていては全部が空中分解してしまうと考えた私は、タスクそれぞれのスケジュールを組むことにしました。流れとしては、

- BLinDISM開発(8/8～8/22) 約2週間
- インターン(8/23～9/3) 2週間
- プレ卒研(9/4～9/12のうち暇なとき) 約1週間
- I先生の課題(9/4～9/12) 約1週間

みたいに進める予定**でした**。私のサボり癖が出てしまい、前半の開発期間のうち7日間ほどは某バトロワゲーム[^APEX]に費やし、後半はI先生の課題4割、某バトロワゲーム5割、プレ卒1割と、散々なスケジュールで夏休みを過ごしました。
[^APEX]: 某 X∃d∀です。開発に使用していたハイエンドPCはこいつも動かしていました
そうはいっても夏休み前に原案を作っていたので、開発自体はスムーズに進みました。UnityおよびC#の知識が全くなかったので、専門書をはじめから読み、チュートリアルプロジェクト[^ikinokobattle]を完成させることをひとまず目標としました。こちらのプロジェクトを理解しながら完成させるのに1週間と少しかかりました。予定開発期間の半分以上を使ってしまいましたが、何が必要でどんなことをすればいいのか、理解したうえで実際に開発を進められました。

BLinDISMにおいて、一番重要視したのが世界観です。裏設定も作るほど凝っていたので、ここはこだわりました。

世界観に関して、操作キャラクターは第一に上がると思います。私もそうだったことから、まずは操作キャラクターの3Dモデリングからスタートしました。

### プレイヤーモデリング
モデリングはVRoid Studioを用いて行いました。無論3Dモデリングも初めてだったので、逐一調べつつやりました。モデリングが案外面白く、のめりこんでやった結果、モデリングで1日溶かしました。初心者にしてはいい方なんじゃないかな？
モデリングに関しては[こちら](https://miyagame.net/vroid-unity-unity/)と[こちら](https://qiita.com/UpAllNight/items/317708069d1ed3ff0486)のサイトを参考にしました。本当に助かりました。

### TPSコントローラ
モデリングが終わったらプレイヤーを動かすために3人称視点コントローラの実装に入りました。
チュートリアルプロジェクト[^ikinokobattle]を参考に3人称視点コントローラを作成してみましたが、どうも自分の思うような動きができませんでした。求めていたものはこんな感じです。

- 視点操作→マウス
- カメラ→プレイヤーを取り囲むようなやつ
- 移動→WASD Space

視点移動にとことん苦しみ、最適な手法を模索した結果、ここまで候補が絞られました。

- 視点操作&移動→`Third Parson Controller`[^TPS]
- カメラ→`Cinemachine FreeLook Camera`

視点と移動はUniy Assetsの`Third Parson Controller`を使うことにしました。
カメラについては[こちらのサイト](https://nekojara.city/unity-3rd-person-camera)がとても参考になりました。本当にありがとうございました。
個人的には、この二つの組み合わせが最強だと思います。簡単にTPSコントローラが実装できて、動作も一般に使われているようなものとほぼ変わりません。Unity 3DにてTPSを実装する際は是非ともお勧めします。

[^TPS]: [Third Parson Controller　-　Unity Assets Store](
 https://assetstore.unity.com/packages/tools/game-toolkits/third-person-controller-basic-locomotion-free-82048?locale=ja-JP)

### ステージ作成
プレイヤーが動かせるようになったところで、ステージづくりに取り組みました。当初のステージ構成案はこんな感じでした。

1. プレイヤーの大きさに対してほぼ無限の大きさを持つ地表
- 厚さを持たない壁
- 2によるスタートとゴール
- 即死オブジェクト

1については完成版についても同様の仕様になっていますが、ゴール時の見栄えを考えてゴール地点以外の外床はなくなっています。
2と3についてですが、厚さを持たない(単純な板)壁を用いて実装すると、TPS視点の制御の際にカメラが壁の外へ行ってしまうというバグがありました。キャラクターにアタッチしている`CinemachineFreeLook`カメラで、`Collider`によるカメラ衝突制御を行っているため、厚さを持たない = `Collider` を持たない壁では**カメラが貫通してしまう**のです。

カメラ処理を考えた結果、最終的なステージ構成はこのようになりました

1. 厚さを持たない板による地表(ステージ内のみ)
- ProBuilderで作成したブロックによる、`Collider`を持つ壁
- 2によるスタートとゴール
- 即死オブジェクト

[^ikinokobattle]: 「作って学べる Unity本格入門」サンプルプロジェクト[「IkinokoBattle」](https://github.com/akako/honkaku_unity)、大変お世話になりました

プレイして下さった方の中には「この地形ProBuilderじゃん」と気づいた方もいるかもしれません。センスがあればテクスチャを描いて貼ったのですが、ProBuilderの標準テクスチャより良い見た目が思い浮かびませんでした。
Probuilderでのステージ作成は[こちら](https://creator.cluster.mu/2020/05/04/howtocreate-probuilder-world/)を参考にしました。大変お世話になりました。

ここまで来てようやく、ゲームを作る環境が整いました。

### ステージ構成と世界観のアイデア
ステージのアイデアも例のごとく紙に書いてイメージしていきました。

早速余談なのですが、皆さんは「[Quest Rooms](https://store.steampowered.com/app/1234550/Quest_Rooms/?l=japanese)」というゲームを御存じでしょうか。様々な死亡ギミックをかいくぐってゴールを目指す、いわば死にゲーです。本作はこちらのゲームに非常に影響を受けています。
そもそもアクションゲームを作ろうと考えて、死にゲーにしようとした理由はここから来ています。Quest Roomsは当たったら即死、ではありませんが、単純かつ難しいゲームにするなら即死だろうと考えた結果、どのオブジェクトも即死にすることになりました。
細かいステージ内容はぜひゲームをプレイして確かめてみてください。
ちなみにざっくりとしたStageごとのコンセプトはこんな感じです。

|Stage|コンセプト|
|:--:|:--|
|Stage 1|xz方向移動と軽いジャンプを使う基本操作に慣れよう|
|Stage 2|y方向移動への応用とステップアップ|
|Stage 3|このゲームのまとめ|

世界観についてですが、こちらも影響を受けたゲームがあります。「[殺戮の天使](https://www.gamemaga.jp/satsuriku/download.html)[^satsuten]」です。 ー閉鎖空間に一人居る少女がゴールを目指して進み続けるー 設定からプレイヤーの見た目にかけて、ほとんどそのまんまですね。でもそれくらい殺戮の天使を愛していて、たとえ3Dアクションゲームだとしても、世界観としては絶対に盛り込みたいと考えていました。真田まこと先生、本当にありがとうございます。

[^satsuten]: 中学生の時にリリースされて、衝撃を受けました。ゲームでガチ泣きしたのはこれが初めてです。

ゲームシステムはQuest Rooms、キャラクターやオブジェクトは、私の大好きな無機質感とゴシックとを融合させたもの、ゲームシステムは展示を見据えたタイムアタック方式...と、[制作に至った経緯](#制作に至った経緯)で考えていた内容から発展させて、色んなものに影響されながら、前述した技術を用いて実際のステージを作成しました。ステージ作成は、1ステージを3partに分け、それぞれでギミックを構成する形で行いました。

とことん難しいものにしたかったので、Stage 1で初見のプレイヤーを振り落とす難易度にしたのですが、テストプレイを重ねた私が**ようやくクリアできた**その難易度を、そのままStage 1としてしまいました。Stage 2、Stage 3も同様の実装です。
テストプレイの段階での通しベストタイムが5分を切るように、ゲームバランス(俺指標)を調整して、ステージの完成としました。

### 完成直前 - 10/13～10/15
ゲーム制作も大詰め、全体的なプレイ感覚の改良に入りました。

#### 壁にひっかかる
ジャンプして移動キーをホールドしたまま壁に当たると、ジャンプモーションのまま壁に張り付いてしまうバグがありました。これには物体表面に当てられている`Collider`(にアタッチされた`Material`)の`Friction`が関係しています。
`Friction`とはそのまま「摩擦」を意味し、この値によって物体同士の摩擦が決定されます。今回の場合は床にのみ摩擦があればよいので、壁にアタッチしている`Collider`に`Friction`を0にした`Material`を当ててやります。今回の制作では念のためプレイヤーの`Friction`も0にして実装しました。

#### オブジェクト軌道の描画
開発過程で、何人かのクラスメイトがテストプレイをしてくださりました(ありがとうございました…！)。その中で「死亡オブジェクトの軌道がわからない」という意見が上がってきました。移動するオブジェクトの行き先は確かにわかりづらく、自身も何度もミスしていたため、地面にオブジェクトと同色の`plane`を乗せて軌道をわかりやすくしました。

#### Aim速度変更
こちらもテストプレイから上がってきた意見で、マウス感度を調節できたほうが自分好みの操作感になる、というものでした。自分の環境に合わせたAimスピードでデバッグしていたため、これには気づきませんでした。まさしくテストプレイの恩恵です。
今回は`Esc`で開くメニューに`Axis X`、`Axis Y`調節バーを置き、それぞれの感度を独立して設定できるようにしました。

#### 効果音・環境音
参考書[^ikinokobattle]の中に、「効果音、BGMは最終盤につけるべき。音が付くとゲームのクオリティが上がり、完成した気になってしまう」といった趣旨の内容がありました。それに従い、各種SEと環境音は最後につけることにしました。[効果音工房様](https://umipla.com/)、[TAM Music Factory様](https://www.tam-music.com/)、[On-Jin ～音人～様](https://on-jin.com/)、[魔王魂様](https://maou.audio/)、本当にありがとうございました。

---
公開前日(10/15)の夜の開発部屋は地獄みたいな雰囲気でした。(25時に私が自室へ帰った後のほうがもっと地獄だったそうですが...)

## 当日
限界感をそのままに、朝早くからS科棟実験室に出向き、統括・開発陣を中心に準備を始めました。「ゲームセンター」の雰囲気を作るため、なるべく暗く、うるさく、ワクワクする雰囲気を目指しました。BLinDISMのほうは展示開始から公開させていただき、[LASERHYTHM](https://over.nnct18j.com/game/laserhythm)のほうは操作改良後、昼頃から公開しました。
始まってしまえばあとは人が来るのを待つのみで、たくさんの方が会場に出向いてくれました。来場して下さったのべ200人の方々、ありがとうございました。

プレイして下さった方の感想としては、「ムズすぎ」「萎える」「意味わからん」が大半でした。それを狙って作ったので至極真当なのですが、ちくちく言葉は疲れた心に刺さりましたね…しかしそれも序盤のみで、後半からはそんな声を聞くたびに嬉しくなってきました(壊れたのかな？)。中には「絶対クリアしたい！」とローカルに落とす決意まで見せてくれた方までいました。こういう時に「作ってよかったなぁ」って思うんですね。

# 終わってみての感想
工嶺祭が終わった直後の感想としては、「よかった…」がまず第一でした。合同企画という初めての試み、自作ゲームの展示、運営…と、なにもかもが不安なままスタートした企画でしたが、統括の皆様と開発陣、協力して下さった仲間達のお陰で、大成功といえる結果が残せました。
作っている期間が大半なので当たり前ですが、ゲーム開発中の「どうしようかな」とあれこれ考えている時間が、一番苦しかったし楽しかったです。頭の中で考えていることを実現させるのは楽しいですね、開発最高！

# まとめ
今回、初めてゲーム制作を行いましたが、プロジェクトを通して、ゲーム作りの難しさとプランニングの大切さを学びました。Unity(C#)を用いたゲーム作りについては、企業で生かしたいスキルの一つでもあるので、積極的に伸ばしていきたいです。予定管理については、めちゃくちゃ下手でした。次回のプロジェクトでは、しっかりと展望と余裕をもってやりたいです。

重ねてですが、今回作成したゲーム、「BLinDISM」は[ここから](https://github.com/K-White0529/BLinDISM/releases/tag/v1.0.1)ダウンロードできます。ぜひ遊んでみてください。プレイの感想や意見等は、Twitter「[#ProjectBLinD](https://twitter.com/hashtag/ProjectBLinD)」へお願いします。

非常に長くなりましたが、以上です。最後までご覧いただきありがとうございました。