DAKPPOの日記

技術ブログの体を装った日記

clusterワールド『天空ピアノ』制作記

2021/2/7に『天空ピアノ』というワールドをアップロードしました。

cluster.mu

訪問してくださったみなさま、ありがとうございます。訪問者数が3桁にのったのは私にとって初めてで、とても嬉しく誇らしい気持ちになりました。

あとで思い出して懐かしむために、このワールドを作成する上で考えたことや工夫したことをまとめておきたいと思います。

NOTE:

手探りで編み出したノウハウなので、ベストプラクティスではない箇所が多々あると思います。

コンセプト

f:id:aknor141:20210311220758p:plain ピアノをテーマにしつつも、表現したいことは視覚的なものが大半でした。

  • 巨大で荘厳な建築物
  • パーティクルを使った演出
  • Epic_BlueSunsetのSkyboxとそれに合わせた照明

この場合、もし実物大の鍵盤を配置すると、訪問者は滞在中のほとんどの時間鍵盤を凝視することになってしまい、せっかくの視覚表現をあまり見てもらえなくなるかもしれません。そこで、鍵盤自体をデフォルトアバターが乗れるサイズくらいまで大きくし、音を鳴らすときは鍵盤に飛び乗るようにしてみます。さらに、音が鳴ったタイミングでパーティクルを立ち上らせ、空を見上げるよう促してみます。

f:id:aknor141:20210311221022p:plain

配置する楽器は割と適当に決めました。巨大で荘厳なイメージに近かったのでパイプオルガン、放射状に棒が伸びてるとかっこいいかなと思ってバグパイプ、天空感を演出するために羽っぽいハープ。これらの楽器だけだと散らかった感じがしたので、天空っぽさのあるアーチをつけて全体を締めてみました。また、「絶対スピーカーいらんやろ」みたいな楽器とスピーカーが一緒になっているのが好きなので、鍵盤の両脇にデカめのスピーカーを配置。

f:id:aknor141:20210311221046p:plain

せっかく天空にピアノを配置したので、訪問者にはぜひステージ外に落ちてほしいところ。そこで、本来訪問者から見えないはずのステージ下側に雲を配置。落下中に眺めてもそこそこかっこよい風にしてみました。

Unity上での工夫

どちらかというとBlender上で工夫することが多い作品となりました。BlenderのTipsに触れるときりがなさそうなので、Unityに関連する工夫だけ述べることにします。

Fogで距離感を出す

f:id:aknor141:20210311222140p:plain
Fogの有無による比較。バグパイプのあたりの差が分かりやすいかも
建物の大きさをより表現するためにFogを使って空気遠近法を再現しました。Window -> Rendering -> LightingSettingsのSceneタブからFogの項目を選択し、チェックを入れます。ColorはSkyboxの青色をスポイトで抜いて設定してみました。

ParticleSimulation

f:id:aknor141:20210311224002g:plain
光の粒がパッと出たあと一定の速さまでスゥーーーっと減速する様子
ピアノの音を鳴らすと同時にParticleSystemをCreateしています。パーティクルはまだまだ勉強中なので、とりあえずInspectorの様子だけ掲載。何かを理解したあとに戻ってきて加筆するかもしれません。
f:id:aknor141:20210311224111p:plain
ParticleSystemタブ。粒が一斉に消えると変なのでStart Lifetimeを適当に散らす。

f:id:aknor141:20210311224155p:plain
Emission, Shape, Velocity over Lifetimeタブ。パッと出したかったのでBurst使用、鍵盤から出したかったのでShapeはBox、SpeedModifierにカーブを割り当てて速度減衰を表現。

f:id:aknor141:20210311224220p:plain
速度カーブの中身。最初の一瞬だけ速さのばらつきを大きくし、徐々に一定速度に収束させる。

f:id:aknor141:20210311224244p:plain
Renderタブ。とくにいじってなかった気がする。

f:id:aknor141:20210311224854p:plain
不要になったらDestroy

ワールド説明には「その音色は光の粒となって天に届くらしい」とありますが、途中でDestroyしているのでこれは嘘です。

ピアノの音を鳴らす

2021/02/02のハロークラスターで紹介されたピアノの仕組みを応用しています。

note.com

OnCollideItemTriggerでPlayAudioSourceGimmickにシグナルを送ります。ハロクラではCollisionTypeをTriggerに設定していましたが、本ケースではEverythingにしてあります。

アバターの形状によって音がならないケースがありました。もっと安定したやりかたがあるかもしれません。

至らなかったところ

ピアノの鍵を1つのfbxの中に全部入れちゃってたのですが、これは各鍵を独立のモデルとすべきでした。1つのfbx内に全部の鍵が入ってると鍵盤全体をPrefab化することになります。そのため、子オブジェクトの鍵にそれぞれギミックを割り当てる必要が生じ、これがとても手間です。

よりよいやり方として、ピアノの鍵のギミックのみをPrefab化し、その子に各鍵のオブジェクトを配置するという方法があります。この構造を取れれば、かなり時間を節約できたんじゃないかなと反省。

clusterゆるゆる勉強会にて、同様の問題にt_furuさんが言及しています。

www.youtube.com

このclusterゆるゆる勉強会オススメです。見たことない方はアーカイブを是非チェックしてみてください。

使ったアセット

  • AllSkyFree - Epic_BlueSunset
  • CC0Textures.com
    • Marble 012
    • Wood Floor 041
    • Paper 002
    • Metal 003
    • Fabric 036

Appendix

https://mmh.yafjp.org/mmh/about/img/photo-pipe01.jpg

パイプオルガンは横浜みなとみらいホールのものを参考にしました。

f:id:aknor141:20210311230235p:plain
実は見えないところで楽しております、、、、見えないですよね?