Language:
more 

Archive 3月 2014

[Unity] PlayOneShot は音の同時発生に注意すべし

Unity5でサウンド周りが大幅に改善されるようですが、まだしばらく先でしょうし現行のUnity4.xのサウンド周りについて。

同じソースのサウンドが重なる状況の場合、つまり弾の発射音や爆発音といった効果音、いわゆるSEの再生にはAudioSource.PlayOneShotを使うと思います。が、PlayOneShotの特徴である”同じソースの音を重ねられる”という部分に、知っておいてほしい落とし穴があります。

端的に言えばほぼ同時のタイミングで同じ音が複数重なるとひどい雑音になるということです。

簡単に重ねられるのが利点なのに、重ねると雑音に?意味不明ですね。でもそうなんです。3つや4つ程度ならいいのですが、数十同時に鳴る場合ひどいことになります。

詳しい原因と解決法のひとつを提示してくださってるサイトさんがありますので、根本から知りたい方はあとでじっくりそちらを参照してください。

○×つくろーどっとコム:SEの同時発生数問題を考えてみる

とりあえず上記リンクページを開いたちょい下にあるサイン波重ね合わせテストというのを実際触って頂ければわかりますが、サウンド1つのときは「ポーッ」という丸みを帯びた感じの音なのですが、10~30~100と重なるごとに音量が大きくなり、さらに何か耳障りな音に変化してしまっています。

上記ページ冒頭で
>STGでボムを使って画面内にいる100体のザコ敵を「同じフレーム」で爽快に破壊したとしましょう。この時、もしザコ敵に爆発SEを仕込んでいたとすると、同じフレームで同時にその爆発SEが100個分重なって鳴る事になります。これ、どうなるかというと、PCにもよりますが、「ギャギガガガガ!!!」という爆発音とは到底思えないような酷い音が鳴ります。
と実際起こりそうな例を挙げられていますが、私がこの現象に気づいたのはアクションゲームで自分についてくるオプション(グラディウスのあれに近い挙動)が壁に反射する弾を撃つようなオブジェクトを作ったときで、こいつの弾発射位置が壁ポリゴン表面に埋まって弾を発射した際に同時に複数点で反射判定が発生し反射音が一気に複数重なったためです。

自分の作ってるゲームではそんなにSEが重なるところないから、と思っていても、実際本当に絶対起こらないか全ての状況を把握するのは、複雑なゲームになるほど不可能に近いと思います。
しかも重なる数によっては、まあ仕方ないなどと言えないレベルの雑音になりかねないので始末が悪い。没入感を高めるために大音量ヘッドホンでゲームをしてるような人が唐突にこれを食らったら…。ブラクラに近いね。

で、上記サイトさんでは発生した音の数に応じて音量等を丸める処理をした結果も示して下さってますが、今度は複数重なってる割に何か物足りない感じがしてしまったり。この辺は私的な無い物ねだりかもしれませんが。

というわけで、私はUnity5でサウンド周りの仕様変更でこれが改善されるのを期待していますが、現在すでにゲーム作成が進んでいてUnity4.xでPlayOneShotを使わざるを得ない方は、少なくともできるだけ雑音テロを引き起こさないよう配慮したほうがよいかと思います。

[Unity] Export PackageにTag,Layer,Input設定などを含める

Unityで普通にメニューからExport Packageすると、自分で作ったTagやLayer、他にもInputの設定なんかはExportに含まれません。そのためデータ保存用としてPackagingしたり他の人に渡す用途の場合、ただExportしてもそのままではImportした側では使えない場合がほとんどだと思います。

で、まずこのExportに含まれない関連はどこに保存されているのかというと、各プロジェクトのフォルダにある”ProjectSettings”フォルダ内です。(ここにUnityメニューのProjectSettingsで設定したものが全て入っている)じゃあExportしたPackageとそのフォルダを一緒にまとめてZipで固めておけば使う側も安心だね!え、なんかそれならもういっそpackageとか作らずプロジェクト丸ごとZipで固めたらよくない?

でもアセットストアを見てるとPackage内にProjectSettingsフォルダが含まれていて、そのアセットをImportすれば勝手にProjectSettingsも上書きしてくれるアセットが確かに存在してます。えーどうやったの?メニューにそんな項目ないよ?

それもそのはずメニューから行うような親切設計にはなっていないのです。私の説明の前に自分で公式のリファレンスを見たほうが手っ取り早いという方用にまずリンクを貼っときます。
ExportPackageOptions.IncludeLibraryAssets
ExportPackageOptions

やり方の詳細。まず何でもいいので自分のわかりやすい名前をつけたC#スクリプトを新規作成してProjectタブでEditorフォルダ内に置きます。アンド以下をコピペ。

[MenuItem (“Assets/ExportWithSettings”)]
この部分でUnityメニューのAssetsにExportWithSettingsという項目を作成してます。 メニューの他の場所がいい場合は適宜書き換え。

AssetDatabase.ExportPackage(“Assets/”,…
ここの”Assets/”の部分で書き出す内容を指定。ひとつのプロジェクト丸ごとでなくProjectタブ内の特定のフォルダだけでいい場合は”Assets/hogeFolder”とかそこを指定すればよい。

“test.unitypackage”
Exportされるファイルの名前。まあお好きに。

必要最低限だとこんなもんでしょう。頻繁に使う方は名前とか付け易くしたりとか手を加えたほうがよさげ。メニューから選ぶとExportされたファイルがプロジェクトのフォルダ直下にできています。

ただひとつ気をつけるべきは、良くも悪くも「Import時にProjectSettingsフォルダ内を上書きする」という事。 Import側がzip解凍してファイル放り込むみたいな手間はなくなるけど、知らないでImportすると自分で作っていたTagやらLayerやらInputやらが全部上書きされて消滅します。 特定の設定ファイルだけピンポイントでExportに含ませる、というのも(おそらく)できないので、Physics設定やらPlayer設定やら何やらも全部上書きされます。 Importする時にチェック式で項目を選べるけど、Import側がどれが必要か把握してる場合ばかりではないだろうし。 Export側にできるのはReadMe付けるくらい。 まあそれもとりあえずImportしてからReadMe読もうってなったら意味ないけど。

というわけで一見便利そうだけどあまり使い勝手がよろしくないので使ってません。調べるのにそれなり時間使ったのにね。ていうかもうちょっと洗練してメニューからのExportでUnity自体が普通に機能として付けたほうがいいんじゃなかろうか。
TagやLayerの設定はImport以前にプロジェクト内ですでに設定済みのものを残したまま付け加える形にできたほうが断然使い勝手がいいと思うんだけど、この辺の利便性はUnity本社側はあまり気にしてなさそう。数年前に同じことで困ってる記事とか普通にヒットするし。

あと、アセットストアにProjectSettingsフォルダ含みのImportファイルを提出するのはまったく別の手順です。アセットストアにはAsset Store Toolsを使って提出するわけですが、Category選択を Complete Projects系のカテゴリにするだけで勝手にProjectSettings関連も含まれます。ただこれはあるジャンルのゲームシステム丸々をデモとして提出するとかのカテゴリだからこそ、設定関連も同梱されるということです。普通の規模のアセットを提出する場合に、ProjectSettingsを含ませたいからというだけでこのカテゴリを選ぶのはおそらくダメ。仕方ないので必要最小限のProjectSettings内のファイルをZipで固めてアセットの提出内容に入れておくのが単純な方法のようです。

新規投稿テスト

テスト

ブログの規約改正に伴い新たに作り直しました

製作物について、あるいはそのノウハウとかを書いていきます