unityで視線入力アプリに録音機能をつけたい① まずは簡単なアプリから(長期Unityから離れた未来の自分へ懇切丁寧な説明)

以前に立てた目標に全く無い物を作ろうとする

タイトルになってきました。

 

絵を見たら音が鳴るアプリですが、

今のところ音はフリーサイトにお世話になっています。

 

ダウンロードしてきて指定のフォルダに入れて・・・

ということをしています。

 

自分の声をスマホで録音したものは

ファイル形式がwav や mp3 じゃないので

変換するというひと手間がかかっています。

 

そこで、アプリに録音機能をつけたいと思います。

調べるとかなり複雑そうですが、

やってみます。

 

そのまま欲しい情報のあるサイトを見つけました。

 

Unity上で音声を録音し、録音したデータをWavファイルに保存するコードと、録音したWavデータを再生するコード · GitHub

 

しかし、エラーが修正できません。

 

なお、最初は

 

using MiniJSON;

 

にもエラーが出て、どうしようかと思いましたが、

以下のサイトの通りにすると消えました。

 

[Unity] MiniJSON 使って json 読み込み - Qiita

分かりやすかったです。

 

それ以外のエラーも

きっと分かっている人には

 

なんだ、これか

 

な、ことな気がするのですが、

自分にはまだ早かったかと思い、簡単なアプリの作り方を調べました。

 

徐々にレベルアップを目指します。

 

簡単なアプリの作り方サイトありました。

 

Unityで録音アプリを作成 - YKpages (hatenablog.com)

 

なんて素敵。

簡単に録音再生ができました。

 

でも、このサイトのやり方でも

きっとunityはじめた頃ならできなかっただろうと思ったので

ここに作り方を残したいと思います。

 

未来のどこかで

長い間unityから離れて久しぶりにやろうと思った自分向けに

懇切丁寧に書きます。

 

Hierarchyを右クリックしてUI→Button を選び、

3つ作る。

できたオブジェクトを右クリックして

Renameを選べば名前を変えられる。

 

 

 

各ボタンの左の▶をクリックすると

 

下にTextが出てくるのでそれを選択して

inspectorを見ると

ボタンの表示名を変えられる。

 

次に、からっぽのオブジェクトをHierarchyで作る。

Create Empty を選ぶと

GameObjectが出来る。

 

上記サイトのコードを

コピーペーストした

スクリプト(ファイル名はMyRecordingにする)を作る。

 

作り方は

Assets内で右クリックして

↑これらを選択したら作れます。

 

 

 

こうして作った

MyRecording.csをGameObjectまでドラッグして

手を離す。

 

GameObjectを選んでinspectorを見ると

My Recordingというスクリプト

加えられている。

 

あと、その下にある

このボタンを押して、

Audio Sourceを加える。

 

 

次に、

各ボタンを選んでinspectorを見ると

On Click()というとこがあるので下の+をおすと

四角い枠が3つぐらい現れる。

↓のように、左の下側の枠に、HierarchyからGame Objectをもってきて放す。

右の枠からいろいろ選べるようになるので

My Recordingを選び、

またいろいろ出てくるから

StartButton()を選ぶ。(スタートボタンを選んだ時は)

以下、エンドボタン、プレイボタンでも同様に

My Recordingを選び、それぞれ

EndButton()

PlayButton()

 

を選ぶ。

 

以上。

 

起動して、

スタートボタンを押して 何かしゃべる

エンドボタンを押して、 終了

プレイボタンを押して、 再生

 

 

となりました。

 

 

 

 

 

 

視線の注視時間を後から入力する④ やっとセーブできた

保存まであと一歩っぽいのですが、、、

一度、よく分からないまま

ビルド後も値を保存できた瞬間があったのですが、

 

他を直していると出来なくなってしまいました。

 

↓こちらとか分かりやすいのですが

Unity - PlayerPrefs:変数を保存する - - ひとりでのアプリ開発 - fineの備忘録 - (hatenablog.com)

 

・・・

 

ということで何時間経っただろう。

 

やっと出来ました。

 

【Unity入門】スコアを保存!コピペで終わるPlayerPrefsの実装方法 | 侍エンジニアブログ (sejuku.net)

こちらを参考に、一度

まっさらなプロジェクトを作って

動くことを確認して、それから

なんだかんだとして・・・

 

 

 

疲れたので該当部分のコードだけ貼ります。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //UIを扱う

public class InputText : MonoBehaviour
{

    //文字エリアを非表示にするために必要
    public GameObject mojihyoji;
    public GameObject keyhelp;

    //視線入力がONになるまでの注視時間
    public float num;

    //スタート時か、数字を一回以上チェンジさせたか
    public int TimeChange = 0;

    //InputFieldの上に貼ってあるUIのtextに何を表示するか
    public Text textarea; //テキストエリア


    //前回の視線入力の時間をinputfieldに表示するのに必要
    private InputField inputFieldbox;

    //保存した数値
    //   public float hozon1;
    public float shisentimehozon;
  //  public float hozon3;


    void Start()
    {
        //まだ起動後は一度も数字を変えていない
        TimeChange = 0;

        //ロードする
        shisentimehozon = PlayerPrefs.GetFloat("shisentimehozon", 0);

        //   hozon1 = PlayerPrefs.GetFloat("hozo1", 0);
        //   hozon3 = PlayerPrefs.GetFloat("hozon3", 0);


        //Debug.Log("hozon1は" + hozon1);
          Debug.Log("shisentimehozonは" + shisentimehozon);
        //Debug.Log("hozon3は" + hozon3);

        //ロードした値をtextに表示させる
        textarea.text = shisentimehozon + "秒、見てね";

        //ロードした値をnumに入れる
        num = shisentimehozon;

        //前の値を表示する
        string strnum = num.ToString();     //numはfloatなので、stringに変える必要がある

        inputFieldbox = GetComponent<InputField>();
        inputFieldbox.text = strnum;

        //前の値を表示する


        //文字エリアを非表示にするために必要
        mojihyoji = GameObject.Find("mojihyoji");
        keyhelp = GameObject.Find("keyhelp");
    }

    

    //InputFieldに文字を入れるたびに呼び出される
  
    public void ValueChange(string text)           //InputFieldに入れた文字を text として string型で扱っていく
    {
        //数字を一度でも買えたら1にする
        TimeChange = 1;

        if (TimeChange == 1)
        {

            if (text != "")     //もしInputFieldが空でないなら
            {

                //後で入力したtextをfloat型の数値として使いたい
                //こうすると予想外の入力にもクラッシュしない
                float.TryParse(text, out num);
                Debug.Log($"nummitenai: {num}");


                //↓これでstringをfloatに変換すると、例えば小数点をいきなり入力すると落ちてしまった
                //num = float.Parse(text);

                if (num <= 0)
                {
                    //文字表示を以下のように変える
                    textarea.text = "0より大きい数を入れてね";

                    /*
                    Debug.Log("数字" + num);
                    PlayerPrefs.SetFloat("hozo1", num);
                    PlayerPrefs.Save();
                    */


                }
                else if (num > 0)
                {
                    //文字表示を以下のように変える
                    textarea.text = text + "秒、見てね";
                    hozon();
                


                }

                else
                {
                    //文字表示を以下のように変える
                    textarea.text = "0より大きい数を入れてね";

                    /*
                    Debug.Log("数字" + num);
                    // スコアを保存
                    PlayerPrefs.SetFloat("hozo3", num);
                    PlayerPrefs.Save();
                    */
                }

 

            }
            else    //もしInputFieldが空なら
            {

                textarea.text = "注視時間を入力してね";

                /*
                Debug.Log("数字" + num);
                */

            }
        }

        
    }


    private void hozon()
    {
        // スコアを保存
        PlayerPrefs.SetFloat("shisentimehozon", num);
        PlayerPrefs.Save();

    }

   

   void Update()
    {

   

        if (Input.GetKeyDown(KeyCode.Y))
        {
            if (transform.localScale == Vector3.one)
            {
                // 非表示
                transform.localScale = Vector3.zero;
                mojihyoji.transform.localScale = Vector3.zero;

            }
            else
            {
                transform.localScale = Vector3.one;
                mojihyoji.transform.localScale = Vector3.one;
            }
        }

 

        if (Input.GetKeyDown(KeyCode.H))
        {
            if (keyhelp.transform.localScale == Vector3.one)
            {
                // 非表示
                keyhelp.transform.localScale = Vector3.zero;

            }
            else
            {
                keyhelp.transform.localScale = Vector3.one;
            }
        }

 

 

    }
}

 

 

該当しそうなところを赤にしましたが、

半分、脳が休んでいるので

抜けやらいろいろあるかも知れません。

 

赤で囲んだところがInputFieldです。

このinspectorは

 

こうです。

多分、Mojihyojiのとこは何も入れてなくても良いような気が・・・。

でも壊れると嫌なのでこのままにしています。

 

テキストなどは配置しただけです。

Hierarchyはこうです。

keyhelpは左上の長い文です。

kaenaimohihyojimitenaiは右下の二行ぐらいの文です。

 

mojihyozi が 左側のInputFieldの上に表示されており、

入力内容に合わせて表示が変わります。

 

mohihyozimitenaiは右のInputFieldの上の表示です。

 

 

今回、配置も可能な範囲で整えてみました。

 

[Unity]直感的にわかりにくいアンカーの仕組みを徹底解説 | hirokuma.blog

 

こちらが分かりやすかったです。

Pivotのことがよく分かったのが特にありがたかったです。

 

 

keyhelpのinspectorです。

アンカーを左上にしています。

Pivotでxを0にして、文の左端を基準に

yが1で、右端が基準です。

 

尚、0.5だと半分、つまり中心が基準。

割合なんですね。

 

今日はここまで。

 

これが出来たら、もしかしたら

サイズや位置の保存も夢ではない気がします。

 

 

 

 

視線の注視時間を後から入力する③ 文字入力の表示非表示など

視線入力の時間を入れる

InputFieldなどのUIですが、

あると視線入力の邪魔になることもあるので

消せるようにしました。

 

参考にしたのはこちら↓

Unityでモデルを非表示にする | 生存日記 (wordpress.com)

 

消し方にもこんなにいろいろあるのかと勉強になりました。

このうち、

スケールを0にする

を採用いたしました。

 

Yキーを押すと消えるようになりました。

 

Yを押すと

消える。また押すと出てきます。

 

ところで、さっきまであったボタンですが、削除しました。

今までずっとキー入力だけでやってきたので

ここでボタンを増やすより、

出来るとこまでキーボードからの入力でやりきろうかなと。

 

 

あと、これまで長い間

 

音の停止は2

一時停止は1

 

を押すようにしてきましたが、

視線入力の時間を入れるときに

時間で1を入れたいのに流れていた音楽が

一時停止するなど不便だったので

これもキーを変えました。

 

停止はT

一時停止はI

 

です。

停止、一時停止の

ローマ字の頭文字です。

 

 

本当は

 

停止はstopのS

一時停止はPauseのP

 

が格好良かったかもと後になって思いましたが

変えてしまったのでこのままいきます。

 

後、同じ要領で

視線はずれを何秒まで許容するかについても

入力する枠を作りました。

 

できるだけ設定しないといけないところは

少なく少なくしたかったのですが、

これだけは、もしかしたらニーズが出てくるかも

 

と思ってInputFieldを作りました。

 

あと、キー入力で設定を変えるところが増えたので

説明の文章を作りました。

 

見にくかったので

アウトラインを

uGUIでテキストにアウトラインをつける方法 - 脳汁portal (hatenablog.com)

こちらを参考につけました。

 

 

 

今、お試しでいろんな入力をしていて

気付きました。

 

InputFieldに小数点などいくつかのキーを入れると

落ちます。

【Unity,C#】型変換のときに例外でも止めずに実行を続ける(TryParse) - はなちるのマイノート (hanachiru-blog.com)

↑こちらですぐに解決しました。

 

インターネット上の皆様、ありがとうございます。

 

  if (text != "")     //もしInputFieldが空でないなら
        {

            //後で入力したtextをfloat型の数値として使いたい
            //こうすると予想外の入力にもクラッシュしない
            float.TryParse(text, out num);
            Debug.Log($"nummitenai: {num}");


            //↓これでstringをfloatに変換すると、例えば小数点をいきなり入力すると落ちてしまった
            //num = float.Parse(text);

            if (num <= 0)
            {
                //文字表示を以下のように変える
                textarea.text = "0より大きい数を入れてね";
            }
            else if (num > 0)
            {
                //文字表示を以下のように変える
                textarea.text = text + "秒、見てね";

                Debug.Log("数字" + num);
            }

            else
            {
                //文字表示を以下のように変える
                textarea.text = "0より大きい数を入れてね";
            }

 

        }
        else    //もしInputFieldが空なら
        {

            textarea.text = "注視時間を入力してね";

            
        }
    }

 

こんな感じです。

 

Buildしてみました。

概ね良好ですが、

数字がやはりビルド後に変えた数を記憶してくれないようです。

 

きっと何か方法があるんだろうなあ・・・

 

 

 

 

 

視線の注視時間を後から入力する② 前回の注視時間を記憶して起動時に表示する

続きです。

 

InputFieldのinspectorを一部変えました

 

小数の数字のみ受け付けるようにしています。

 

こちら↓を見れば、今後悩むことは無さそうです。

【Unity】Input Fieldの入力形式を制限する | ねこじゃらシティ (nekojara.city)

 

play.csに

public class play : MonoBehaviour
{
   

・・・・・

    //何秒見ていたら音を鳴らすかを取得するのに必要
    public GameObject inputfield;
    InputText inputtext;
    //何秒見ていたら音を鳴らすかを取得するのに必要

 

・・・・・

 

private void Start()
    {

     ・・・・・

        //何秒見ていたら音を鳴らすかを取得するのに必要
        inputfield = GameObject.Find("InputField");
        inputtext = inputfield.GetComponent<InputText>();
        //何秒見ていたら音を鳴らすかを取得するのに必要

 

・・・・・

 

 

  if (notmiterutime == 0) //見ているあいだ (見ていない時間がカウントされていない)
        {


            if (miterutime < inputtext.num && miterutime != 0)       //見ている時間が規定時間を超えてない
            {

                //+++++++++++++++++++++++++++++++++++++++++++++@@
               // Miteimasu = 1;      //見ているが時間が足りてない
                //+++++++++++++++++++++++++++++++++++++++++++++@@
                gameObject.GetComponent<Renderer>().material.color = Color.magenta;


            }

            else if (miterutime >= inputtext.num)       //見ている時間が規定時間を超えた
            {

 

 

これぐらいを変更して、うまく行きました。

 

次は、これを保存できるようにします。

 

以前の記事

Unity 画像サイズの変更③ 値を保存 素晴らしいアセットと位置を動かす - 支援機器やアプリなどのメモ (hatenablog.com)

このやり方が使えるかな?

 

・・・

 

出来ました。

なんて素敵。

 

サイトに記載されていた

最初に

エディタ再生中に変更した値をエディタ停止後もそのまま保持する属性【Unity】【エディタ拡張】【属性】 · GitHub

こちらからスクリプトを作成する過程は

前回のチャレンジで既に実施済みでした。

 

 

そして

 

public class InputText : MonoBehaviour
{
   ・・・・

 

   
    [PersistentAmongPlayMode]  //前回の視線入力の時間を記憶するために必要
    public float num;

 

と、書き加えただけです。

 

後は

public class InputText : MonoBehaviour
{
   ・・・・

  //前回の視線入力の時間をinputfieldに表示するのに必要
    private InputField inputFieldbox;

 

・・・・

 

 void Start()
    {
       
        //前の値を表示する
        string strnum = num.ToString();     //numはfloatなので、stringに変える必要がある

        inputFieldbox = GetComponent<InputField>();
        inputFieldbox.text = strnum;

        //前の値を表示する

 

 

と書き加えると

このように前回の数字が入力された状態で起動されました。

 

参考にさせていただいたのは以下です。

float型をstring型に変換できない (teratail.com)

 

uGUIのInputField - Qiita

 

 

 

視線の注視時間を後から入力する① テキストに入力した数字を受け取ったりいろいろする

指定した注視時間だけ見ると

音楽が鳴るように変えることが出来ました。

 

今度は、この時間を

起動後に指定できるようにしたい。

 

ということでやってみます。

 

・・・

 

あちらこちらのサイトを参考にしました。

 

【Unity C#】ボタンを押して入力テキストを表示させる (futabazemi.net)

 

UnityでInputFieldのテキストを取得する – Pelican Philosophy (peliphilo.net)

 

unityでInputFieldを使って数字を入力プログラム... - Yahoo!知恵袋

 

【Unity】全てのInputFieldが空でなければボタンを表示する (suzukaprogrammer.com)

 

 

このようになりました。

例えば、2.6とtextfieldに入力してボタンを押すと、

上のtextに文字が表示されます。

 

この後、ボタンを再度押したら

スタートできるようにしたいと思います。

 

また

空っぽでボタンをおしたら

入力を促すテキストを表示させて、

このときはボタンを押せないようにしようと思います。

 

ボタンに表示されている文字の切り替えをしました。

【Unity】Buttonを押した時にテキストを切り替える方法 - テクノモンキー(サブ) (hateblo.jp)

こちらが大変分かりやすかったです。

 

後、ボタンの色の変化はこちらが一目瞭然でした。

【Unity】【uGUI】状態によってボタンの色を変える - ヒナタ製作所 (hatenablog.com)

 

 

注視時間を入れなければボタンを押せなくしたかったので

それは↓こちらで一発でした!

【Unity】ボタンを非活性にする方法 | Unity Note (naoya-ono.com)

 

 

 

新しいことをいろいろやったので詳しく残します。

 

Hierarchyに加えたのは

UIの

・InputField

・Text

・Button

 

例えばTextならこうやって選びます。

Textという言葉をコード上いろいろ使うので

(ボタンの文字もボタンのtextだし・・・)

私はゴチャゴチャになってしまうので

オブジェクト名を大きく変えて

「mojihyoji」にしました。

 

Assetsに

 

を作り、

HierarchyのInputFieldにくっつけました。

 

中身はこうです。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //UIを扱う

public class InputText : MonoBehaviour
{
    //ボタンを押せるようにしたり押せ無くしたり、ボタンの文字を変えたりする
    public GameObject button;
   

  public float num;
    

    //InputFieldの上のtextに何を表示するか
    public Text textarea; //テキストエリア
                     
    Text buttonText = null;  // ボタンのテキスト

    void Start()
    {

        button = GameObject.Find("Button");
     
        // ボタンのテキストコンポーネントをキャッシュ
        buttonText = button.GetComponentInChildren<Text>();
        
        //最初はボタン押せなくしてある
        button.GetComponentInChildren<Text>().text = "入力するまで\n押せません";
        button.GetComponent<Button>().interactable = false;

        //最初に入力を促す文字を表示
        textarea.text = "注視時間を入力してね";

    }

 

 

    //InputFieldに文字を入れるたびに呼び出される
    public void ValueChange(string text)           //InputFieldに入れた文字を text として string型で扱っていく

    {

        if (text != "")     //もしInputFieldが空でないなら
        {
            //ボタンをアクティブにして表示を変える
            button.GetComponent<Button>().interactable = true;
            button.GetComponentInChildren<Text>().text = "これでOK";
           
            //後で入力したtextをfloat型の数値として使いたい
            num = float.Parse(text);

            //文字表示を以下のように変える
            textarea.text = text + "秒見てね";

            Debug.Log("数字" + num);
        }
        else    //もしInputFieldが空なら
        {

            textarea.text = "空だよ注視時間を入力してね";

            //ボタンを押せなくする
            button.GetComponentInChildren<Text>().text = "入力するまで\n押せません";
            button.GetComponent<Button>().interactable = false;

            
        }
    }


    public void Buttonoshita()
    {
        Debug.Log("入力数字はこれ" + num);
        Debug.Log("1を足すと" + (num+1));
    }
  }

 

HierarchyでInputFieldを選び、

inspectorを見ます。

 

ここ、変えました。

途中でいろいろ触ったときに、

全然うまくいかなくなってよく見たら

 

↓これを選んでました。これは間違い。

 

 

こっちが正しい

 

参考サイト様にちゃんと

こっちと分かるように書いてくれていたのに

触っているうちに思い込みでダメな方を選んでました。

 

後、スクリプトのとこはこうなってます。

 

 

 

今度はボタンです。

 

inspectorは

 

On Click()のところは

ボタンを押したときに


    public void Buttonoshita()
    {
        Debug.Log("入力数字はこれ" + num);
        Debug.Log("1を足すと" + (num+1));
    }

 

が働くようにしています。

ちゃんと数字で取得できているか確認の為足し算をしています。

成功していました。

 

colorのところは好きに入れました。

触らなくても良いのですが、色が変わった方が分かりやすそうなので。

 

一旦、ここまで。

 

 

指定した時間みたら視線入力を受け付ける⑤ 出来たのでコード

久しぶりに Markdownでコードを入れてみます。

なんとなく 見たままコピーペーストしても差し支えないように思って 最初少しやっただけで止めておりました。

今回、長そうなので(いつも長いけど) やってみます。

play.cs

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

public class play : MonoBehaviour
{
    //キーをおしたら視線入力をうけつけるために必要
    public int keyoshitarastart;
    //キーをおしたら視線入力をうけつけるために必要


    //サイズと位置変更のため必要 この背景に乗っている画像の状態を知る
    public GameObject ima1Cu;
    image1 image1;
    //サイズと位置変更のため必要


    //隣を見たら音を止めるために必要 隣の背景の方の状態を知る
    public GameObject back2Cu;
    play2 pl2;
    //隣を見たら音を止めるために必要


    //隣を見たら音を止めるために必要 隣の背景の方の状態を知る
    public GameObject back3Cu;
    play3 pl3;
    //隣を見たら音を止めるために必要




    public AudioSource audioSource;


    ///////////////////////////////////////////

    string otoPath = "C:/オリジナル視線アプリ/音はここ/1";


    ///////////////////////////////////////////


    //注視情報
    private GazeAware gazeAware;

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


    Vector3 screenPoint;
    Vector3 offset;


    //////+++++++++++++++注視する時間を変えるために必要
    float miterutime = 0f;         //視線がそれていない時間のカウント
    float notmiterutime = 0f;     //視線がそれている時間のカウント

    public int Miteimasu;       //見ていない0 見ている 4 (いらなかったけど、設定としては 見ているけど3秒未満は1 見ていたけど逸れているは3 )

    //////+++++++++++++++注視する時間を変えるために必要


    //オブジェクトをドラッグする処理
    void OnMouseDown()
    {
        //カメラの座標を画面座標系で取得
        this.screenPoint = Camera.main.WorldToScreenPoint(transform.position);
        //アタッチしたオブジェクトの座標と画面内のタッチ座標との差分を求める(2つの座標の間のベクトルを求める)
        this.offset = transform.position
          - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    }

    void OnMouseDrag()
    {
        //移動したマウスの座標を代入
        var currentScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
        //移動したマウス座標をワールド座標へ変換し,先ほど求めた offset を適用してアタッチしたオブジェクトの座標に直す
        var currentPosition = Camera.main.ScreenToWorldPoint(currentScreenPoint) + this.offset;
        //セットする
        transform.position = currentPosition;

        ima1Cu.GetComponent<image1>().Posihenkoimage1();
    }






    //位置を変えるため必要
    public void Posihenkopl()
    {
        this.transform.position = image1.transform.position;        // image1.csのpositionを自分のpositionにする。
    }




    private void Start()
    {

        //サイズ変更、位置変更のため必要
        ima1Cu = GameObject.Find("ima1Cu");
        image1 = ima1Cu.GetComponent<image1>();
        //サイズ変更、位置変更のため必要

        //隣を見たら音を止めるために必要
        back2Cu = GameObject.Find("back2Cu");
        pl2 = back2Cu.GetComponent<play2>();
        //隣を見たら音を止めるために必要

        //隣を見たら音を止めるために必要
        back3Cu = GameObject.Find("back3Cu");
        pl3 = back3Cu.GetComponent<play3>();
        //隣を見たら音を止めるために必要


        //値を保持できるならスタート時に↓前の値を読むけど、保持できないから消しても良いか。。。
        this.transform.localScale = new Vector3(image1.xScale + 150, image1.yScale + 150, 1.0f);

        //視線入力をうけつける前はグレイ
        gameObject.GetComponent<Renderer>().material.color = Color.gray;



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

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

        //キーをおしたら視線入力をうけつけるための変数。うけつけないときは0。うけつけるときは1にする。
        keyoshitarastart = 0;


        //////+++++++++++++++注視する時間を変えるために必要
        miterutime = 0;
        notmiterutime = 0;
        Miteimasu = 0;
        //////+++++++++++++++注視する時間を変えるために必要
        ///

        ///////////////////////////////////////////
        //Stringの配列に音のファイルを入れていく。  Pathmei   string otoPath = "C:/sound/1" 拡張子* を入れる
        string[] Pathmei = System.IO.Directory.GetFiles(otoPath, "*", System.IO.SearchOption.AllDirectories);


        if (!Pathmei.Any())
        {
            Debug.Log($"{nameof(Pathmei)}音フォルダ1は空です。");
        }
        else
        {



            string file = Pathmei[0];   //配列の一個目(0番)をfileに入れる。

            //拡張子の出力
            Debug.Log(Path.GetExtension(file));  //配列の一個目(0番)、つまりfile の拡張子をLogに書き出す。

            //ファイル名の出力
            Debug.Log(Path.GetFileNameWithoutExtension(file));  //ついでに配列の一個目(0番)、つまりfile のFile名をLogに書き出す。いらないけど、後でいるかも知れないから書いた。



            if (Path.GetExtension(file).Contains("mp3"))  //もし、配列の一個目(0番)、つまりfile の拡張子がmp3なら
            {


                otoPath = Pathmei[0];       //otoPathにもし、配列の一個目(0番)、つまりfileを入れる。


            }
            else if (Path.GetExtension(file).Contains("wav"))  //もし、配列の一個目(0番)、つまりfile の拡張子がwavなら
            {

                var wavPath = Pathmei[0];    // 下の方の if (File.Exists(otoPath)) ・・・  により、Application.temporaryCachePath内にconverted.wavという名前で保存

                StartCoroutine(PlayWav(wavPath));       // 下の方のIEnumerator PlayWav(string path) ・・・より、PlayWavは関数名。これをここでスタートする。

            }
            else
            {
                Debug.Log($"どっちもないよ:{0}");      //mp3もwavも無いときのLog
            }

        }


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


    }



    //サイズ変更のため必要 image1のサイズを基準にしている。背景は画像より150大きい
    public void ScaleUp()
    {
        this.transform.localScale = new Vector3(image1.xScale + 150, image1.yScale + 150, 1.0f);
    }

    public void ScaleDown()
    {
        this.transform.localScale = new Vector3(image1.xScale + 150, image1.yScale + 150, 1.0f);
    }






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

        var bytes = File.ReadAllBytes(otoPath);     //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()
    {
        Debug.Log("スタートしてすぐのupdate" + keyoshitarastart);

        //xキーをおしたら視線入力をうけつける
        if (Input.GetKeyDown(KeyCode.X))
        {
            if (keyoshitarastart == 0)
            {
                Debug.Log("xおした" + keyoshitarastart);
                keyoshitarastart = 1;
            }
            else
            {
                Debug.Log("xおした" + keyoshitarastart);
                keyoshitarastart = 0;

                //視線入力をうけつけないとき
                gameObject.GetComponent<Renderer>().material.color = Color.gray;
                //鳴ってた曲も止める
                Pause();
            }

        }

        if (keyoshitarastart == 1)
        {

            keyoshita();
        }


        // マウスの左ボタンを推した場合も再生・・はやめた。画像移動のときにも鳴ってしまう。


        /*
        以下にあったコードはぜんぶ、
        public void keyoshita()の中に移動した
        */




    }

    //ストリーミング再生する
    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);
            }
        }
    }



    public void keyoshita()
    {
        //オブジェクトを注視していたらTrue
        bool flg = gazeAware.HasGazeFocus;

   
        if (flg || ima1Cu.GetComponent<image1>().gazeAware.HasGazeFocus)       //もし見ているなら

      

        {
            //////+++++++++++++++注視する時間を変えるために必要
            notmiterutime = 0;

            //見ている時間をカウント
            miterutime += Time.deltaTime;           //毎フレームの時間を加算.
            Debug.Log("見てますTime : " + miterutime);
            notmiterutime = 0;
            //////+++++++++++++++注視する時間を変えるために必要

        }
        else
        {
            
            //みていない時間をカウント
            notmiterutime += Time.deltaTime;
         //   Debug.Log("見てませんTime : " + notmiterutime);

          

        }



            

        if (notmiterutime == 0) //見ているあいだ (見ていない時間がカウントされていない)
        {


            if (miterutime < 1.5 && miterutime != 0)       //見ている時間が規定時間を超えてない
            {

                //+++++++++++++++++++++++++++++++++++++++++++++@@
               // Miteimasu = 1;      //見ているが時間が足りてない
                //+++++++++++++++++++++++++++++++++++++++++++++@@
                gameObject.GetComponent<Renderer>().material.color = Color.magenta;


            }

            else if (miterutime >= 1.5)       //見ている時間が規定時間を超えた
            {
                //+++++++++++++++++++++++++++++++++++++++++++++@@
                Miteimasu = 4;      //見ていると判断されている
                //+++++++++++++++++++++++++++++++++++++++++++++@@
                gameObject.GetComponent<Renderer>().material.color = Color.red;

                //見ているタイムをリセット
                miterutime = 0;

            }

        }
        else if (notmiterutime > 0.1)      //見ていない時間が規定時間を超えたら                         
            {
          
                //+++++++++++++++++++++++++++++++++++++++++++++@@
                Miteimasu = 0;      //見てない
                //+++++++++++++++++++++++++++++++++++++++++++++@@
               gameObject.GetComponent<Renderer>().material.color = Color.blue;

              //見ているタイムをリセット
                 miterutime = 0;

        }
         else                 //見ていない時間が規定時間を超えていないなら

            {
                //+++++++++++++++++++++++++++++++++++++++++++++@@
                //Miteimasu = 2;      //今見てないだけ
                //+++++++++++++++++++++++++++++++++++++++++++++@@
              gameObject.GetComponent<Renderer>().material.color = Color.magenta;
        }

        




        if (!audioSource.isPlaying && Miteimasu == 4)  //再生中で無い、かつ Miteimasu が 4(規定時間以上見たとき)なら
        {

            //一時停止関数がもし2(一時停止中)なら
            if (ichiziteishi == 2)
            {
                //再開してください(同時にichiziteisi変数は1になる)
                UnPause();
                miterutime = 0;     //再生されるたびに、見ていた秒数をリセットする。

            }

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

                //++++playが再生されるときは、他のCubeの音は一時停止する++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                pl2.audioSource2.Pause();
                pl3.audioSource3.Pause();

            }
            Miteimasu = 0;
        }




        // 停止

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

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

                Stop();
              //  miterutime = 0;     //見た状態で停止キーを押すと、見たままであればすぐに再生される。ここでmiterutime をリセットすると、見続けているのに停止したら規定時間見ないと再生されず違和感があった。

            }

        }


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

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

            }
        }


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

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

                UnPause();
                miterutime = 0;

            }
            Miteimasu = 0;
        }




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

    }



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

    /*
    // 再生 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が再生されるときは、他のCubeは一時停止する++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        pl2.audioSource2.Pause();
        pl3.audioSource3.Pause();

    }



}

ここまで。

以下からimage1.cs

using UnityEngine;
using System.Collections;
using System.IO;
using System.Collections.Generic;
using System.Linq;      //画像を入れる配列が空かどうか見るときのAnyにつかう
using Tobii.Gaming; //ライブラリの追加


public class image1: MonoBehaviour
{
    //サイズ変更のため ただし、back1Cuは位置変更にも使用
    public GameObject ima2Cu;       //////もう一個のimageオブジェクト
    public GameObject ima3Cu;
    public GameObject back1Cu;
    public GameObject back2Cu;
    public GameObject back3Cu;
    //サイズ変更のため ただし、back1Cuは位置変更にも使用


    [PersistentAmongPlayMode]       //記憶できるならこれがいる。位置やサイズは難しそうだけど・・・。
    public float xScale;            //この画像のx方向のサイズ。これを基準にみんな大きさを変える
    [PersistentAmongPlayMode]
    public float yScale;


    string imagePath = "C:/オリジナル視線アプリ/画像はここ/1";



    //位置を変えるために必要
    play pl;
    //位置を変えるために必要


    public GazeAware gazeAware;

    Vector3 screenPoint;
    Vector3 offset;

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++注視情報

    //オブジェクトをドラッグする処理
    void OnMouseDown()
    {
        //カメラの座標を画面座標系で取得
        this.screenPoint = Camera.main.WorldToScreenPoint(transform.position);
        //アタッチしたオブジェクトの座標と画面内のタッチ座標との差分を求める(2つの座標の間のベクトルを求める)
        this.offset = transform.position
          - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    }

    void OnMouseDrag()
    {
        //移動したマウスの座標を代入
        var currentScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
        //移動したマウス座標をワールド座標へ変換し,先ほど求めた offset を適用してアタッチしたオブジェクトの座標に直す
        var currentPosition = Camera.main.ScreenToWorldPoint(currentScreenPoint) + this.offset;
        //セットする
        transform.position = currentPosition;

        back1Cu.GetComponent<play>().Posihenkopl();
    }






    private void Start()
    {


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



        ima2Cu = GameObject.Find("ima2Cu");          //////もう一個のオブジェクトはima2Cuという名前のものです。ここではima2Cuという名前で使います//////
        ima3Cu = GameObject.Find("ima3Cu");
        back1Cu = GameObject.Find("back1Cu");
        back2Cu = GameObject.Find("back2Cu");
        back3Cu = GameObject.Find("back3Cu");



        //位置を変えるために必要
        back1Cu = GameObject.Find("back1Cu");
        pl = back1Cu.GetComponent<play>();
        //位置を変えるために必要

        StartCoroutine(gazouyomu1());       //IEnumerator gazouyomu1()  をここで実行。だと思う。


    }


    //位置変更のため必要
    public void Posihenkoimage1()
    {
        this.transform.position = pl.transform.position;
    }
    //位置変更のため必要

    /*
    public void ScaleUp()
    {
        this.transform.localScale = new Vector3(image1.xScale + 150, image1.yScale + 150, 1.0f);
    }
    */


    IEnumerator gazouyomu1()    //IEnumeratorはコルーチンを使うのに宣言するとき使う。gazouyomuは関数名。
                                   //コルーチンは好きな場所で処理を止めたり再開したりできる機能
    {
        string[] Pathmei = System.IO.Directory.GetFiles(imagePath, "*", System.IO.SearchOption.AllDirectories);




        if (!Pathmei.Any())                                     //もしPathmeiという名前の配列に何も入っていなかったら 画像を入れるフォルダ内が空だったときのエラー対策
        {
            Debug.Log($"{nameof(Pathmei)}画像フォルダ1は空です。");
            this.GetComponent<Renderer>().material.color = new Color32(0, 0, 0, 0);
        }
        else
        {

           

            string file = Pathmei[0];   //配列の一個目(0番)をfileに入れる。
                                        //拡張子の出力
            Debug.Log(Path.GetExtension(file));  //配列の一個目(0番)、つまりfile の拡張子をLogに書き出す。


            WWW www = new WWW(Pathmei[0]);

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

            Renderer rend = GetComponent<Renderer>();
            rend.material.mainTexture = www.texture;


        }
    }


    //サイズの変更。この画像を基準にするから、このcsにだけ必要なコード。
    IEnumerator sizehenko()
    {


        this.transform.localScale = new Vector3(xScale, yScale, 1.0f);

        if (Input.GetKey(KeyCode.RightArrow))
        {
            xScale += 5f;
            this.transform.localScale = new Vector3(xScale, yScale, 1.0f);     /////このオブジェクトのサイズをxScaleとyScaleにする。
            ima2Cu.GetComponent<image2>().ScaleUp();                          /////ima2Cuのimage2.csのScaleUpをここで実行。という意味?
            ima3Cu.GetComponent<image3>().ScaleUp();
            back1Cu.GetComponent<play>().ScaleUp();
            back2Cu.GetComponent<play2>().ScaleUp();
            back3Cu.GetComponent<play3>().ScaleUp();


        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            xScale -= 5f;
            this.transform.localScale = new Vector3(xScale, yScale, 1.0f);     //////このオブジェクトのサイズをxScaleとyScaleにする。
            ima2Cu.GetComponent<image2>().ScaleUp();                          /////ima2Cuのimage2.csのScaleUpをここで実行。という意味?
            ima3Cu.GetComponent<image3>().ScaleUp();
            back1Cu.GetComponent<play>().ScaleUp();
            back2Cu.GetComponent<play2>().ScaleUp();
            back3Cu.GetComponent<play3>().ScaleUp();

        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
            yScale += 5f;
            this.transform.localScale = new Vector3(xScale, yScale, 1.0f);    //////このオブジェクトのサイズをxScaleとyScaleにする。
            ima2Cu.GetComponent<image2>().ScaleUp();                          /////ima2Cuのimage2.csのScaleUpをここで実行。という意味?
            ima3Cu.GetComponent<image3>().ScaleUp();
            back1Cu.GetComponent<play>().ScaleUp();
            back2Cu.GetComponent<play2>().ScaleUp();
            back3Cu.GetComponent<play3>().ScaleUp();

        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            yScale -= 5f;
            this.transform.localScale = new Vector3(xScale, yScale, 1.0f);     //////このオブジェクトのサイズをxScaleとyScaleにする。
            ima2Cu.GetComponent<image2>().ScaleUp();                          /////ima2Cuのimage2.csのScaleUpをここで実行。という意味?
            ima3Cu.GetComponent<image3>().ScaleUp();
            back1Cu.GetComponent<play>().ScaleUp();
            back2Cu.GetComponent<play2>().ScaleUp();
            back3Cu.GetComponent<play3>().ScaleUp();

        }
        yield return null;
        

    }



    //いつ、矢印キーをおしてもサイズ変更が行われるようにするためのもの。
    void Update()
    {
        //オブジェクトを注視していたらTrue
        bool flg = gazeAware.HasGazeFocus;

       

        StartCoroutine("sizehenko");



    }

}



以上です。

play.csは他のplay2.csとかもあまり変わりませんが、 image2.csやimage3.csとimage1.csはやや違うので、 image2.csも貼り付けておきます。

image2.cs

using UnityEngine;
using System.Collections;
using System.IO;
using System.Collections.Generic;
using System.Linq;      //画像を入れる配列が空かどうか見るときのAnyにつかう
using Tobii.Gaming; //ライブラリの追加

public class image2: MonoBehaviour
{

    //サイズ変更のため必要
    GameObject ima1Cu;
    image1 image1;
    //サイズ変更のため必要


    //位置変更のため必要
    public GameObject back2Cu;
    //位置変更のため必要


    string imagePath = "C:/オリジナル視線アプリ/画像はここ/2";


    //位置を変えるために必要
    play2 pl2;
    //位置を変えるために必要


    public GazeAware gazeAware;

    Vector3 screenPoint;
    Vector3 offset;


  


    //オブジェクトをドラッグする処理
    void OnMouseDown()
    {
        //カメラの座標を画面座標系で取得
        this.screenPoint = Camera.main.WorldToScreenPoint(transform.position);
        //アタッチしたオブジェクトの座標と画面内のタッチ座標との差分を求める(2つの座標の間のベクトルを求める)
        this.offset = transform.position
          - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    }

    void OnMouseDrag()
    {
        //移動したマウスの座標を代入
        var currentScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
        //移動したマウス座標をワールド座標へ変換し,先ほど求めた offset を適用してアタッチしたオブジェクトの座標に直す
        var currentPosition = Camera.main.ScreenToWorldPoint(currentScreenPoint) + this.offset;
        //セットする
        transform.position = currentPosition;

        back2Cu.GetComponent<play2>().Posihenkopl2();
    }



    //位置変更のため必要
    public void Posihenkoimage2()
    {
        this.transform.position = pl2.transform.position;
    }
    //位置変更のため必要







    private void Start()
    {

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


        //サイズ変更のため必要
        ima1Cu = GameObject.Find("ima1Cu");
        image1 = ima1Cu.GetComponent<image1>();
        
        //サイズ変更のため必要
        

        //位置変更のため必要
        back2Cu = GameObject.Find("back2Cu");
     
        pl2 = back2Cu.GetComponent<play2>();
        //位置を変えるために必要


        //位置変更のため必要


        StartCoroutine(gazouyomu2());
        this.transform.localScale = new Vector3(image1.xScale, image1.yScale, 1.0f);

    }


    //サイズ変更のため必要
    public void ScaleUp()
    {
        this.transform.localScale = new Vector3(image1.xScale, image1.yScale, 1.0f);
    }

    public void ScaleDown()
    {
        this.transform.localScale = new Vector3(image1.xScale, image1.yScale, 1.0f);
    }

    //サイズ変更のため必要

  

    IEnumerator gazouyomu2()    //IEnumeratorはコルーチンを使うのに宣言するとき使う。gazouyomu2は関数名。
                                //コルーチンは好きな場所で処理を止めたり再開したりできる機能
    {
        string[] Pathmei = System.IO.Directory.GetFiles(imagePath, "*", System.IO.SearchOption.AllDirectories);



        if (!Pathmei.Any())                                     //もしPathmeiという名前の配列に何も入っていなかったら 画像を入れるフォルダ内が空だったときのエラー対策
        {
            Debug.Log($"{nameof(Pathmei)}画像フォルダ2は空です。");
            this.GetComponent<Renderer>().material.color = new Color32(0, 0, 0, 0);

        }
        else
        {




            string file = Pathmei[0];   //配列の一個目(0番)をfileに入れる。
                                        //拡張子の出力
            Debug.Log(Path.GetExtension(file));  //配列の一個目(0番)、つまりfile の拡張子をLogに書き出す。


            WWW www = new WWW(Pathmei[0]);

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

            Renderer rend = GetComponent<Renderer>();
            rend.material.mainTexture = www.texture;
        }
    }


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


    }




}


以上です。

指定した時間みたら視線入力を受け付ける④ 変数使わず出来た

一夜あけ、再度 image1.csの方に変数を作らず

直接、見たか見てないかをplay.csで

知るすべは無いかリトライしてみました。

 

そして、こちら

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

 

私の中では神サイトです。

どうしてこんなにもやりたいことが掲載されているのか。

この中の②のやり方を参照し、

 

play.csの中を以下のようにしました。

 

 public void keyoshita()
    {
        //オブジェクトを注視していたらTrue
        bool flg = gazeAware.HasGazeFocus;

   
        if (flg || ima1Cu.GetComponent<image1>().gazeAware.HasGazeFocus)       //もし見ているなら

      

        ・・・・・
           

それと、image1.csの方の以下↓をpublicにしました。

 public GazeAware gazeAware;

 

 

やってみました。

丸い泡みたいなのが私の視線です。

 

犬をみたとき

 

 

背景を見たとき

 

どっちもマゼンダ色になっています。

視線入力を受け付けてくれました。

 

良かったです。

 

今から、これを残りの画像たちにも適用します。