unity 好きな画像で視線入力③ ひとまず動く

外部フォルダから画像をとってくる部分の

全コードを乗せます。

 

たまに寝落ちしながら書いているので、

間違ったことを書いていたら後日、コッソリ訂正しているかも

知れないことをご了承ください。

 

 

コードの前にこちらから。

Hierarchy

 

Assets

 

 

ima1Cuにimage1

ima2Cuにimage2 をくっつけています。

 

ima という名前のマテリアルは、ima1Cuにもima2Cuにもくっついています。

 

そのマテリアルは

こうなっています。

 

 

・・・

以下、image1のコードです。

 

ずっと前から書いていますが、

絶対こんなにusingいりません。

そのうち、いつか分からないそのうち、取捨選択します。

 

 

using UnityEngine;
using System.Collections;

using UnityEngine.Networking;
using UnityEngine.UI;

using System;

using System.IO;
using System.Text;
using System.Linq;
using System.Collections.Generic;

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

 

public class image1 : MonoBehaviour
{
    private string url = "C:/image/1.png";

 


    IEnumerator Start()
    {

        WWW www = new WWW(url);

        yield return www;   //関数から抜けずに、一旦停止して値を返す。

        Renderer rend = GetComponent<Renderer>();   //コンポーネントの<Renderer>(描画するプログラム的な)をrendで表す
        rend.material.mainTexture = www.texture;    //テクスチャーの設定はRendererに設定されているMaterialインスタンスに用意されている。テクスチャーイメージの設定はmainTectureというプロパティとして用意されていて、テクスチャー情報が保管されている。

    }

}

 

 

・・・以上・・・

 

 

image2のスクリプトは最初の方の2か所

 

public class image2 : MonoBehaviour
{
    private string url = "C:/image/2.png";

 

だけが違っていて、あとは全く同じです。

 

 

Cの中のimageフォルダ内の1とか2という名前のpngファイルを

画像として取り込んでいます。

 

 

 

 

 

unity 好きな画像で視線入力② 逆さまが治る・背景も透明になる

前の続きです。

 

↑このように、InspectorのRotationのYを180にして、裏表を逆にしました。

 

画像が逆さまじゃなくなりました。

良かった。

 

 

外部画像を貼り付けるCubeを二つ作りました。

一番下の二つが、外部の画像を貼り付けられるCube

(上の1Cuと2Cuは、画像の背景になるCube)

 

貼り付けました。

 

不思議です。

犬は背景(犬の周りが白い)があるのに、りんごは無い。

 

もう一度、愛用してやまない

かわいいフリー素材集 いらすとや (irasutoya.com)

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

あ、大丈夫でした。

 

 

背景ありの画像との違いですが、

背景あり犬を貼ったときは、ima1CuのInspectorはこうでした↓

 

それを、いろいろ調べて、こうしました。



 

最初はMaterialは変更できないのですが、Assetsの中にMaterialを作って、

Cubeにくっつけると触れるようになりました。

 

Shaderを変更すると、透明な背景になりました。

 

・・・・

 

と、いう話が本当かどうか

(本当にMaterialのShaderを変更したことが原因で背景が透明になったのか)

ちゃんと確認したくて、

いろいろMaterialをいじっていたら、

透明にならなくなってしまいました。

 

・・・

 

直りました。

背景の黒が消えました。

 

さっき、背景が黒かったときは間違って↓こうしてました。

Diffuseの前のTransparentがありません。

 

やっぱりMaterialは背景を透明にするのに重要みたいです。

 

 

こちらのサイト様を参考にさせて頂きました。

【Unity】透過処理された画像をUnityで透過した状態で適用する方法 | とんプログラミング (sincoston.com)

 

 

 

unity 好きな画像で視線入力① さかさま

以下の目標を達成しました。

 

①wavにも対応するようにする

 

③今は見る画面が1個なので、2個画像を並べて、

 それぞれ見ると、それぞれ登録した音が鳴らせるようにする。

 

 

次は

②画像を好きに入れ替え出来るようにする。
 今は青と赤だけ。

 

です。

 

これは、以下を参考にさせていただき、すぐに出来ました。

【UNITY】WWWクラスで通信を行おう!画像やデータを取ってこよう | 侍エンジニアブログ (sejuku.net)

 

なぜか逆さまです。

 

犬が逆さまです。

あと、当たり前と言えば当たり前だったんですが、

画像として貼り付けたから、犬の背景は画像の背景のまま。

つまり、この画像で言うと、少し暗い白(グレー?)のまま。

 

りんご や バナナ 

みたいに、

「果物の周りは全部透明色」、の訳はありませんでした。

 

 

今回のコードは

using UnityEngine;
using System.Collections;

using UnityEngine.Networking;
using UnityEngine.UI;

using System;

using System.IO;
using System.Text;
using System.Linq;
using System.Collections.Generic;

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

 

public class image1 : MonoBehaviour
{

    private string url = "C:/image/1.png";

    IEnumerator Start()
    {

        WWW www = new WWW(url);
        yield return www;
        Renderer renderer = GetComponent<Renderer>();
        renderer.material.mainTexture = www.texture;

    }

}

 

ついに、using の行数と、中身の行数、どっちが多いか分からなくなりました。

後でいらないものは消します。

 

この他に、画像を外部から取ってくる方法は

調べるといくつもみつけることが出来ましたので、

いろいろやってみたいと思います。

 

そのうち、動画も貼り付けたいと思いそうなので、

その辺りからも探してみようと思います。

 

一旦、今日はここまで。

 

 

 

 

 

画像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();
    }

 


}

 

 

 

 

 

 

 

 

 

 

 

画像2個、それぞれ見たら違う音が鳴る④ 二つのスクリプトで連絡を取り合うことに成功

なぜか、一つのスクリプトで二つのCubeを操作できるように

ならないと、という思いにかられていましたが、

 

二つのスクリプトでそれぞれのCubeを見て、音を鳴らすことが出来たので、

スクリプト同士で、お互いの状況を連絡し合うことが出来たら

良いのでは?と、思い調べました。

 

【Unity C#】他のスクリプトの変数を取得する - プログラミング教室 フタバゼミ (futabazemi.net)

 

こちらのサイト様にはいつも大変お世話になっております。

 

・・・

 

お互いの再生状況を連絡とり合うことに成功しました。

 

こんな感じのHierarchy

 

りんごを見ているので画面が赤くなっています。

 

 

 

バナナ側のスクリプトです。名前はplay2です。

 

private GameObject cu1Object;

play pl;

これはりんご側のことを書いています。

 

それから、

public AudioSource audioSource2;

にしました。

「audioSource」 のままだと、play(りんご側のスクリプト)と同じ名前なので。

 

結局使いませんでしたが、ichiziteishi も

名前がかぶっているので最後に2をつけて被らないようにしました。

 

 

下の方に、

こういう感じで書きました。

cu1Object = GameObject.Find("1Cu");

これは、オブジェクトの名前をそのまま1Cuと書いています。

 

pl = cu1Object .GetComponent<play>();

りんご側のスクリプトをplで表すと最初に書いていたので、

左辺はこんな感じになっています。

 

他にもいろいろやりましたが、全部うまく行ったら

また、全プログラムを乗せようと思います。

 

 

 

 バナナ側のスクリプトに、リンゴ側のaudioSourceが再生中かどうか

記述するコードを追記して、ちゃんと

 

再生中には「再生しています」

停止中には「停止しています」

 

と表示されました。

 

 

flgは「視線入力がtrueなら」

または

「マウスが押されたら」

文が表示されます。

 

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

{

//////いろいろ書いてある////////

 

            if (!pl.audioSource.isPlaying)
            {
                Debug.Log("りんごオーディオソース停止しています");
            }
            else
            {

                Debug.Log("りんごオーディオソース再生しています");
            }
           

}

 

うまく行きました。

 

 

 

そこで、最初のifの中をこのようにしました

↑文字で打つと文字化けしたので画像です。

 

視線入力がtrue または マウスが押された

 

かつ

 

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

 

これはエラーが出ました。

なんでだろう?

 

・・・

単純なミスでした。

いろいろ触ってるうちに、先に書かないといけない

 

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

 

が後の行に来ていました。

 

 

 

・・・・・・

 

あ・・・

 

勘違いしていました。

これは、りんごが鳴っている間は、いくらバナナを見ても鳴らさない。

というコードが出来てしまっている。

 

そうじゃない。

りんごが鳴っているときでも、バナナを見たら

バナナが鳴って、りんごを止めないといけないんだった。

 

ちょっといろいろ触り直します。

 

 

 

 

 

 

 

 

Unity よくクラッシュする

最近、よくクラッシュします。

 

Unityは2019.4.1f1です。

 

メモリが原因ということもあるらしいので、調べてみると

 

なんと8GB中、6.7GB使っていました。

 

ふとしたことで、簡単に超えてしまいそうです。

 

理想のメモリ容量は16GBらしいという記事もいくつかありました。

 

メモリ使用の内訳をみると、一番使っていたのはGoogleChromeでした

二番はUnity。

そして三番はUnityHubだったので、これは閉じておこうとおもいます。

 

Google chromeからMicrosoft edgeに変えてみます。

調べながらするので、ブラウザは必須なのですが、

Google chromeの方が慣れているので、ずっと使っていました。

 

そのうち、メモリ増設も検討しようかな・・・。

 

メモ:

メモリの調べ方はタスクマネージャーの

パフォーマンスから簡単に調べられます。

 

タスクマネージャーは

Ctl+ALT+DEL

から簡単に出せます。

 

 

画像2個、それぞれ見たら違う音が鳴る③ 別々のスクリプトなら鳴る。かぶるけど。

クラッシュから、なんとか前と同じ位置まで持ってこれました。

 

クラッシュ後に再起動する前なら

前にしていたところまで戻せる方法があったようですが、

知らずに再起動してしまいました。

 

何度かクラッシュしてるので、また起きたらやってみよう。

 

 

別々のスクリプトをそれぞれの画像(の後ろにあるCube)に持たせたら

問題なく動きます。

 

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

同時に鳴ってしまいます。

 

これを避けるためには、同一のスクリプトを使うしか無いんじゃないかと

思っています。

 

結構難しそうです。

 

外部ファイルから画像を読めるようにするのとどっちが先に出来そうかな・・・

 

今日はこの辺で。

 

明日からは更新ペースはゆっくりになると思います。