Redhuのゲーム開発Fragments

UnityやUEでゲームを作る際に学んだことを、これからなにか作りたい人に向けて。あるいは復習する自分に向けて記す。

自作ゲームリメイク中-エフェクト、サウンド編-(Unity制作)

前回>自作ゲームリメイク中-当たり判定・弾丸編-(Unity制作) - Redhuのゲーム開発Fragments


今回はエフェクトとサウンドについて書きたいと思います。
新たにブースター使用時、ブースター炎のエフェクトを発生させるようにしました。オーバーブースト時には追加でOB炎も同じく発生させています。

f:id:redhu:20150817115045p:plain

それらの処理を行うスクリプトを、ブースターボーンの箇所に、オーディオソースと一緒にセットしています。
通常ブーストで発生させる炎エフェクト、OBエフェクト、ブーストをふかしている時のSE、ブーストが起動するときのSE、OBが起動するときのSEですね。

エフェクト処理

Player Booster CtrlスクリプトはFPSInputControllerとPlayerMoveStatsを見て・・・つまり入力と機体の状況を見張っています。
移動してる時に、機体のブーストがONになっていて、このスクリプトでブースト状態判定がONになっていない(つまりブーストが起動した時)にブーストエフェクトを、同じようにOBエフェクトをInstantiateして即親子付けしてくっつけています。

さて、これでブーストを起動した時にエフェクトが生まれるようになりました。
しかしパーティクルの発生をLoopにしているので、ブースト使用を止めてもエフェクトは勝手に消えてくれません。またブーストを起動したら前は消えることなく新しいエフェクトが生まれてしまいます。

そこで、パーティクルオブジェクトひとつひとつにParticleDestroyスクリプトをセットして、エフェクトを消したいときに
BroadcastMessage("BoostParticleStop", SendMessageOptions.DontRequireReceiver);
などでParticleDestroy内のBoostParticleStop関数を起動し、MyParticleSystem.Stop();を使ってパーティクルの生成を止めます。
ブロードキャストメッセージは自身とその子への通知なので、さっきエフェクトオブジェクトを生成した後親子付けしたのが効きます。

アップデート関数で
if(!MyParticleSystem.IsAlive()){
Destroy(gameObject);
}
を使い、パーティクルが無くなったらそのオブジェクトを消すようにしているので、仕事の終わったパーティクルオブジェクトは次々消えていきます。

自分はこれに加えて、パーティクルオブジェクトを子に持つ親オブジェクトを用意しているので親オブジェクトに
if (this.transform.childCount <= 0) {
Destroy (gameObject);
}
をするスクリプトを設定して、子が居なくなったら消えるように仕込んでいます。
パーティクルオブジェクトはデフォで90度回転していたりするので、0,0,0の空オブジェクトに入れていると何かと楽なのです(プレハブ化した後子がひとつしか見えなくなるのが不便だけど)

サウンド

サウンドでは特にややこしいことしていません。
ただし、Unity5から(?)前まではAudioClipが2Dサウンドか3Dサウンドかの情報を持っていたのに対して、AudioSourceが2D/3Dの情報を持つようになりました。しかも2Dか3Dかの二択じゃなくて、スライダーで調節して「3D的に減衰するけどどこにいても最低限は聞こえる」とかみたいな半2Dサウンドみたいなものもできます。
このせいで旧作をUnity5に持ってきた時、ひとつのAudioSourceから機体の音とシステム音と出してたのが、システム音が不自然に3D的に聞こえたり・・・



そうそう、新たな仕組みとして AudioMixerというものがありました。
f:id:redhu:20150817121600p:plain

AudioSourceの音量設定グループ分けみたいなものができます。「このオーディオソースはSEグループの音量調整率を受ける」とか

f:id:redhu:20150817121819p:plain

ちゃんと分けておくと、後々オプション設定つくった時にマスターボリュームやBGMやSE、ボイスの個別音量調整とか楽にできそうな感じがあるのでしっかり設定しとこうと思います。

うに部屋さんに置かせて頂いているリメイク対象の旧作

unityroom.com