unityで、プレイヤーがゴールしたとき、死んだときにBGMをストップさせたいと考えています。
https://qiita.com/OKsaiyowa/items/d1a131f6b3e356c19388
このサイトを参考にしたところ、AudioSourceをストップするときはaudioSource.Stop();
を書けばいいと思うのですが、BGMは続いています。
ストップするオーディオを指定するのかと思いましたけど、別のサイトでみたところAudioSource内のすべてがストップの対象とのことでした。
何が悪いのかを教えてください。
以下、インスペクターの画面とスクリプトです。
using UnityEngine; using UnityEngine.SceneManagement; public class PlayerManager : MonoBehaviour { //public public float xspeed; public float jumpPower; public GroundCheck ground; public GameManager gameManager; public AudioSource audioSource; //SE [SerializeField] AudioClip jumpSE; public Traps trap1; public Trap2 trap2; public Trap3 trap3; //private private bool isGround = false; float speed; float x; bool isDead = false; public enum DIRECTION_TYPE { STOP, RIGHT, LEFT } DIRECTION_TYPE direction = DIRECTION_TYPE.STOP; Rigidbody2D rigidbody2D; Rigidbody2D trapSpike1; Animator animator; private void Start() { rigidbody2D = GetComponent<Rigidbody2D>(); trapSpike1 = GetComponent<Rigidbody2D>(); animator = GetComponent<Animator>(); audioSource = GetComponent<AudioSource>(); Debug.Log("audioSource1は"+audioSource);//<====================================== // デバッグ用 //Debug.Log("trap1 " + trap1); //Debug.Log("trap2 " + trap2); // Debug.Log("trap3 " + trap3); } void Update() { isGround = ground.IsGround(); if (isDead) { return; } //接地判定を得る //float x = Input.GetAxis("Horizontal"); //speedというパラメータにxを代入 //animator.SetFloat("speed", Mathf.Abs(x)); /* if (x == 0) { //止まっている direction = DIRECTION_TYPE.STOP; } else if (x > 0) { //右に動く direction = DIRECTION_TYPE.RIGHT; } else if (x < 0) { //左に動く direction = DIRECTION_TYPE.LEFT; } switch (direction) { case DIRECTION_TYPE.STOP: speed = 0; break; case DIRECTION_TYPE.RIGHT: speed = xspeed; transform.localScale = new Vector3(1, 1, 1); break; case DIRECTION_TYPE.LEFT: speed = -xspeed; transform.localScale = new Vector3(-1, 1, 1); break; } */ } public void GoLeft() //ボタンをクリックしたら右へ移動 { rigidbody2D.velocity = new Vector2(-xspeed, rigidbody2D.velocity.y); transform.localScale = new Vector3(-1, 1, 1); animator.SetFloat("speed", Mathf.Abs(1)); } public void GoRight() //ボタンをクリックしたら左へ移動 { rigidbody2D.velocity = new Vector2(xspeed, rigidbody2D.velocity.y); transform.localScale = new Vector3(1, 1, 1); animator.SetFloat("speed", Mathf.Abs(1)); } public void StopHorizontalMovement() //ボタンを離したら停止 { rigidbody2D.velocity = new Vector2(0, rigidbody2D.velocity.y); animator.SetFloat("speed", Mathf.Abs(0)); } public void Jump() //ボタンをクリックしたら右へ移動 { if (isGround) { //上に力を加える rigidbody2D.AddForce(Vector2.up * jumpPower); animator.SetBool("isJumping", true); audioSource.PlayOneShot(jumpSE); // Debug.Log("ジャンプしました"); } } private void OnTriggerEnter2D(Collider2D collision) { Debug.Log("OnTriggerEnter2D内のaudioSource=" + audioSource);//<==================== if (isDead) { return; } if (collision.gameObject.tag == "Trap") { Debug.Log("GameOver"); gameManager.GameOver(); PlayerDeath(); Debug.Log("死んだ後のaudioSource=" + audioSource); audioSource.Stop(); } if (collision.gameObject.tag == "Finish") { Debug.Log("GameClear"); gameManager.GameClear(); Invoke("GameClear",4f); audioSource.Stop(); Debug.Log("ゴールした後のaudioSource=" + audioSource);//<======================= } //トラップSwitchのタグ if (collision.gameObject.tag == "Switch1") { Debug.Log("罠1起動"); trap1.Trap1Activate(); } if (collision.gameObject.tag == "Switch2") { trap2.Trap2Activate(); // Debug.Log(trap2); } if (collision.gameObject.tag == "Switch3") { Debug.Log("罠3起動"); // Debug.Log(trap3); Invoke("AppearblocInvokek", 2.0f);//ブロック出現 } } void AppearblocInvokek()//ブロック出現のためのInvoke { trap3.Appearblock(); } void GameClear()//ブロック出現のためのInvoke { SceneManager.LoadScene("Title"); } void PlayerDeath() { BoxCollider2D boxCollider2D = GetComponent<BoxCollider2D>(); Destroy(boxCollider2D); rigidbody2D.velocity = new Vector2(0, 0); rigidbody2D.AddForce(Vector2.up * 400); animator.Play("PlayerDeathAnimation"); gameManager.GameOver(); isDead = true; } }
Debug.Logを見て、目的の行まで正しく到達しているかを確認してください。
回答ありがとうございます。
わかりました。確認します。
audioSource.Stop();の直前の
private void OnTriggerEnter2D(Collider2D collision)
{
}
までは来ているようです。
audioSource.Stop();を含めたif文の中に入ったとたん消えています。
すみません、もうちょっと確認してみます。
再確認しましたが、private void OnTriggerEnter2D(Collider2D collision)まで来ています。
ただ、private void OnTriggerEnter2D(Collider2D collision)の中でなぜか2つaudioSourceが来ています。
さらにゴールした後、audioSourceが2つ追加されます。
少し分かりづらいので、画像を載せておきます。
はっきりしませんがPlayerManagerが付いたオブジェクトが2つ存在しているとかですかね。
質問のスクリプトを検証したコードにしてもらえると何か分かるかもしれません。
確認しましたが、PlayerManagerが付いたオブジェクトは一つだけです。
検証したコードというのはどういうふうに書いたものでしょうか。
左右に動いたりジャンプしたり、というのをすべて省いたもの、ということですか?
>検証したコード
現在の質問のコードには「audioSource1はPlayer」と「OnTriggerEnter2D内のaudioSource=Player」を出すDebug.Logが見当たらない為、これらがどこに書かれているのか確認したかった次第です。(Debug.Logの場所によってはこういう結果になるのが正しい可能性があります)
あと念の為、他にAudioSourceが存在していないか・そこでBGMを流していないかも確認してみてください。(うっかりGameObjectやコンポーネントをコピーしている可能性もある為)
了解しました。質問のところに追加しておきます。
AudioSourceにつきまして確認したところ、プレイヤーに付いていますが、ジャンプしたときの音を出すためのもので、BGMは流していません。
1万字を超えたらしいので、元のコードは削除しました。
あなたの回答
tips
プレビュー