【第18日目】UnityとPUN2とC#で対戦相手と同じ音楽を聴く

背景音楽を流したいのですが、カフェなので、みんなで同じ音楽を聴きたいと思うのです。

各自バラバラに音楽を聴くのなら簡単にできそうですが、聞く音楽の種類とタイミングをそろえる事が出来るのでしょうか。

今日は、その検証を進めてみたいと思います。

UnityとPUN2とC#で対戦相手と同じ音楽を聴く

まず、触ると音楽が流れるようなSphereを想定します。

Sphereを用意しこれにスクリプトを付けて、各自バラバラに音楽を聴けるようにします。

各自バラバラに音楽を聴く

今回の音楽をダウンロードしてきたサイトはこちら(musmus)です。

まずは、球を触ると、音がランダムで流れるという事にしたいと思います。

Sphereにつけたスクリプトは以下です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MusicPlay : MonoBehaviour
{
    public AudioSource audioSource;
    public AudioClip audioClip1;
    public AudioClip audioClip2;
    public AudioClip audioClip3;
    private void OnMouseDown()
    {
        int i = Random.Range(0, 4);



        if (i == 1)
        {
            audioSource = gameObject.GetComponent<AudioSource>();
            audioSource.clip = audioClip1;
            audioSource.Play();
        }else if (i == 2)
        {
            audioSource = gameObject.GetComponent<AudioSource>();
            audioSource.clip = audioClip2;
            audioSource.Play();
        }
        else if(i == 3)
        {
            audioSource = gameObject.GetComponent<AudioSource>();
            audioSource.clip = audioClip3;
            audioSource.Play();

        }
        else
        {
            audioSource = gameObject.GetComponent<AudioSource>();
            audioSource.Stop();
        }

    }
}

インスペクター上でAudioSourceをアタッチして、AudioClipのところにダウンロードしたWAVをドラッグアンドドロップするだけです。

これで、各自バラバラに音楽を聴くというのは達成できました。

みんなで同じ音楽を聴く

これは誰しもが音楽を変える権限を持っているという事が前提でやろうと思います。

すると、かかっている音楽の場合分けをPUN2のルームカスタムプロパティでやればOKかなとおもいました。

山札のデータとごっちゃにならないように、最初のKeyの先頭にMを付けています。

山札はAかBなので、その場合をはじいて、Mの場合のみコールバックメソッドの中を実行します。

山札の分離とほぼ同じ書き方で書くことが出来ました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class MusicPlay : MonoBehaviourPunCallbacks
{
    public AudioSource audioSource;
    public AudioClip audioClip1;
    public AudioClip audioClip2;
    public AudioClip audioClip3;
    private void OnMouseDown()
    {
        int i = Random.Range(0, 4);
        var hashtable = new ExitGames.Client.Photon.Hashtable();
        hashtable["M" + i] = i;
        PhotonNetwork.CurrentRoom.SetCustomProperties(hashtable);

    }
    public override void OnRoomPropertiesUpdate(ExitGames.Client.Photon.Hashtable propertiesThatChanged)
    {

        foreach (var prop in propertiesThatChanged)
        {
            string key = (string)prop.Key;

            if (key.Substring(0, 1) == "M")
            {
                if ((int)prop.Value == 1)
                {
                    audioSource = gameObject.GetComponent<AudioSource>();
                    audioSource.clip = audioClip1;
                    audioSource.Play();
                }
                else if ((int)prop.Value == 2)
                {
                    audioSource = gameObject.GetComponent<AudioSource>();
                    audioSource.clip = audioClip2;
                    audioSource.Play();
                }
                else if ((int)prop.Value == 3)
                {
                    audioSource = gameObject.GetComponent<AudioSource>();
                    audioSource.clip = audioClip3;
                    audioSource.Play();

                }
                else
                {
                    audioSource = gameObject.GetComponent<AudioSource>();
                    audioSource.Stop();
                }
            }
        }            
    }
}

これで、部屋の音楽を一意にコントロールできるようになりました。

おわりに

とうとう、20日チャレンジも残り2日になりました。

カフェには全く物がなく、全然カフェらしくなっていませんが、ゲームの方はかなり進みましたね。

 

今日は、音楽を入れることに成功しました。

あとは、ブラッシュアップとカードの能力メソッドの発行あたり時間のある限りやっていこうと思います。

 

それでは、また!

 

 

おすすめの記事