1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

東方Projectっぽいシューティング1 複数の弾が当たった時の効果音

Last updated at Posted at 2023-07-09

自機の弾を、高速時は扇状に5発、
スクリーンショット (6).png

低速時には横に並んで正面に5発撃ちます。
スクリーンショット (7).png

敵に当たった時に「ボコッ」と効果音をPlayOneShotで鳴らします。
しかしこうすると、複数の弾が同時に当たった時、効果音が重なって「ボボゴゴッ」って感じになってうるさいし不快。

「複数の弾が当たっても一回しか音を出さないようにするには?」
低速ショットは、音を出すだけのオブジェクトを置いて解決。

Player.cs
 else if (SlowSpeed)
                {
                    Instantiate(P_Bullet, transform.position, Quaternion.Euler(0, 0, 0));
                    P_Pos = transform.position;
                    P_Pos += new Vector3(0.3f, 0, 0);
                    Instantiate(P_Bullet, P_Pos, Quaternion.Euler(0, 0, 0));
                    P_Pos = transform.position;
                    P_Pos += new Vector3(-0.3f, 0, 0);
                    Instantiate(P_Bullet, P_Pos, Quaternion.Euler(0, 0, 0));
                    P_Pos = transform.position;
                    P_Pos += new Vector3(0.6f, 0, 0);
                    Instantiate(P_Bullet, P_Pos, Quaternion.Euler(0, 0, 0));
                    P_Pos = transform.position;
                    P_Pos += new Vector3(-0.6f, 0, 0);
                    Instantiate(P_Bullet, P_Pos, Quaternion.Euler(0, 0, 0));
                    Instantiate(P_B_SE,transform.position,Quaternion.identity);
                    GameObject isP_B_SE = GameObject.Find("P_B_SE(Clone)");                  
                }
P_B_SE.cs
    void Start()
    {
        Right = GameObject.Find("Right/Right");
        Left = GameObject.Find("Left/Left");
        bc2d = GetComponent<BoxCollider2D>();
        Player = GameObject.Find("Player(Clone)");
        rb2d =GetComponent<Rigidbody2D>();
        rb2d.velocity = new Vector2(0, 12);
        Invoke("DEATH", 5);
    }

    void DEATH()
    {
        Destroy(gameObject);
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.gameObject.tag == "Enemy")
        {
            GetAudio.PlayOneShot(EnemyDamage);
            StartCoroutine(Audio_Stop());
        }
    }

    IEnumerator Audio_Stop()
    {
        yield return new WaitForSeconds(0.1f);
        GetAudio.Stop();
        Destroy(gameObject);
    }

結果
スクリーンショット (8).png

この低速ショットに重なってる白いオブジェクトが音を出す事で解決。

高速ショットは扇状なので、LineCastでセンサーを付けて、そのセンサーから音を出すようにしてみたけど上手くいかない
スクリーンショット (9).png

(少し上にずらしてあるのは、ぴったりの位置でRayを飛ばすと、Rayが当たる前に弾が敵に当たってしまう)

結局Rayの微調整が面倒で却下。

PlayOneShotメソッドは繰り返しできるから効果音用、だったと思います。
対してPlayメソッドはBGM用。

あえてPlayメソッドで音を出したらなんとなくきれいな音になりました。

Player.cs
    public IEnumerator AT_Damage()
    {
        GetAudio.volume = 0.2f;
        GetAudio.Play();
        yield return new WaitForSeconds(0.5f);
        GetAudio.volume = 0.2f;
    }
    public void AT_Act()
    {
        StartCoroutine(AT_Damage());
    }
P_Bullet.cs
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.gameObject.tag == "Enemy")
        {
            if(name != "P_Bullet(Clone)")
            {
                Player.GetComponent<Player>().AT_Act();
            }
            Destroy(gameObject);
        }
    }

当たった時の音(EnemyDamage)は0.1秒も無い(長さが00:00:00だった)
音の出始め?の「ボコッ」の「ボ」の部分くらいが聞こえればそれっぽくなったので、これで良しとします。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?