春休みの1週間で気楽に作ったミニゲームです。アーバインで珍しく長めの雨季が続いたことで思いつきました。以前読んだSCP-548-JPの影響もあったりします。
主にUnityの2D Lightsを試してみたくて作りました。またしてもタイトルが4文字なのは偶然です。
本格的なサウンドプログラミングに取り組むのは、意外にもこれが初めてでした。音量設定を追加したり、新しいシーンをロードする際にBGMをフェードしたり。
ただのミニゲームなのに、たったこれだけで数十倍は見栄え(?)が良くなった気がします。何より実装してて楽しかったです。
雨粒で音楽を演奏したいなと思ったので、ScriptableObjectを用いてSong型を定義してみました。ノートを順番に入力することで歌を作れたりします。
ちなみに半音の実装は見送りました。ノートをenum型で定義しているのと、とある曲を演奏したくて2オクターブ分の音に対応したかったため、半音まで入れてしまうとドロップダウンリストがえげつない長さになったからです。
ノートを数値で表せるピッチに変換することで、AudioSourceコンポーネントのpitch値に代入できるようにしました。
Profilerを見ていると、どうもURPがパフォーマンスを低下させているように見えたので、レンダリング以外の箇所で何かしらを最適化できないかとウンウン唸っていました。Instantiate関数を実行する際にCPU Usageが跳ね上がっていたので、そこをどうにかしようと思い至りました。
もともと、雨粒の種類ごとにプレハブを作成して、配列から選んでインスタンスを生成していました。オブジェクトプールを作る場合、毎回新しいインスタンスを生成するわけにはいきません。
そこでScriptableObjectで雨粒の型を定義して、種類ごとにScriptableObjectを作成しました。オブジェクトプールから新しく雨粒をスポーンする際、ランダムで雨粒の型を選んでからオブジェクトに渡しています。
振り返ってみると、こんな小さなミニゲームにオブジェクトプールはやり過ぎでした…。
多分このゲームには必要ありませんでしたね。でも綺麗。
このゲームの場合、背景のスプライトに光を直接描きこんでも問題なかったと思います。とはいえ、動作は想像以上に軽かったです。
それと、てっきりURPがパフォーマンスを低下させているのかと思いましたが、Editor内だけでの問題で、ビルド上では全く問題ありませんでした。そもそもProfilerでCPU Usageを見た際、Editorの占める割合が大きかっただけでした。