前提・実現したいこと
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();を実行すると、遅延も音割れもなく再生されるため、読み込みミスなどではないと思います。
###お願い
初心者の学生プログラマです。このサイトを使うのも今回が初めてです。質問する際のマナーが守れていない場合はご指摘ください。ソースコードも汚いですが、頑張って読んでいただけるとありがたいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/28 12:24