質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

353閲覧

Unity キーを押してから音の発生まで遅いように感じる

venus_say

総合スコア14

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2023/02/24 07:36

編集2023/02/24 07:39

音ゲーを作ろうとしています。
「キーを押したら音を鳴らす」という基本部分を作っているのですが、
キーを押しても即座に音が鳴っていないような感覚があります。
体感で5/60秒くらい遅れて鳴っている感じです。
今までは音ゲーのようなゲームを作っていなかったので、気にならなかっただけで、ずっとこんな感じだったと思います。
同じパソコンとキーボードで、試しに世に出回っている音ゲーをプレイしてみたのですが、上記のような遅れて音がなる感覚はありませんでした。なので、ハード的なものやwindowsの問題ではないようです。
原因は何でしょうか?

一応該当のコードを貼っておきますが、ごくごく基本的な記述だと思います。

public AudioClip sound1; AudioSource audioSource; void Start() { audioSource = GetComponent<AudioSource>(); } void Update() { if (Input.GetKeyDown(KeyCode.G)) { audioSource.PlayOneShot(sound1); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RyojiAraki

2023/02/24 09:34

まだ調べてないからわかりませんが、GetKeyDownに問題があるかもしれません 他のGetKeyメソッド試してみてください!
YAmaGNZ

2023/02/24 10:42

Load TypeとかAudioClipの設定はどのように設定されていますか? またファイル形式はどのようなものを使用されているのでしょうか? https://docs.unity3d.com/ja/2020.3/Manual/class-AudioClip.html こちらを読んだ感じですと、使用するファイルフォーマットや設定によってはオーバーヘッドがありそうです。
UnitySoldier

2023/02/24 12:37

AudioSourceのDSP Buffer SizeをBest Latencyに設定するあたりの設定も手としてはありますね あとはCRIとかの専用のサウンドミドルウェアの導入ですかね あそこは滅茶苦茶レイテンシーにこだわってたと思います
venus_say

2023/02/25 04:03

>TrueRyoBさん ありがとうございます。 入力なのでupdateのほうがいいとは思ったのですが、試しにfixupdateにしてfixの設定時間もすごく短くしてみたのですが変わらず。他の入力方法も試しましたが変わりませんでした。 >YAmaGNZさん サウンドファイルそのものの設定をいじるという発想がありませんでした。 Load Typeは、デフォルトの「Decompress On Load」になっていて、調べたところ、これが一番早そうです。 あとはAudioClip設定でLoad In Background のチェックを入れてみたりしました。 もう少しこの辺の設定をいじってみます。 音のファイル形式はmp3です。形式が速さに影響するとはあまり考えてなかったのですが試しにwavを使ってみたらかすかに早くなった感じがします。色々要検証です。 ありがとうございます。 >UnitySoldierさん >AudioSourceのDSP Buffer SizeをBest Latencyに設定 そっちにも設定があるのですね。早速変えてみました。 いくつかいじって、すこし改善した感はあるものの、音ゲーとして動かせるレベルには程遠い状態です。 CRIというのはロゴをよく見かけるアレですね。そういうのの導入も検討してみます。 ありがとうございます。
guest

回答1

0

ベストアンサー

前書き

中途半端にコメントしてしまったのもなんか後味が悪いので全体像を描きたいと思います。
直接的な解決手法ではなく考え方の共有です。
結論は何かしらのサウンドミドルウェアを使った方がいいというのは変わりません
ちょっと前にAndroidでカラオケシステムを作ろうとして絶妙にAuidioレイテンシ周りで苦労したのでUnityにおけるレイテンシの考え方について書きます。
オーディオプログラミングの専門家じゃないので何かしらの間違いはあるかもしれません。

Unityのオーディオ周りについて

まず大前提にUnityのAudio周りはあんまりレイテンシに対して親切なものではないということです。
バッファサイズの調整などで多少乗り切れますが、クロスプラットフォームエンジンという特性上各プラットフォームごとの最適化はどういても足りないように思えます。

なぜレイテンシに対して親切なもではないかというと多くの場合レイテンシはハードウェアやOSやデバドラレイヤーで発生することが多く、Unityの各プラットフォームビルドでサポートしているAudio I/Oが最適なものとは限らない為です。
またUnityのAudioはメインスレッドで動くためパフォーマンスの悪いアプリと一緒だと遅延することがあるそうです
実際私が過去に作ったやつは高負荷かけると遅延が大きくなりました。

大体のOSのAudioAPIは一つとは限らず
Androidであれば比較的新鋭のAAudio,Android2.x時代の遺物 OpenSL ESなどがあります
Winodwsの場合はもっと歴史があるので事情は入り組んでます
一方Unityの話ですが需要面で行くとAndroidのサウンドレイテンシは酷いことで有名で情報源はAndroid関連が一番多い気がします。
コメントで紹介させていただいたCRI ADXはAndroidの為だけの専用低レイテンシモードを作ってまで対応したりしています。

Winodwsの遅延周りについて

ここで疑問になるのは

ハード的なものやwindowsの問題ではないようです

他のアプリでは問題ないのになぜUnityでは・・?ということです。
私もWinodwsのAudio事情に興味があって調べたのですが

https://assetstore.unity.com/packages/audio/sound-fx/low-latency-multichannel-audio-147091?locale=ja-JP
Win向けの低遅延Audioアセットの説明にはこうありました (これ買ってもいいですネ)

Windows Multimedia Extensions (MME) に基づいているため、大きな遅延(約150〜200ms)が発生します。

MMEはWinodws3.0時代にリリースされた古いAPIでこれがUnityで使用されているのは正直驚きです。
正直真偽が疑わしいので公式ドキュメントとかフォーラム情報で裏取りしたかったのですが残念ながら見つかりませんでした。
Unityの内部実装について詳しい人居たら補足ください。

該当のアセットですがASIOといわれる方式をとっています、
ASIOというのはOSのAPIではなくAudioドライバの規格です。
対応しているドライバを使っているオーディオインターフェースがないと動かないと思いますが、非常に低遅延なオーディオ出力を実現できます。

他にもWinodwsのAudioAPIはあり

・ direct sound
昔のゲームで使われてたらしい、今時はあんまり・・・
・WASAPI
多分一番普及していると思われる、排他モード、共有モードがあり共有モードはカーネルミキサーを経由するため少し遅延が大きくなるそうです。
愛称はわさび

・Audio Graph
Windows10になってから実装された新APIらしいです。
公式ドキュメントでも紹介されています
低待機時間オーディオ

といろいろあるようでおそらく各種オーディオミドルウェアはこれらのAPIをネイティブプラグイン経由でラップして提供しているのでしょう。
ここまで書けば察せられると思うのですがオーディオレイテンシ周りはUnity+OS APIレイヤー+ハードウェアの組み合わせが露出しやすい分野です。
なので主に情報源がUnity関連だけではなくオーディオプログラミング分野やOSベンダーの公式ドキュメント、各APIのラッパーライブラリ関連などの知見をマルチレイヤーに収集するとよいでしょう。
これらをまじめに自作すると普通にちょっとしたゲーム一個分ぐらいの工数が消し飛びそうなのでサウンドミドルウェアやライブラリを検討しましょう。

各種Unityのオーディオミドルウェア、ライブラリについて

  • CRI ADX2 LE

超有名、同人ゲーぐらいなら確か無料なので王道、たぶんWAS APIだと思います
ちなみにコメントで紹介されてたSonicSYNCはAndroid、iOS専用なので動かないです

UnityJPの人がWAS API対応ライブラリ libsoundioをUnity用にラップしたやつ

さっき紹介した低レイテンシ Unity Soundアセットです
ASIOなのでユーザー要件を絞る必要はあるかもだけど理屈上一番早いかも

WasAPIが使えそうな雰囲気のあるOSS、だれか触ってみてほしい

多分他にもあると思いますがWinodws中心だとパッとこんな感じですかね?
好きなのを用途に応じて使えばよいと思います

オーディオレイテンシの測定について

ちゃんと改善をする場合、遅延がある以上測定して比較する必要があります。
一番定番なのはループバックです、音の入出力をループさせて時間を測定します。
実例
いよいよ物理機材の話になってきましたが音の遅延は物理的に観測されるので物理機材の話はよく出てきます
がっつり測定しないにせよ
また精度を担保するために実行はUnityEditorではなくリリースビルドを動かすのがよいでしょう。
まあ純粋なレイテンシを測定するコードを実装することでUIそのものレイテンシと切り分けることができるボトルネック箇所の特定が可能です。

最後に

個人的興味で長々書いてしまいましたがこれは普通にUnityの弱点なので早くどうにかなってほしいですね

参考文献

ASIOとWASAPI排他モードって何が違うの?
楽しいハック講座 (4) Windows7 オーディオアーキテクチャの概要
Android developer オーディオレイテンシ
Windowsオーディオの概要と比較
Wikipedia WAS API
XT-Audio事始め
Unityのオーディオ遅延をまとめたツイート

投稿2023/02/27 13:12

編集2023/02/27 13:17
UnitySoldier

総合スコア204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

venus_say

2023/02/27 16:42

自分はかなり知識不足なので、回答頂いた内容を理解するのが難しい部分がありましたが、大まかにわかりました。 さらに、最初におっしゃるように、要は「サウンドミドルウェアを使え」ということで落ち着くというわけですね。 もうこれを素直に導入するのがとにかく近道なようなので、調べてやってみます。 しかし、音ゲーなんて、Unityでそこそこみんなが作ってそうなゲームで、肝心要の音の遅延に関して書いてるページがググっても出て来ない(アンドロイドでの遅延は大量に出る)のは、本当に不思議でした。みんな気にならないのだろうか・・・。 今回頂いた回答が私のみならず、多くの方に役に立ちますように。 UnitySoldierさまありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問