ReonViewin'S HOBBY LABO

日頃の趣味活動について-最近物忘れが多くなったので忘れないための記録。

Uni補足00416 指定したフォルダからの読み込み


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

指定したフォルダからの読み込み
  
////////////////////////////////////////////

※ず~~っと前に出したと思っていたのですが
※出してなかった・・・・


//指定PATHにある(TopDirectoryOnly)物だけ全部 (*.*)
string[] path_array = Directory.GetFiles(path, "*.*", System.IO.SearchOption.TopDirectoryOnly);
//ファイル名のみを
string fileName = System.IO.Path.GetFileName(path2);


調べてみるといろいろなパターンがあった。
参照

=============================
基本
string folderPath = "フォルダのPATH";
string[] fs = System.IO.Directory.GetFiles (folderPath, "*" );


○.指定したフォルダにあるファイルだけを取得する場合
  searchOption で TopDirectoryOnly
string[] fs = System.IO.Directory.GetFiles (@folderPath, "*", System.IO.SearchOption.TopDirectoryOnly);


○.指定したフォルダのサブフォルダも含めたフォルダにあるファイルを取得する場合
  //指定フォルダ以下全部
  searchOption で AllDirectories


●.ファイル名部分を取得
string fileName = System.IO.Path.GetFileName (path);


●.拡張子名部分を取得
string fileName = System.IO.Path.GetExtension (path);


●.拡張子をのぞいたファイル名部分を取得
string fileName = System.IO.Path.GetFileNameWithoutExtension (path);


●.ディレクトリ名部分を取得
string fileName = System.IO.Path.GetDirectoryName (path);

=============================


  1. 2017/04/15(土) 17:23:59|
  2. Unity
  3. | トラックバック:0
  4. | コメント:0

Uni補足00415 指定したフォルダからの読み込み


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

指定したフォルダからの読み込み
  
////////////////////////////////////////////


--------------------------------------------
次に、内部データ領域の好きな場所を指定できるか調べた
参考にしたところ
---------------------------------
string path = "";
using (AndroidJavaClass jcEnvironment = new AndroidJavaClass ("android.os.Environment"))
using (AndroidJavaObject joExDir = jcEnvironment.CallStatic ("getExternalStorageDirectory")) {
path = joExDir.Call("toString")+"/jp.co.cname.app/";
}
//フォルダがなければ作成
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
//ファイル名入力
path += System.DateTime.Now.Ticks.ToString ()+".png";
---------------------------------

こんな感じにすればいいらしいので

path = joExDir.Call("toString");

のようにして、内部SD領域の先頭にして、

以下のようなスクリプトを書いて実験してみた。


----------------------------------------------

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO; // ←Directoryクラスを使うにはコレがいる

public class DispSDAllFilesScr : MonoBehaviour {
private string ErrorMessage = "";
private string allFiles = "";

private string path = "";
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}

void OnGUI()
{
//解像度に依存せず
GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(Screen.width / 800f, Screen.height / 600f, 1f));

if (GUI.Button(new Rect(400, 5, 100, 40), "AllFiles"))
{
dispFiles2();
//dispFiles();
}

GUI.TextArea(new Rect(400, 50, 200, 200), allFiles);

GUI.TextArea(new Rect(400, 300, 200, 100), ErrorMessage);
}


void dispFiles()
{
allFiles = "全ファイル\n";
#if UNITY_EDITOR
string[] path_array = Directory.GetFiles(Application.dataPath, "*.*");
int array_num = path_array.Length;
for (int i = 0; i < array_num; i++)
{

string path = path_array[i];
string fileName = System.IO.Path.GetFileName(path);
allFiles += fileName + "\n";
}
#elif UNITY_ANDROID
//SDのパス 内部getExternalStorageDirectory
string path = "";
using (AndroidJavaClass jcEnvironment = new AndroidJavaClass ("android.os.Environment"))
using (AndroidJavaObject joExDir = jcEnvironment.CallStatic ("getExternalStorageDirectory")) {
path = joExDir.Call("toString"); //内部SDのpath それ以下の指定は/aaa/bbb/みたいにする
}
//フォルダがなければ作成
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
//ファイル名入力
//SDのパス
ErrorMessage = "1";
string[] path_array = Directory.GetFiles(path, "*.*", System.IO.SearchOption.TopDirectoryOnly);
ErrorMessage = "2";
int array_num = path_array.Length;
if(array_num != 0){

for (int i = 0; i < array_num; i++)
{
string path2 = path_array[i]; //path_array[i]は、フルPathになっている
string fileName = System.IO.Path.GetFileName(path2);//ファイル名のみを
allFiles += path2+"\n";
}

}

ErrorMessage = path;

#endif
}


void dispFiles2()
{
allFiles = "フォルダ一覧\n";
#if UNITY_EDITOR
string[] path_array = Directory.GetFiles(Application.dataPath, "*.*");
int array_num = path_array.Length;
for (int i = 0; i < array_num; i++)
{

string path = path_array[i];
string fileName = System.IO.Path.GetFileName(path);
allFiles += fileName + "\n";
}
#elif UNITY_ANDROID
//path = Application.persistentDataPath;
//SDのパス 内部getExternalStorageDirectory
//Directory.GetFilesよりDirectory.EnumerateFilesを使った方がいいかも??
string path = "";
using (AndroidJavaClass jcEnvironment = new AndroidJavaClass ("android.os.Environment"))
using (AndroidJavaObject joExDir = jcEnvironment.CallStatic ("getExternalStorageDirectory")) {
path = joExDir.Call("toString");
}
//フォルダがなければ作成
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
//ファイル名入力
//path += System.DateTime.Now.Ticks.ToString ()+".png";
//SDのパス
ErrorMessage = "1";
string[] path_array = Directory.GetDirectories(path, "*.*", System.IO.SearchOption.TopDirectoryOnly);
ErrorMessage = "2";
int array_num = path_array.Length;
if(array_num != 0){

for (int i = 0; i < array_num; i++)
{
string path2 = path_array[i]; //path_array[i]は、フルPathになっている
//string fileName = System.IO.Path.GetFileName(path2);//ファイル名のみを
allFiles += path2+"\n";
}

}

ErrorMessage = path;

#endif
}
}


----------------------------------------------


  1. 2017/03/31(金) 15:05:40|
  2. Unity
  3. | トラックバック:0
  4. | コメント:0

Uni補足00414 Unityで画像ファイルの書き出し


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

Unityで画像ファイルの書き出し

////////////////////////////////////////////
保存されたのを確認するためには

androidの場合は
/data/data/<アプリのID>/files/
なので、見つけてもいいけど

画面操作で、呼び出せるようにしてみた

ReadImgFile2Obj という名前の planeオブジェクトを作り

画面に並ぶように配置する。

--------- ReadImgFileScr.cs ----------------------

using UnityEngine;
using System.Collections;
using System.IO; //FileStream
#if UNITY_EDITOR
using UnityEditor;
#endif

public class ReadImgFileScr : MonoBehaviour
{
private string imgFile = "myphoto.png";
private string imgSaveFile = "mysave2img.png";

public Texture2D tex;
public Texture2D tex2;
private string path = "";

private string ErrorMessage = "";

void Start()
{
StartCoroutine(LoadImg());
}

byte[] LoadBin(string path)
{
FileStream fs = new FileStream(path, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] buf = br.ReadBytes((int)br.BaseStream.Length);
br.Close();
return buf;
}

IEnumerator LoadImg()
{
//string path = "";
GameObject readImgObj = GameObject.Find("ReadImgFileObj");

#if UNITY_EDITOR
path = Application.streamingAssetsPath + "\\" + imgFile;
Texture2D tex = new Texture2D(0, 0);
tex.LoadImage(LoadBin(path));
readImgObj.GetComponent().material.mainTexture = tex;
yield return new WaitForSeconds(0f);
#elif UNITY_ANDROID
path = "jar:file://" + Application.dataPath + "!/assets" + "/" + imgFile;
WWW www = new WWW(path);
yield return www;
Texture2D tex = new Texture2D(0, 0);
readImgObj.GetComponent().material.mainTexture = www.texture;
#endif

}


IEnumerator LoadSaveImg()
{
//string path = "";
GameObject writeImgObj = GameObject.Find("ReadImgFile2Obj");
#if UNITY_EDITOR
path = Application.streamingAssetsPath + "\\" + imgSaveFile;

Texture2D tex = new Texture2D(0, 0);
tex.LoadImage(LoadBin(path));
writeImgObj.GetComponent().material.mainTexture = tex;
yield return new WaitForSeconds(0f);
#elif UNITY_ANDROID
//path = "jar:file://" + Application.dataPath + "!/assets" + "/" + imgSaveFile;
//path = Application.persistentDataPath + "/" + imgSaveFile;
//読み込む場所が違うので、読み込み方式が異なる
path = string.Format("{0}/{1}", Application.persistentDataPath , imgSaveFile);
byte[] imageBytes = File.ReadAllBytes(path);
Texture2D tex = new Texture2D(0, 0);
bool isloadbmpSuccess = tex.LoadImage(imageBytes);
writeImgObj.GetComponent().material.mainTexture = tex;
yield return new WaitForSeconds(0f);
#endif

}

IEnumerator SaveImg()
{
GameObject readImgObj = GameObject.Find("ReadImgFileObj");

#if UNITY_EDITOR
//画像の保存
Texture2D tex2 = new Texture2D(0, 0);
tex2 = readImgObj.GetComponent().material.mainTexture as Texture2D;
// 使っているテクスチャをTexture2Dとして使う場合は as Texture2D を使う
byte[] pngData = tex2.EncodeToPNG(); // pngのバイト情報を取得.
string filePath = EditorUtility.SaveFilePanel("Save Texture", "", imgSaveFile, "png");
if (filePath.Length > 0)
{
// pngファイル保存.
File.WriteAllBytes(filePath, pngData);
}
//画像の保存
yield return new WaitForSeconds(0f);
#elif UNITY_ANDROID
tex2 = readImgObj.GetComponent().material.mainTexture as Texture2D;
//path = "jar:file://" + Application.dataPath + "!/assets" + "/" + imgSaveFile;
path = Application.persistentDataPath + "/" + imgSaveFile;
//path = string.Format("{0}/{1}", Application.persistentDataPath , imgSaveFile);
byte[] pngData = tex2.EncodeToPNG(); // pngのバイト情報を取得.

ErrorMessage = "FindFile";

ErrorMessage = "FindFile2";

if( pngData != null)
{
ErrorMessage = "FindFile3";

File.WriteAllBytes(path, pngData);

ErrorMessage = "書き込み";
}else{
ErrorMessage = "Error";
}

yield return new WaitForSeconds(0f);
#endif

}

void OnGUI()
{

if (GUI.Button(new Rect(300, 200, 100, 40), "画像保存"))
{
//StartCoroutine("LoadText2");
//StartCoroutine(SaveImg());//OK
//StartCoroutine(SaveImgNew());//ok
StartCoroutine(SaveImgOld());
}

if (GUI.Button(new Rect(300, 250, 100, 40), "画像確認"))
{
//StartCoroutine("LoadText2");
StartCoroutine(LoadSaveImg());
}

GUI.TextArea(new Rect(300, 300, 100, 40), ErrorMessage);
}


IEnumerator SaveImgOld()
{

GameObject readImgObj = GameObject.Find("ReadImgFileObj");

#if UNITY_EDITOR
//画像の保存
Texture2D tex2 = new Texture2D(0, 0);
tex2 = readImgObj.GetComponent().material.mainTexture as Texture2D;
// 使っているテクスチャをTexture2Dとして使う場合は as Texture2D を使う
byte[] pngData = tex2.EncodeToPNG(); // pngのバイト情報を取得.
string filePath = EditorUtility.SaveFilePanel("Save Texture", "", imgSaveFile, "png");
if (filePath.Length > 0)
{
// pngファイル保存.
File.WriteAllBytes(filePath, pngData);
}
//画像の保存
yield return new WaitForSeconds(0f);
#elif UNITY_ANDROID
//.WriteAllBytes方式
tex2 = readImgObj.GetComponent().material.mainTexture as Texture2D;
//path = "jar:file://" + Application.dataPath + "!/assets" + "/" + imgSaveFile;
//path = Application.persistentDataPath + "/" + imgSaveFile;
path = string.Format("{0}/{1}", Application.persistentDataPath , imgSaveFile);
byte[] pngData = tex2.EncodeToPNG(); // pngのバイト情報を取得.

ErrorMessage = "FindFile2";

if( pngData != null)
{
ErrorMessage = "FindFile3";

File.WriteAllBytes(path, pngData);

ErrorMessage = "書き込み";
}else{
ErrorMessage = "Error";
}

yield return new WaitForSeconds(0f);
#endif

}


IEnumerator SaveImgNew()
{
GameObject readImgObj = GameObject.Find("ReadImgFileObj");

#if UNITY_EDITOR
//画像の保存
Texture2D tex2 = new Texture2D(0, 0);
tex2 = readImgObj.GetComponent().material.mainTexture as Texture2D;
// 使っているテクスチャをTexture2Dとして使う場合は as Texture2D を使う
byte[] pngData = tex2.EncodeToPNG(); // pngのバイト情報を取得.
string filePath = EditorUtility.SaveFilePanel("Save Texture", "", imgSaveFile, "png");
if (filePath.Length > 0)
{
// pngファイル保存.
File.WriteAllBytes(filePath, pngData);
}
//画像の保存
yield return new WaitForSeconds(0f);
#elif UNITY_ANDROID
//.Write 方式
Texture2D tex2 = new Texture2D(0, 0);
tex2 = readImgObj.GetComponent().material.mainTexture as Texture2D;
path = string.Format("{0}/{1}", Application.persistentDataPath , imgSaveFile);
byte[] pngData = tex2.EncodeToPNG(); // pngのバイト情報を取得.
ErrorMessage = "1";
//tex2.ReadPixels (new Rect(0, 0, Screen.width, Screen.height), 0, 0);
using (FileStream BinaryFile = new FileStream(path, FileMode.Create, FileAccess.Write)) {
ErrorMessage = "2";
using (BinaryWriter Writer = new BinaryWriter(BinaryFile)) {
ErrorMessage = "3";
Writer.Write (tex2.EncodeToPNG());
ErrorMessage = "ED";
}
}

yield return new WaitForSeconds(0f);
#endif

}


}

--------- ReadImgFileScr.cs ----------------------


表示させる項目が増えてきたので
すべての void OnGUI(){ の下に
以下の部分を追記する
//解像度に依存せず
GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(Screen.width / 800f, Screen.height / 600f, 1f));


  1. 2017/03/29(水) 15:46:48|
  2. Unity
  3. | トラックバック:0
  4. | コメント:0

Uni補足00413 Unityで外部画像ファイルの読み出し


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

Unityで画像ファイルの書き出し

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

とりあえず、

書き込み場所は
androidの場合は
path = Application.persistentDataPath + "/" + imgSaveFile;
若しくは
path = string.Format("{0}/{1}", Application.persistentDataPath , imgSaveFile);
として、保存をすればいいらしい。

現在表示されているTextureをTexture2Dとして、読み込んで
tex2 = readImgObj.GetComponent().material.mainTexture as Texture2D;
pngのバイト情報を取得して
byte[] pngData = tex2.EncodeToPNG();
保存した。

-----------------------------------
//.WriteAllBytes方式
GameObject readImgObj = GameObject.Find("ReadImgFileObj");
tex2 = readImgObj.GetComponent().material.mainTexture as Texture2D;
path = string.Format("{0}/{1}", Application.persistentDataPath , imgSaveFile);
byte[] pngData = tex2.EncodeToPNG(); // pngのバイト情報を取得.
if( pngData != null){
File.WriteAllBytes(path, pngData);
ErrorMessage = "書き込み";
}else{
ErrorMessage = "Error";
}
-----------------------------------
また、
-----------------------------------
//.Write 方式
GameObject readImgObj = GameObject.Find("ReadImgFileObj");
Texture2D tex2 = new Texture2D(0, 0);
tex2 = readImgObj.GetComponent().material.mainTexture as Texture2D;
path = string.Format("{0}/{1}", Application.persistentDataPath , imgSaveFile);
byte[] pngData = tex2.EncodeToPNG(); // pngのバイト情報を取得.
ErrorMessage = "1";
using (FileStream BinaryFile = new FileStream(path, FileMode.Create, FileAccess.Write)) {
using (BinaryWriter Writer = new BinaryWriter(BinaryFile)) {
Writer.Write (tex2.EncodeToPNG());
}
}
-----------------------------------
でも、保存された。


  1. 2017/03/24(金) 20:14:54|
  2. Unity
  3. | トラックバック:0
  4. | コメント:0

Uni補足00412 Unityで外部画像ファイルの読み出し


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

Unityで外部画像ファイルの読み出し

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


画像の表示は、

ReadImgFileObjという名前の Planeオブジェクトを作り

-----------------------------------
using UnityEngine;
using System.Collections;
using System.IO; //FileStream
#if UNITY_EDITOR
using UnityEditor;
#endif

public class ReadImgFileScr : MonoBehaviour
{
private string imgFile = "myphoto.png";
private string imgSaveFile = "mysave2img.png";

public Texture2D tex;
private string path = "";

private string ErrorMessage = "";

void Start()
{
StartCoroutine(LoadImg());
}
byte[] LoadBin(string path)
{
FileStream fs = new FileStream(path, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] buf = br.ReadBytes((int)br.BaseStream.Length);
br.Close();
return buf;
}

IEnumerator LoadImg()
{
GameObject readImgObj = GameObject.Find("ReadImgFileObj");

#if UNITY_EDITOR
path = Application.streamingAssetsPath + "\\" + imgFile;
Texture2D tex = new Texture2D(0, 0);
tex.LoadImage(LoadBin(path));
readImgObj.GetComponent().material.mainTexture = tex;
yield return new WaitForSeconds(0f);
#elif UNITY_ANDROID
path = "jar:file://" + Application.dataPath + "!/assets" + "/" + imgFile;
WWW www = new WWW(path);
yield return www;
Texture2D tex = new Texture2D(0, 0);
readImgObj.GetComponent().material.mainTexture = www.texture;
#endif

}

void OnGUI()
{
GUI.TextArea(new Rect(300, 300, 100, 40), ErrorMessage);
}
}
-----------------------------------


な感じでできたのですが
書き込みが・・・・

結構難したかった。


  1. 2017/03/22(水) 22:47:49|
  2. Unity
  3. | トラックバック:0
  4. | コメント:0
次のページ

広告1


FC2ブログランキング

FC2Blog Ranking

プロフィール

Reon

Author:Reon
いつもゴロゴロしながら
リアル育成ゲームをしている
変わったいきもの
特徴:黒い・昼行性に移行中
口癖:眠い・体が痛い
特殊能力:気象変動が数日前にわかる(ピンポイントではない)

最近の記事

カテゴリー

最近のコメント

ブロとも一覧


Xジェンダー・Life

オジサンだって頑張れば出来るもん!!

おひさま大好き♪縁側日記

北海道・札幌・ススキノの楽しみ方!

くろねの日記ブログ

ネットで稼ぐ。空いた時間で小遣いゲット♪

さんすうメルマガのブログ

リンク

このブログをリンクに追加する

FC2カウンター


無料カウンター

オンラインカウンター

現在の閲覧者数:
無料カウンター

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

プラグインお試し