画像2個、それぞれ見たら違う音が鳴る⑤ できました

出来たので、全コードを乗せますが、

Cubeが二つあって、それぞれのコードを

全部載せるので長いです。

 

本当はコードは

コードを記載する形のブログにした方が良いのだとは思います。

ですが、少し前にそれを使ったとき、

自分が不慣れなせいで、スムーズにできなかった為、

普通にコピーペーストします。

 

 

アプリはこんな見た目です。

見た方が赤くなっています。

一度見たら、見た方に紐づけられたwavまたはmp3が鳴ります。

目をそらしても鳴り続けますが、

背景色は青くなります。

 

片方が鳴っているときに、もう片方を見ると

音が止まり、

今、見た方に紐づけられたwavまたはmp3が鳴ります。

 

再度、最初に見た方を見ると、

今鳴らした方は止まり、

途中まで演奏していた続きから鳴ります。

 

テンキーの1を押すと、音は一時停止します。

テンキーの2を押すと、音は停止し、次に鳴らすときは最初から鳴ります。

 

 

りんごとバナナはassets内に入れた画像です。

いらすとや様からダウンロード致しました。

 

背景はCubeです。

画像はimageです。

imageの後ろに配置したCubeの色が変わっています。

 

左右においた、Cubeにそれぞれアタッチした

スクリプトを下記に乗せます。

 

どっちのCubeにどっちのスクリプト

セットしてもかまいません。

 

スクリプト名はPlayとPlay2です。

 

途中、試行錯誤しながら作っていたので、

相当いらないコードがたっぷり入っています。

取捨選択して捨てて下さい。

 

 

今後、検証したいこと

●usingが多いです。全部いるのか確認したいです。

●いらないコードを一回、整理したいです。

 

 

using System;
using System.Collections;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using Tobii.Gaming; //ライブラリの追加
using NAudio.Wave;  //← 見つからないとエラーが出たときは Import Settings を見直す


public class play : MonoBehaviour
{

    //#########################################################
    private GameObject cu2Object;
    play2 pl2;
    //#########################################################


    public AudioSource audioSource;
    //public string mp3Path;           //再生する mp3 のパス。ここに書いたstring はInspectorで触れるようになる
    string mp3Path = "C:/sound/1";  //今までは↑の行で、InspectorのAudio Sourceにパスを指定していたが、ファイルの拡張子を判断したいのでこっちに変えた

 

    //注視情報
    private GazeAware gazeAware;

    //停止中か再生中かなど
    //***************************************************
    public int ichiziteishi;


    //配列の番号
    int i = 0;

 

 

    private void Start()
    {
      

        //audioSource = this.GetComponent<AudioSource>();
        //StartCoroutine(Connect());

 

        //注視情報の取得
        gazeAware = GetComponent<GazeAware>();

        //一時停止が押されたかどうかを見るための変数。最初と再生中は1.一時停止中は2
        ichiziteishi = 1;

        string Pathmei = System.IO.Directory.GetFiles(mp3Path, "*", System.IO.SearchOption.AllDirectories);


        for (i = 0; i < 4;)
        {

            Debug.Log(Pathmei[i]);
            string file = Pathmei[i];

            //拡張子の出力
            Debug.Log(Path.GetExtension(file));

            //ファイル名の出力
            Debug.Log(Path.GetFileNameWithoutExtension(file));

 


            if (Path.GetExtension(file).Contains("mp3"))
            {
                Debug.Log($"mp3あったよ:{i}");
                
                mp3Path = Pathmei[i];
                break;

            }
            else if (Path.GetExtension(file).Contains("wav"))
            {
                Debug.Log($"wavあったよ:{i}");
               
                var wavPath = Pathmei[i];    // Application.temporaryCachePath内にconverted.wavという名前で保存
                Debug.Log($"wav鳴らせるかな:{i}");

                StartCoroutine(PlayWav(wavPath));
                break;
            }
            else
            {
                Debug.Log($"どっちもないよ:{i}");
            }

            
            i++;

        }

 


        if (File.Exists(mp3Path))   //Fileが存在しているか。もししているなら。
        {
            //wav 変換した一時ファイルを保存するパス
            var wavPath = Application.temporaryCachePath + "/converted.wav";    // Application.temporaryCachePath内にconverted.wavという名前で保存
            Mp3ToWAV(mp3Path, wavPath);
            StartCoroutine(PlayWav(wavPath));
        }
        else
        {
            Debug.Log($"File not found : {mp3Path}");
        }

 

    }


    //mp3 → wav 変換して、保存したパスを返す
    public void Mp3ToWAV(string mp3Path, string wavPath)
    {
        //ファイルを byte 配列で読み込み

        var bytes = File.ReadAllBytes(mp3Path);     //File.ReadAllBytes:バイナリ ファイルを開き、ファイルの内容をバイト配列に読み取った後、ファイルを閉じます。

        //wav を一時ファイルとして保存
        using (var stream = new MemoryStream())     //MemoryStreamはFileには保存しないが、メモリにデータを読み書きするクラス
        {
            stream.Write(bytes, 0, bytes.Length);       //stream.Write で書き込み。bytes.Lengthで、bytesの配列全体を書き込み。
            stream.Position = 0;                        //ストリームの位置を先頭に。ここに10と入れたら10バイト目にセットすることになる。

            using (var reader = new Mp3FileReader(stream))  //Mp3FileReader:mp3Fileから読み込む Mp3FileReader(stream) でstreamのmp3Fileを読む。だと思う。
            {
                WaveFileWriter.CreateWaveFile(wavPath, reader);  //wav で書き出し(mp3なら「MediaFoundationEncoder」wavなら「WaveFileWriter」)
                Debug.Log($"Convert to wav successfully : {wavPath}");  //うまく行ったらwav保存先のパスを表示
            }
        }
    }

 


    void Update()
    {


        // マウスの左ボタンを推した場合も再生


        //オブジェクトを注視していたらTrue
        bool flg = gazeAware.HasGazeFocus;


        //注視していたり、マウスが左クリックされたら

        if (flg || Input.GetMouseButtonDown(0))
        {


            //################################################################
            cu2Object = GameObject.Find("2Cu");
            pl2 = cu2Object.GetComponent<play2>();
           
            if (!pl2.audioSource2.isPlaying)
            {
                Debug.Log("おーでぃおそーす2停止中");
            }
            else
            {

                Debug.Log("おーでぃおそーす2再生してます");
            }
                //################################################################

 

 

                //注視していたら赤色に
                gameObject.GetComponent<Renderer>().material.color = Color.red;


            if (!audioSource.isPlaying)  //再生中で無いなら
            {

                //一時停止関数がもし2(一時停止中)なら
                if (ichiziteishi == 2)
                {
                    //再開してください(同時にichiziteisi変数は1になる)
                    UnPause();

                }

                //一時停止関数がもし1(一時停止中でない(起動したところだったり、停止中だったり))なら再生する。
                else
                {

                    audioSource.Play();

                    
                    //++++playが再生されるときは、play2は一時停止する++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    pl2.audioSource2.Pause();
                    // Play(audioClip);
                    // Play(audioClip);

                }


            }

 

        }

        //注視して無かったり、マウス左クリックされてなかったりしたら
        else
        {
            //注視していなければ青色に
            gameObject.GetComponent<Renderer>().material.color = Color.blue;
            //注視がそれただけでは一時停止にはしていない。視線がそれることはよくあると思うので。
            //一時停止にしたいならPauseを入れたら可能。

            //改訂として目をそらしたら止めるようにする
            // Pause();

 


        }


        // 停止

        if (audioSource.isPlaying)  //再生中なら
        {

            //注視がそれているときのみ有効。テンキーの「2」を押して離したら停止
            if (Input.GetKeyUp(KeyCode.Keypad2))
            {

                Stop();


            }


        }


        // 注視がそれているときのみ有効。一時停止
        if (audioSource.isPlaying)  //再生中なら
        {

            //テンキーの「1」を押して離したら一時停止し、ichiziteishi変数を2に。
            if (Input.GetKeyUp(KeyCode.Keypad1))
            {
                Pause();

            }
        }


        // 再開
        if (!audioSource.isPlaying)  //停止中なら
        {

            //もう一回、注視したり左クリックしたりしたら再開し、ichiziteishi変数を1に。
            if (flg || Input.GetMouseButtonDown(0))
            {

                UnPause();


            }
        }

        if (Input.GetKey(KeyCode.Escape))
        {
            Application.Quit();
        }

 

    }

 


    //ストリーミング再生する
    IEnumerator PlayWav(string path)    //IEnumeratorはコルーチンを使うのに宣言するとき使う。PlayWavは関数名。
                                        //コルーチンは好きな場所で処理を止めたり再開したりできる機能
    {
        using (var www = new WWW("file://" + path))     //www(url)でURLにアクセスする
        {
            while (!www.isDone)     //while(条件式) 条件式が真である限りループする。www.isDoneはダウンロード終了したかどうかを読み取る。!がついているから「終了していない限り処理する」ということ。と思う。
                yield return null;  //1フレーム停止

            if (string.IsNullOrEmpty(www.error))    //string.IsNullOrEmptyは指定の文字列が、nullもしくは空の文字列かを判断
                                                    //www.errorはダウンロード中にエラーが起きたときのメッセージ
            {
                var clip = www.GetAudioClip(false, true);   //最初のはクリップを2Dにする(false)3Dは(true)だと思う。よく分かってない。後の真偽はtrueならダウンロード中も再生。falseならダウンロードしてから再生
                audioSource.clip = clip;
                //audioSource.Play();
                Debug.Log($"Play wav : {path}");
            }
            else
            {
                Debug.Log(www.error);
            }
        }
    }

 

 

 

    //再生、一時停止、停止、再開、完全に停止について

    /*
    // 再生 Play と、入力したら一回だけ再生
    private void Play(AudioClip audi)
        {
            audioSource.PlayOneShot(audi);
            
    }
    */

    //  一時停止 Pauseと、入力したらichiziteishi変数に2を入れて、一時停止
    private void Pause()
    {
        ichiziteishi = 2;
        audioSource.Pause();
    }

    // 停止  Stopと、入力したら停止
    private void Stop()
    {
        audioSource.Stop();
    }

    // 再開 UnPause と、入力したらichiziteishi変数に1を入れて、再開

    private void UnPause()
    {
        ichiziteishi = 1;
        audioSource.UnPause();

        //++++playが再生されるときは、play2は一時停止する++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        pl2.audioSource2.Pause();

 

    }

 


}

 

 

 

 

 

 

 

 

 

---ここからPlay2----

 

using System;
using System.Collections;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using Tobii.Gaming; //ライブラリの追加
using NAudio.Wave;  //← 見つからないとエラーが出たときは Import Settings を見直す


public class play2 : MonoBehaviour
{

    //********************************************************
    private GameObject cu1Object;
    play pl;
    //********************************************************


    public AudioSource audioSource2;
    //public string mp3Path;           //再生する mp3 のパス。ここに書いたstring はInspectorで触れるようになる
    string mp3Path = "C:/sound/2";  //今までは↑の行で、InspectorのAudio Sourceにパスを指定していたが、ファイルの拡張子を判断したいのでこっちに変えた

 

    //注視情報
    private GazeAware gazeAware;

    //停止中か再生中かなど
   
    //####################################################
    public int ichiziteishi2;

   
    

    //配列の番号
    int i = 0;

    //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    int a = 2;
    int b = 3;
    int c = 4;

    //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

    private void Start()
    {
       
       

        //audioSource = this.GetComponent<AudioSource>();
        //StartCoroutine(Connect());

 

        //注視情報の取得
        gazeAware = GetComponent<GazeAware>();

        //一時停止が押されたかどうかを見るための変数。最初と再生中は1.一時停止中は2
        ichiziteishi2 = 1;
       
        

        string Pathmei = System.IO.Directory.GetFiles(mp3Path, "*", System.IO.SearchOption.AllDirectories);


        for (i = 0; i < 4;)
        {

            Debug.Log(Pathmei[i]);
            string file = Pathmei[i];

            //拡張子の出力
            Debug.Log(Path.GetExtension(file));

            //ファイル名の出力
            Debug.Log(Path.GetFileNameWithoutExtension(file));

 


            if (Path.GetExtension(file).Contains("mp3"))
            {
                Debug.Log($"mp3あったよ:{i}");
                
                mp3Path = Pathmei[i];
                break;

            }
            else if (Path.GetExtension(file).Contains("wav"))
            {
                Debug.Log($"wavあったよ:{i}");
               
                var wavPath = Pathmei[i];    // Application.temporaryCachePath内にconverted.wavという名前で保存
                Debug.Log($"wav鳴らせるかな:{i}");

                StartCoroutine(PlayWav(wavPath));
                break;
            }
            else
            {
                Debug.Log($"どっちもないよ:{i}");
            }

            
            i++;

        }

 


        if (File.Exists(mp3Path))   //Fileが存在しているか。もししているなら。
        {
            //wav 変換した一時ファイルを保存するパス
            var wavPath = Application.temporaryCachePath + "/converted.wav";    // Application.temporaryCachePath内にconverted.wavという名前で保存
            Mp3ToWAV(mp3Path, wavPath);
            StartCoroutine(PlayWav(wavPath));
        }
        else
        {
            Debug.Log($"File not found : {mp3Path}");
        }

 

    }


    //mp3 → wav 変換して、保存したパスを返す
    public void Mp3ToWAV(string mp3Path, string wavPath)
    {
        //ファイルを byte 配列で読み込み

        var bytes = File.ReadAllBytes(mp3Path);     //File.ReadAllBytes:バイナリ ファイルを開き、ファイルの内容をバイト配列に読み取った後、ファイルを閉じます。

        //wav を一時ファイルとして保存
        using (var stream = new MemoryStream())     //MemoryStreamはFileには保存しないが、メモリにデータを読み書きするクラス
        {
            stream.Write(bytes, 0, bytes.Length);       //stream.Write で書き込み。bytes.Lengthで、bytesの配列全体を書き込み。
            stream.Position = 0;                        //ストリームの位置を先頭に。ここに10と入れたら10バイト目にセットすることになる。

            using (var reader = new Mp3FileReader(stream))  //Mp3FileReader:mp3Fileから読み込む Mp3FileReader(stream) でstreamのmp3Fileを読む。だと思う。
            {
                WaveFileWriter.CreateWaveFile(wavPath, reader);  //wav で書き出し(mp3なら「MediaFoundationEncoder」wavなら「WaveFileWriter」)
                Debug.Log($"Convert to wav successfully : {wavPath}");  //うまく行ったらwav保存先のパスを表示
            }
        }
    }

 


    void Update()
    {
        // マウスの左ボタンを推した場合も再生


        //オブジェクトを注視していたらTrue
        bool flg = gazeAware.HasGazeFocus;


        //注視していたり、マウスが左クリックされたら


        //**************************************************************
        cu1Object = GameObject.Find("1Cu");
        pl = cu1Object.GetComponent<play>();

        // りんごのオーディオソースが鳴っていないとき

        if (flg || Input.GetMouseButtonDown(0))
        {

           

 

            //注視していたら赤色に
            gameObject.GetComponent<Renderer>().material.color = Color.red;


            if (!audioSource2.isPlaying)  //再生中で無いなら
            {

                //一時停止関数がもし2(一時停止中)なら
                if (ichiziteishi2 == 2)
                {
                    //再開してください(同時にichiziteisi変数は1になる)
                    UnPause();

                }

                //一時停止関数がもし1(一時停止中でない(起動したところだったり、停止中だったり))なら再生する。
                else
                {

                    audioSource2.Play();

                    //++++play2が再生されるときは、playは一時停止する++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    pl.audioSource.Pause();
                    // Play(audioClip);

                }


            }

 

        }

        //注視して無かったり、マウス左クリックされてなかったりしたら
        else
        {
            //注視していなければ青色に
            gameObject.GetComponent<Renderer>().material.color = Color.blue;
            //注視がそれただけでは一時停止にはしていない。視線がそれることはよくあると思うので。
            //一時停止にしたいならPauseを入れたら可能。

            //改訂として目をそらしたら止めるようにする
            // Pause();

 


        }


        // 停止

        if (audioSource2.isPlaying)  //再生中なら
        {

            //注視がそれているときのみ有効。テンキーの「2」を押して離したら停止
            if (Input.GetKeyUp(KeyCode.Keypad2))
            {

                Stop();


            }


        }


        // 注視がそれているときのみ有効。一時停止
        if (audioSource2.isPlaying)  //再生中なら
        {

            //テンキーの「1」を押して離したら一時停止し、ichiziteishi2変数を2に。
            if (Input.GetKeyUp(KeyCode.Keypad1))
            {
                Pause();

            }
        }


        // 再開
        if (!audioSource2.isPlaying)  //停止中なら
        {

            //もう一回、注視したり左クリックしたり、かつ、りんごのオーディオソースが鳴っていないなら再開し、ichiziteishi2変数を1に。
            if (flg || Input.GetMouseButtonDown(0))
            {

                UnPause();


            }
        }

        if (Input.GetKey(KeyCode.Escape))
        {
            Application.Quit();
        }

 

    }

 


    //ストリーミング再生する
    IEnumerator PlayWav(string path)    //IEnumeratorはコルーチンを使うのに宣言するとき使う。PlayWavは関数名。
                                        //コルーチンは好きな場所で処理を止めたり再開したりできる機能
    {
        using (var www = new WWW("file://" + path))     //www(url)でURLにアクセスする
        {
            while (!www.isDone)     //while(条件式) 条件式が真である限りループする。www.isDoneはダウンロード終了したかどうかを読み取る。!がついているから「終了していない限り処理する」ということ。と思う。
                yield return null;  //1フレーム停止

            if (string.IsNullOrEmpty(www.error))    //string.IsNullOrEmptyは指定の文字列が、nullもしくは空の文字列かを判断
                                                    //www.errorはダウンロード中にエラーが起きたときのメッセージ
            {
                var clip = www.GetAudioClip(false, true);   //最初のはクリップを2Dにする(false)3Dは(true)だと思う。よく分かってない。後の真偽はtrueならダウンロード中も再生。falseならダウンロードしてから再生
                audioSource2.clip = clip;
                //audioSource.Play();
                Debug.Log($"Play wav : {path}");
            }
            else
            {
                Debug.Log(www.error);
            }
        }
    }

 

 

 

    //再生、一時停止、停止、再開、完全に停止について

    /*
    // 再生 Play と、入力したら一回だけ再生
    private void Play(AudioClip audi)
        {
            audioSource2.PlayOneShot(audi);
            
    }
    */

    //  一時停止 Pauseと、入力したらichiziteishi2変数に2を入れて、一時停止
    private void Pause()
    {
        ichiziteishi2 = 2;
        audioSource2.Pause();
        
    }

    // 停止  Stopと、入力したら停止
    private void Stop()
    {
        audioSource2.Stop();
    }

    // 再開 UnPause と、入力したらichiziteishi2変数に1を入れて、再開

    private void UnPause()
    {
        ichiziteishi2 = 1;
        audioSource2.UnPause();

        //++++play2が再開するときは、playは一時停止する++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        pl.audioSource.Pause();
    }

 


}