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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

1回答

4555閲覧

Unity SEの音割れ&遅延&ならない問題を解消したい

kathmandu

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2020/04/28 00:31

編集2020/04/28 00:36

前提・実現したいこと

Unityで簡単なゲームを作っています。
SEが ならないor音が割れるor遅れる という事象が発生して困っています。

発生している問題・エラーメッセージ

DOtweenのSAFEMODEのみ

該当のソースコード

C# (Unity)
あと二つスクリプトがありますが、その二つはこの問題に関係ないと判断したため載せていません。
問題のあると判断したスクリプト2つスクリプト全体を載せています。

GameManager

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6 7public class GameManager : MonoBehaviour 8{ 9 public BallManager ballManager; 10 11 public Rigidbody2D rbody; 12 public AudioClip bom1se; 13 public AudioClip bom2se; 14 public AudioClip shot; 15 private AudioSource[] sounds;//音の重複で割れていると思い、audioclipではなくaudiosourceで制御しましたが、音が遅れました 16 17 18 public bool playshot = false;//ほかのスクリプトからこの変数がtrueになったときに音をなるようにしましたが、割れました (現在このスクリプトにはそのコードは残していません) 19 20 // Start is called before the first frame update 21 void Start() 22 { 23 sounds = GetComponents<AudioSource>(); 24 } 25 26 // Update is called once per frame 27 void Update() 28 { 29 30 switch (ballManager.whaton) 31 { 32 case 4: //ボールをDestroyしていいという合図 arrow 33 GameObject obj = GameObject.Find("Ball"); 34 Destroy(obj); 35 ballManager.whaton = -1; 36 37 break; 38 39 case 5: //losetag 40 GameObject obj1 = GameObject.Find("Ball"); 41 Destroy(obj1); 42 Invoke("playbom1se", 0.1f); 43 Invoke("playbom2se", 0.25f); 44 ballManager.whaton = -1;//爆発音が何回もなるのを防ぐ 45 46 break; 47 } 48 } 49 50 51 void playbom1se() { sounds[0].PlayOneShot(bom1se); } 52 void playbom2se() { sounds[0].PlayOneShot(bom2se); } 53 //public void playshotse() { sounds[2].Play(); }//Audiosouceから制御 54 public void playshotse() { sounds[2].PlayOneShot(shot); }//AudioClipで鳴らす 55}

BallManager

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6using DG.Tweening; 7 8 9public class BallManager : MonoBehaviour 10{ 11 public LayerMask FrameWall; 12 private Rigidbody2D rbody; 13 private float moveSpeed; // 移動速度 14 15 public enum MOVE_DIR // 移動方向定義 16 { 17 LEFT, 18 RIGHT, 19 }; 20 private MOVE_DIR moveDirection = MOVE_DIR.LEFT; // 移動方向 21 22 23 24 bool stop = false; 25 public int check = 0; //上に何が乗っているか判定する関数を呼び出す 26 public int whaton = 0; //上に何が乗っているか 27 public GameObject win; 28 public GameObject lose; 29 30 public GameObject bom1; 31 public GameObject bom2; 32 public GameObject bakuhatu1; 33 public GameObject bakuhatu2; 34 35 36 private const float X_MIN_VELOCITY = 10.0f; 37 private const float X_MAX_VELOCITY = 22.0f; 38 39 40 public GameManager gamemanager; //GameManager 41 public GameObject devil; 42 43 44 //BGM SE 45 private AudioSource[] audioSource; 46 public AudioClip bound; 47 48 49 50 // Start is called before the first frame update 51 void Start() 52 { 53 audioSource = GetComponents<AudioSource>(); 54 rbody = GetComponent<Rigidbody2D>(); 55 rbody.mass = Random.Range(5, 15); 56 //rbody.velocity = new Vector2(18.0f * -1, rbody.velocity.y); 57 moveSpeed = Random.Range(X_MIN_VELOCITY, X_MAX_VELOCITY);//乱数発生 58 //audioSource[1].Play(); ここで鳴らした場合問題なく再生される 59 } 60 61 // Update is called once per frame 62 void Update() 63 { 64 ballMove(); 65 } 66 67 void FixedUpdate() 68 { 69 spaceKeyCheck(); 70 wallCheck(); 71 } 72 73 74 //関数 75 void ballMove() 76 { 77 if (stop == false) //スペースキーが押されていなければ 78 { 79 switch (moveDirection) 80 { 81 case MOVE_DIR.LEFT: // 左に移動 82 rbody.velocity = new Vector3(moveSpeed * -1, 0f, 0f); 83 break; 84 85 case MOVE_DIR.RIGHT: // 右に移動 86 rbody.velocity = new Vector3(moveSpeed, 0f, 0f); 87 break; 88 } 89 } 90 } 91 void wallCheck() 92 { 93 bool isWall; // 進行方向に壁があるか否か 94 if (whaton != 4) //ballをdestroyした後にballにアクセスするとエラーが出るため 95 { 96 switch (moveDirection) 97 { 98 case MOVE_DIR.LEFT: // 左に移動 99 isWall = Physics2D.Linecast(//壁があるかどうか 100 new Vector2(transform.position.x, transform.position.y), 101 new Vector2(transform.position.x - 0.5f, transform.position.y), 102 FrameWall); 103 104 if (isWall) 105 { 106 moveDirection = MOVE_DIR.RIGHT;//進行方向を逆転 107 audioSource[0].PlayOneShot(bound); 108 } 109 break; 110 111 112 case MOVE_DIR.RIGHT: // 右に移動 113 isWall = Physics2D.Linecast(//壁があるかどうか 114 new Vector2(transform.position.x, transform.position.y), 115 new Vector2(transform.position.x + 0.5f, transform.position.y), 116 FrameWall); 117 118 if (isWall) 119 { 120 moveDirection = MOVE_DIR.LEFT;//進行方向を逆転 121 audioSource[0].PlayOneShot(bound); 122 } 123 break; 124 } 125 } 126 } 127 128 void spaceKeyCheck() 129 { 130 //スペースキーが押されたら、(ランダムに力を加える工程を)ストップ 131 if (Input.GetKey(KeyCode.Space)) 132 { 133 stop = true; 134 } 135 136 137//以下の関数が音を鳴らす部分 138 //スペースキーが押されていて、速度が0ならばボールがどこにあるかをチェック 139 if (stop && (rbody.velocity.x == 0f)) 140 { 141 check = 1;//ArrowManager and losetag でボールがどこにあるか確認 142 switch (whaton) 143 { 144 case 2: //Arrowの上 145 rbody.isKinematic = true; 146 147 //ボールを魔王に飛ばす 148 Transform rect = this.GetComponent<Transform>(); 149 Transform deviltrans = devil.GetComponent<Transform>(); 150 151 // ballの軌跡設定 152 Vector3[] path = 153 { 154 new Vector3(0f, 1.7f, 0f),//終点 155 }; 156 157 158 rect.DOScale(new Vector3(1.2f, 1.2f, 0), 1f).OnComplete(move); 159 audioSource[1].Play();//ここで鳴らしているはずですが、なりません 160 void move() 161 { 162 //gamemanager.GetComponent<GameManager>().playshotse(); 163 164 rect.DOScale(new Vector3(0.2f, 0.2f, 0), 0.5f); 165 rect.DOLocalPath(path, 0.5f, PathType.Linear).SetEase(Ease.OutQuad).OnComplete(destroy); 166 } 167 168 void destroy() 169 { 170 whaton = 4; 171 bom1.SetActive(false); 172 bom2.SetActive(false); 173 devilgragra(); 174 } 175 void devilgragra() 176 { 177 deviltrans.DOLocalRotate(new Vector3(0, 0f, 15f), 0.1f).SetDelay(0.1f); 178 deviltrans.DOLocalRotate(new Vector3(0, 0f, -15f), 0.1f).SetDelay(0.2f); 179 deviltrans.DOLocalRotate(new Vector3(0, 0f, 15f), 0.1f).SetDelay(0.3f); 180 deviltrans.DOLocalRotate(new Vector3(0, 0f, -15f), 0.1f).SetDelay(0.4f); 181 deviltrans.DOLocalRotate(new Vector3(0, 0f, 15f), 0.1f).SetDelay(0.5f); 182 deviltrans.DOLocalRotate(new Vector3(0, 0f, -15f), 0.1f).SetDelay(0.6f).OnComplete(setwin); 183 } 184 void setwin() 185 { 186 devil.SetActive(false); 187 win.SetActive(true); 188 } 189 190 break; 191 192 193 case 3: //はずれの上 (必ず3にはなるが、先に2を判定するため大丈夫) 194 //敵からの攻撃のアクション 195 Transform bom1trans = bom1.GetComponent<Transform>(); 196 Transform bom2trans = bom2.GetComponent<Transform>(); 197 Transform bakuhatu1trans = bakuhatu1.GetComponent<Transform>(); 198 Transform bakuhatu2trans = bakuhatu2.GetComponent<Transform>(); 199 200 Vector3[] path1 = { 201 new Vector3(-5.5f, -1.8f, 0f), 202 }; 203 Vector3[] path2 = { 204 new Vector3(6f, -2.1f, 0f), 205 }; 206 whaton = 5;//ボール消去 & SE設定 207 bom1trans.DOLocalPath(path1, 0.5f, PathType.CatmullRom).SetEase(Ease.OutQuad).SetDelay(0.1f); 208 bom2trans.DOLocalPath(path2, 0.5f, PathType.CatmullRom).SetEase(Ease.OutQuad).SetDelay(0.25f).OnComplete(setbom); 209 void setbom() 210 { 211 bakuhatu1.SetActive(true); 212 bakuhatu2.SetActive(true); 213 } 214 bakuhatu1trans.DOScale(new Vector3(4, 3, 0), 1f).SetDelay(0.1f).SetDelay(0.2f); 215 bakuhatu2trans.DOScale(new Vector3(3, 2, 0), 1f).SetDelay(0.3f).SetDelay(0.35f).OnComplete(destroy1); 216 void destroy1() 217 { 218 lose.SetActive(true); 219 } 220 221 break; 222 } 223 } 224 } 225} 226

試したこと

他のオブジェクトのほかのスクリプトの関数を呼び出す形でSEをならせば鳴るかと思いましたが、音が割れる&遅れました。
AudioClipでPlayOneShotで鳴らしていたため、音が重複しているかと思い、Audiosourceで制御しましたが音が鳴りませんでした。

しかし、void startの部分でaudioSource[1].Play();を実行すると、遅延も音割れもなく再生されるため、読み込みミスなどではないと思います。

###お願い
初心者の学生プログラマです。このサイトを使うのも今回が初めてです。質問する際のマナーが守れていない場合はご指摘ください。ソースコードも汚いですが、頑張って読んでいただけるとありがたいです。

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

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

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

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

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

guest

回答1

0

まずは、AudioMixer の Normalize エフェクトを適用して、改善されるか試してみてください。

参考:【Unity】AudioSourceの同時再生による音割れを防ぐ方法 - へくれすブログ
http://hecres.hatenablog.com/entry/2018/03/10/181127

上記で改善されない場合は、問題の切り分けが必要ですので、以下を確認してみてください。

  • 音量の小さい SE でも音割れするのか?(サウンド素材の問題ではないか?)
  • 同時再生数が 1 つでも音割れするのか?
  • どういうときに音割れし、どういうときに遅延するのか?

※音が鳴っているかどうかは AudioSource.isPlaying で確認するようにしてください。

投稿2020/04/28 08:36

nskydiving

総合スコア6500

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

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

kathmandu

2020/04/28 12:24

AudioMixerのNormalizeは行いましたが、解決しませんでした。 音量の小さい SE でも音割れするのか? ー> void startの部分で再生すると問題なく再生されるため、音声ファイルの問題ではないと考えられます。 同時再生数が 1 つでも音割れするのか? -> 音割れはせず、聞こえないor音声の再生が遅れる どういうときに音割れし、どういうときに遅延するのか? -> audiosource.playoneshot(audioclip)で再生させると、音割れ / audiosource[0].play() で再生させると、遅延or再生されない ※音が鳴っているかどうかは AudioSource.isPlaying で確認するようにしてください。 -> 分かりました このような感じです。他に考えられる対策はありますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問