質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1272閲覧

Untiy Androidアプリのセーブデータをローカルに保存する方法がわかりません

CopanSassa

総合スコア18

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2019/06/25 05:35

編集2019/06/25 05:44

前提・実現したいこと

UnityでAndroidのアンケートアプリを作っています
時間と正解数をアンドロイドのローカル(外部でも内部でも可)に保存したいです。
その結果の統計などを取りたいので、パソコンでセーブデータを見れるようにしたいので必ずしもCSVファイルである必要はありません。XMLファイルでもいいですが、バイナリーファイルでしかできないなら、CSVファイルへの変換方法まで教えていただけると嬉しいです

PlayerPrefでの保存でもいいですが、CSVファイルへの変換方法がわかりません
バイナリファイルがいくつかできるのは、知っていますが、ファイル名も数字の羅列でよくわからないのでどう扱っていいかに困っています

とにかく、セーブデータを外部にエクスポートでき、それをパソコンで見れれば十分です

発生している問題・エラーメッセージ

NotSupportedExeptionと出てきます
パソコンでは、何ら問題がなくできたんですが、アンドロイドで動かすとうまくいきません

該当のソースコード

using UnityEngine; using UnityEngine.UI; using System.Text; using System.IO; public class exportCsvScript : MonoBehaviour { //Reference: https://dobon.net/vb/dotnet/file/edittextfile.html //public GameObject CSVText; // Use this for initialization void Start() { Debug.Log(UnityEngine.Application.persistentDataPath); CheckExixtCSV(); ReadCSV(); } // Update is called once per frame void Update() { } void OverWriteCSV() { // ファイル書き出し // 現在のフォルダにsaveData.csvを出力する(決まった場所に出力したい場合は絶対パスを指定してください) // 引数説明:第1引数→ファイル出力先, 第2引数→ファイルに追記(true)or上書き(false), 第3引数→エンコード //falseにすると、ファイルを新規作成する StreamWriter sw = new StreamWriter(UnityEngine.Application.persistentDataPath + "/saveData.txt", false, Encoding.GetEncoding("Shift_JIS")); // ヘッダー出力 string[] s1 = { "00", "01", "02", "03" }; string s2 = string.Join(",", s1); sw.WriteLine(s2); // データ出力 //ここでまず入れたいデータを配列として扱う string[] str = {DataScripts.CorrectNumber.ToString(), DataScripts.TotalTime.ToString(), DataScripts.ChooseCircleNumber.ToString(), DataScripts.ChooseCrosstNumber.ToString() }; //ここで","を付けた形にする(str2に配列strに","を付けたものを代入する) string str2 = string.Join(",", str); //ここで初めて書き込む sw.WriteLine(str2); // StreamWriterを閉じる sw.Flush(); sw.Close(); } void AppendCSV() { // ファイル書き出し // 現在のフォルダにsaveData.csvを出力する(決まった場所に出力したい場合は絶対パスを指定してください) // 引数説明:第1引数→ファイル出力先, 第2引数→ファイルに追記(true)or上書き(false), 第3引数→エンコード //falseにすると、ファイルを新規作成する StreamWriter sw = new StreamWriter(UnityEngine.Application.persistentDataPath + "/saveData.txt", true, Encoding.GetEncoding("Shift_JIS")); // データ出力 //ここでまず入れたいデータを配列として扱う string[] str = { DataScripts.CorrectNumber.ToString(), DataScripts.TotalTime.ToString(), DataScripts.ChooseCircleNumber.ToString(), DataScripts.ChooseCrosstNumber.ToString() }; //ここで","を付けた形にする(str2に配列strに","を付けたものを代入する) string str2 = string.Join(",", str); //ここで初めて書き込む sw.WriteLine(str2); // StreamWriterを閉じる sw.Flush(); sw.Close(); } void ReadCSV() { // ファイル読み込み // 引数説明:第1引数→ファイル読込先, 第2引数→エンコード StreamReader sr = new StreamReader(UnityEngine.Application.persistentDataPath + "/saveData.txt", Encoding.GetEncoding("Shift_JIS")); string line; // 行がnullじゃない間(つまり次の行がある場合は)、処理をする while ((line = sr.ReadLine()) != null) { // コンソールに出力 Debug.Log(line); //Text YourCSVText= CSVText.GetComponent<Text>(); // テキストの表示を入れ替える //YourCSVText.text = line.ToString(); } // StreamReaderを閉じる sr.Close(); } void CheckExixtCSV() { if (System.IO.File.Exists(UnityEngine.Application.persistentDataPath + "/saveData.txt")){ Debug.Log("CSVファイルが存在するので追記します"); AppendCSV(); } else { Debug.Log("CSVファイルが存在しないので作成します"); OverWriteCSV(); } } }

試したこと

現在はStreamWriterを使ってApplication.persistentDataPathに保存しようとしています

パソコン上では、しっかりと保存されているのを確認できましたが、Androidにビルドしてみるとファイルが作成されるどころか、CSVファイルの読み込みすらできません(あらかじめCSVファイルをそのPathに置いておいて読み込めるか確認しました)

パスが間違っているのかと思い、CSVファイルがあるかどうかだけ調べる関数を作ったところ、パスはあっており、CSVファイルがあることは確認できました

ただ、読み込み書き込みができないようでログを表示してみると(TEXTにログを表示するようにしてあるので、アンドロイド上でも見えるようになっています)NotSupportedExeptionと出てきます

そもそもAndroidにはCSVファイルを作る能力がないのでしょうか?(TXTでも試してみましたができませんでした)

Unityで開発したいので、解決できると嬉しいです

補足情報(FW/ツールのバージョンなど)

UntiyのPlayerSettingでInternalをExternal(SD card)にするといいと聞いたのでそれも試してみましたが効果はありませんでした。

他の質問ではApplication.DataPathじゃなくてApplication.persistentDataPathにすればできるというものばかりで、参考になるものがありません

SQLiteで保存する方法があるそうですが、ローカル保存ができてパソコンで開くことができるならそれでもいいです
(外部にセーブデータをエクスポートしたい)

よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/06/25 05:39

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
CopanSassa

2019/06/25 05:44

失礼しました、<code>というのがあるんですね 教えていただきありがとうございます よろしくお願いします
izmktr

2019/06/25 05:56

Encoding.GetEncoding("Shift_JIS") 原因はこれだと思うんで、System.Text.Encoding.UTF8 あたりとかだといけたりしませんかね?
CopanSassa

2019/06/25 06:01

izmktrさん、ありがとうございます! 早速やってみますね! アンドロイドでもCSVファイルの生成ってできるんですよね?
CopanSassa

2019/06/25 06:10

できました! ありがとうございます
CopanSassa

2019/06/25 06:15

izmktrさん 僕が使っていたstreamwriteのスクリプトはネットで見たやつなので、内容をあまり理解していなかったのですが、Encoding.GetEncoding("Shift-JIS")とSystem.Text.Encoding.UTF8って何が違うんですか?
izmktr

2019/06/25 07:04

文字コードです 詳しくはググってもらうとして、簡単に言えば「古語で」ファイルに書け、と指示しているので、 Windowsだと古語も読み書きできるけど、Androidは古語をしらないので、 「現代日本語(UTF8)はいけるけど古語はサポートできん」って言ってる感じです
CopanSassa

2019/06/26 05:03

izmktrさん、ありがとうございます そういうことだったんですね! 迷走していたので本当に助かりました!! teratailにはベストアンサー的なのがあるのでしょうか? izmktrさんにしたいのですが・・・
izmktr

2019/06/26 05:42

なら、解答作っておきます
guest

回答1

0

ベストアンサー

Encoding.GetEncoding("Shift-JIS")でShift-JISを指定していますが、
Android側ではサポートできないエンコーディングなのでエラーが出ているようです

System.Text.Encoding.UTF8 に変えるといいです

投稿2019/06/26 05:42

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問