次にすること
画像2枚のアプリが出来ました。
この後、
画像1枚で画像と音を好きに入れ替えできるアプリも作っておきたいと思います。
それから、
画像3枚も。
いずれ、これらを一つのアプリで
最初のスタート画面で選べるようになったら良いなと思います。
それには、
これまで避けてきた画面遷移をしないといけないのだろうなと思います。
あと、ずっと前に書いた
●できるかどうか分からないぐらい果てしない将来の目標
①m4aを再生したい。
②wwwは実は非推奨らしいので、UnityWebRequestを使えるようになる。
これも、いずれ・・・ということで
一応念頭には入れておこうと思います。
また、
画像のサイズと位置をアプリ起動後に変更できると良いなと思います。
つまり、目標
①画像1枚バージョンを作る
②画像3枚バージョンを作る
③画像の移動、サイズの変更ができるようにする
④画像の枚数をスタート画面で選べるようにする
●できるかどうか分からないぐらい果てしない将来の目標
①m4aを再生したい。
②wwwは実は非推奨らしいので、UnityWebRequestを使えるようになる。
という感じになります。
unity 好きな画像で視線入力⑨ 2枚の画像にそれぞれの音 全コード
全コードを書きます。
コード内のコメントは自分なりの
理解なので、
不正確なことも書いていると思います!
正確に知りたいときは
当サイト以外を是非、お調べください!!
Play.csです。
・・・・・・
using System.Collections;
using System.IO;
using UnityEngine;
using Tobii.Gaming; //ライブラリの追加
using NAudio.Wave; //← 見つからないとエラーが出たときは Import Settings を見直す
public class play : MonoBehaviour
{
private GameObject cu2Object;
play2 pl2;
public AudioSource audioSource;
///////////////////////////////////////////
string otoPath = "C:/オリジナル視線アプリ/音はここ/1";
///////////////////////////////////////////
//注視情報
private GazeAware gazeAware;
//停止中か再生中かなど
public int ichiziteishi;
private void Start()
{
//audioSource = this.GetComponent<AudioSource>();
//StartCoroutine(Connect());
//注視情報の取得
gazeAware = GetComponent<GazeAware>();
//一時停止が押されたかどうかを見るための変数。最初と再生中は1.一時停止中は2
ichiziteishi = 1;
///////////////////////////////////////////
//Stringの配列 Pathmei string otoPath = "C:/sound/1" 拡張子* を入れる
string Pathmei = System.IO.Directory.GetFiles(otoPath, "*", System.IO.SearchOption.AllDirectories);
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}");
}
}
//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()
{
// マウスの左ボタンを推した場合も再生
//オブジェクトを注視していたらTrue
bool flg = gazeAware.HasGazeFocus;
//注視していたり、マウスが左クリックされたら
if (flg || Input.GetMouseButtonDown(0))
{
cu2Object = GameObject.Find("2Cu");
pl2 = cu2Object.GetComponent<play2>();
//注視していたら赤色に
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();
}
}
・・・・・・
視線入力があれば音を鳴らすcsファイルは二つあります。
二つ目は、play2という名前にしました。
using System.Collections;
using System.IO;
using UnityEngine;
using Tobii.Gaming; //ライブラリの追加
using NAudio.Wave; //← 見つからないとエラーが出たときは Import Settings を見直す
public class play2 : MonoBehaviour
{
private GameObject cu1Object;
play pl;
public AudioSource audioSource2;
///////////////////////////////////////////
string mp3Path = "C:/オリジナル視線アプリ/音はここ/2";
//注視情報
private GazeAware gazeAware;
//停止中か再生中かなど
public int ichiziteishi2;
private void Start()
{
//audioSource = this.GetComponent<AudioSource>();
//StartCoroutine(Connect());
//注視情報の取得
gazeAware = GetComponent<GazeAware>();
//一時停止が押されたかどうかを見るための変数。最初と再生中は1.一時停止中は2
ichiziteishi2 = 1;
///////////////////////////////////////////
//Stringの配列 Pathmei string mp3Path = "C:/sound/1" 拡張子* を入れる
string Pathmei = System.IO.Directory.GetFiles(mp3Path, "*", System.IO.SearchOption.AllDirectories);
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なら
{
mp3Path = Pathmei[0]; //mp3Pathにもし、配列の一個目(0番)、つまりfileを入れる。
}
else if (Path.GetExtension(file).Contains("wav")) //もし、配列の一個目(0番)、つまりfile の拡張子がwavなら
{
var wavPath = Pathmei[0]; // 下の方の if (File.Exists(mp3Path)) ・・・ により、Application.temporaryCachePath内にconverted.wavという名前で保存
StartCoroutine(PlayWav(wavPath)); // 下の方のIEnumerator PlayWav(string path) ・・・より、PlayWavは関数名。これをここでスタートする。
}
else
{
Debug.Log($"どっちもないよ:{0}"); //mp3もwavも無いときのLog
}
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))
{
cu1Object = GameObject.Find("1Cu");
pl = cu1Object.GetComponent<play>();
//注視していたら赤色に
gameObject.GetComponent<Renderer>().material.color = Color.red;
if (!audioSource2.isPlaying) //再生中で無いなら
{
//一時停止関数がもし2(一時停止中)なら
if (ichiziteishi2 == 2)
{
//再開してください(同時にichiziteisi変数は1になる)
UnPause();
}
//一時停止関数がもし1(一時停止中でない(起動したところだったり、停止中だったり))なら再生する。
else
{
audioSource2.Play();
//++++playが再生されるときは、play2は一時停止する++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
pl.audioSource.Pause();
// Play(audioClip);
// 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」を押して離したら一時停止し、ichiziteishi変数を2に。
if (Input.GetKeyUp(KeyCode.Keypad1))
{
Pause();
}
}
// 再開
if (!audioSource2.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ならダウンロードしてから再生
audioSource2.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()
{
ichiziteishi2 = 2;
audioSource2.Pause();
}
// 停止 Stopと、入力したら停止
private void Stop()
{
audioSource2.Stop();
}
// 再開 UnPause と、入力したらichiziteishi変数に1を入れて、再開
private void UnPause()
{
ichiziteishi2 = 1;
audioSource2.UnPause();
//++++playが再生されるときは、play2は一時停止する++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
pl.audioSource.Pause();
}
}
・・・・・
↑本当は
string mp3Path = "C:/オリジナル視線アプリ/音はここ/2";
の部分の
mp3Path
ですが、
mp3限定じゃないからotoPath2という名前にしたかったのですが、
変更するのを忘れています。
これらは、
上記Hierarchyの1Cuと2CuのCubeにそれぞれくっつけてあります。
1Cuのinspectorは ↑これら を追加しています。
Audio Sourceの白枠だけ1Cuをくっつけています。
2Cuの方も同様に2Cuをくっつけています。
視線入力があって、音を再生した後、
視線が外れても音をループしておきたいときは
Loopにチェックを入れます。
二つチェックが入っていますが、
正直、よく分かっていません。
次に、画像です。
image1.cs
・・・・・・
using UnityEngine;
using System.Collections;
using System.IO;
public class image1 : MonoBehaviour
{
string imagePath = "C:/オリジナル視線アプリ/画像はここ/1";
private void Start()
{
StartCoroutine(gazouyomu());
}
IEnumerator gazouyomu() //IEnumeratorはコルーチンを使うのに宣言するとき使う。gazouyomuは関数名。
//コルーチンは好きな場所で処理を止めたり再開したりできる機能
{
string Pathmei = System.IO.Directory.GetFiles(imagePath, "*", System.IO.SearchOption.AllDirectories);
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;
}
}
・・・・・・
image2.csです。
using UnityEngine;
using System.Collections;
using System.IO;
public class image2: MonoBehaviour
{
string imagePath = "C:/オリジナル視線アプリ/画像はここ/2";
private void Start()
{
StartCoroutine(gazouyomu2());
}
IEnumerator gazouyomu2() //IEnumeratorはコルーチンを使うのに宣言するとき使う。gazouyomu2は関数名。
//コルーチンは好きな場所で処理を止めたり再開したりできる機能
{
string Pathmei = System.IO.Directory.GetFiles(imagePath, "*", System.IO.SearchOption.AllDirectories);
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;
}
}
imageのcsはHierarchyのima1Cuとima2Cuにくっつけています。
どっちもCubeです。
各imageのCubeにおいて、inspectorで大事なのが
これを忘れると背景が透明なpngファイルを表示しても透明にならないようです。
Assets内で右クリックしてMaterialを新しく作れば
このへんを変えられるようになります。
ima1Cuとima2Cuどっちも同じMaterialをくっつけてますが
問題なく動いています。
Cドライブ内に、
オリジナル視線アプリというフォルダを作って、
各フォルダ内に
音はここ と 画像はここ フォルダを作って、
さらに各フォルダ内に
1 と 2 という名前のフォルダを作っています。
音はmp3かwav
画像はpngかjpgファイルを
各フォルダに入れます。
1に入れたら左に2に入れたら右に反映されます。
↓ 左が1フォルダ 右が2フォルダ
unity 好きな画像で視線入力⑧ 速くなったか分からないけど体感速くなった
一旦、今現在の画像を読み取るコードを書きます。
やっとusingが減りました。
今まで色が違うことに全然気づいてませんでしたが、
使っていないusingはVisualStudio上で灰色になっていたので、
どれを消して良いかすぐに分かりました。
using UnityEngine;
using System.Collections;
using System.IO;
public class image1 : MonoBehaviour
{
string imagePath = "C:/オリジナル視線アプリ/画像はここ/1";
IEnumerator Start()
{
//Stringの配列 Pathmei string mp3Path = "C:/image/1" 拡張子* を入れる
string Pathmei = System.IO.Directory.GetFiles(imagePath, "*", System.IO.SearchOption.AllDirectories);
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;
}
}
動作中に、UnityのWindowの中のAnalysysの中のProfilerを立ち上げると
動作の負荷が分かると何かで見聞きしたので立ち上げました。
その後、コードをこんな風に書き換えました。
using UnityEngine;
using System.Collections;
using System.IO;
public class image1 : MonoBehaviour
{
string imagePath = "C:/オリジナル視線アプリ/画像はここ/1";
private void Start()
{
StartCoroutine(gazouyomu());
}
IEnumerator gazouyomu()
//コルーチンは好きな場所で処理を止めたり再開したりできる機能
{
string Pathmei = System.IO.Directory.GetFiles(imagePath, "*", System.IO.SearchOption.AllDirectories);
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;
}
}
体感的には
速くなった気がします。
Profilerはこうなりました。
分かるような分からないような・・・
きっとちゃんとした見方があるんだと思いますが、
その見比べの為に、再度、体感速くなる前のコードに戻すのもなあ・・・と
思ったので、また次の機会があればちゃんと
見方を調べようと思います。
変えたのは、
コルーチンが1度しか呼ばれない (teratail.com)
こちら↑を参考に、
IEnumerator Start()
{ }
の{ }中に、画像の読み取りについてプログラムを書いていたのを、
IEnumerator gazouyomu()
{ }
の中に書いて、
private void Start()
{
StartCoroutine(gazouyomu2());
}
で実行するようにしました。
速くなったというのも負荷をちゃんと数字で
読み取れてないので、体感です。
だから変わってないかも知れないのですが、
とりあえず速くなった気がするので一旦、よしとします。
この先、画像の枚数を増やそうと思っているので、
その時にまたどうなるかな・・・。
⑨に全コードを書きます。
unity 好きな画像で視線入力⑦ 外部ファイルの読み取りフォルダをスクリプト上で変えても変わってくれない 解決済
タイトルのままのできごとがありました。
現在、音のファイルをしまうフォルダと
画像のファイルをしまうフォルダを分けています。
音のフォルダは
cの中のsoundフォルダに1と2というフォルダを作っています。
画像のフォルダは
cの中のimageフォルダに1と2というフォルダを作っています。
これを、同じ
cの中のshisenフォルダに1と2というフォルダを作って
画像も音も一緒に入れてしまったら、使うときに楽じゃないかと思いました。
拡張子で判断して、
画像の場合は画像として、
音の場合は音として使えば良いんじゃないかと思ったわけです。
スクリプトの、画像の読み取り先を
"C:/image/1";
から
"C:/shisen/1";
に変更。
音の読み取り先を
"C:/sound/1";
から
"C:/shisen/1";
に変更しました。
ちゃんとVisualStudioの保存ボタンも押しました。
でも、どうしても元のsoundに読みに行こうとします。
いろいろやってもどうにも分からなかったので、
一旦VisualStudioを閉じようとしたら、
・・・・と
・・・・の変更を保存しますか?
みたいなウィンドウが出ました。
もう閉じてしまったので、詳しいことは覚えていませんが。
はい
を選んで、再度Unityでアプリを動かすと、
ちゃんと新しく設定した
shisenフォルダを読みに行ってくれました。
よく分かりませんが、必要な保存が出来ていなかったようです。
それ以降、保存は
ファイルメニューの中の「すべて保存」でするようにしました。
その後は、読み取り先を変えたら
ちゃんと変えた先に読みに行ってくれるようになりました。
尚、
音と画像で読み取りフォルダを同じにする方法は
一旦、諦めました。
画像は読み取っても音を読み取ってくれなかったりします。
左は画像しか読まない。見ても音が鳴らない。
右は画像も読むし、音も鳴る。
画像を入れ替えても同じ。
フォルダ名を入れ替えると、
今度は右が画像しか読み取らず、音が鳴らない。
配列の0から読み取って、欲しい拡張子があれば
画像として出したり、音として鳴らしたりするようにしています。
フォルダには音ファイルと画像ファイルの二つしかないので、
配列の番号0と1に関して、拡張子を確認するようにスクリプトを書きました。
ですが、どうも読み取りません。
現在、jpg画像も読み込めるようにしてから、
視線の反応も遅くなっており、
こっちを解決するのが先だと思ったので、
フォルダは一旦分けたまま、速度をどうにかすることにします。
unity 好きな画像で視線入力⑥ The namespace '<global namespace>' already contains a definition for 'image2' 解決済
タイトルの通りのエラーが出ました。
余計なコードがいっぱいあったので、
前回のコードから、それらを全部削除したら出てきました。
VisualStudioに保存するときはエラーは出ません。
プログラムをunityで動かそうとするとエラーが出ます。
・・・・
解決しました。
余計なコードを削除するにあたって、
「元のコードを残しておけば良かった!」
と思う日が来そうだったから、
image2ファイルをコピーして
名前だけ変えて、同じアセット内に保存してました。
でも、中身は全部image2のままだったので、
image2が被ってるよと言われたのでした。
image2と同じ名前の部分を変えると直りました。
unity 好きな画像で視線入力⑤ pngとjpgに対応
前回の目標
目標
①名前を自由に
②png以外も使えるように
は達成しました。
左がjpg、右がpngです。
ファイル名も日本語の名前でいけています。
コードを全部貼り付けます。
いい加減、なんとかしないと
するする詐欺になっていますが、
usingが多すぎます。
次回はこれをなんとかします。
・・・image1 ↓
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
{
string imagePath = "C:/image/1";
//配列の番号
int i = 0;
IEnumerator Start()
{
//Stringの配列 Pathmei string mp3Path = "C:/image/1" 拡張子* を入れる
string[] Pathimagemei = System.IO.Directory.GetFiles(imagePath, "*", System.IO.SearchOption.AllDirectories);
imagePath = Pathimagemei[0];
Debug.Log(Pathimagemei[0]);
WWW www = new WWW(Pathimagemei[0]);
yield return www; //関数から抜けずに、一旦停止して値を返す。
Renderer rend = GetComponent<Renderer>(); //コンポーネントの<Renderer>(描画するプログラム的な)をrendで表す
rend.material.mainTexture = www.texture; //テクスチャーの設定はRendererに設定されているMaterialインスタンスに用意されている。テクスチャーイメージの設定はmainTectureというプロパティとして用意されていて、テクスチャー情報が保管されている。
}
}
image2ファイルは、上記コード内のimage1 の部分をimage2に書き換え、
参照するフォルダを
string imagePath = "C:/image/2";
にしました。
音楽に比べて、wavとmp3の変換が無いからシンプルです。
ただ、jpgとpngしか対応してないようです。
でも、これ以外多分、使わないだろうから
必要な時が来るまでこのままにしておこうと思います。