🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

2443閲覧

Unity iOS上でStreamingAssetsのJSONファイルをpersistentDataPathにコピー生成して読み込ませる。

TALOS

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/03/16 14:56

現在の状況

こんにちは、現在カレンダーをUnityで制作しており、その情報が格納されたJSONファイルをiOS上で読み込ませることに苦戦しています。
MACOS、Windows環境にて、StreamingAssets内部のフォルダーをコピーして、presistentDataPathの階層にスクリプトからコピー生成をして、それを読み込ませることに成功しております。こちらと同じ動作をiOS環境で再現しようとしています。

using System.Collections; using System.Collections.Generic; using System; using System.Runtime.CompilerServices; using UnityEngine; using System.IO; using UnityEngine.Networking; using UnityEngine.UI; using System.Linq; using System.Threading.Tasks; using UnityEngine.SceneManagement; public void Start() { //月にごとにパスを読み込ませる string Date = GameObject.Find("MainDate").GetComponent<Text>().text; string s1 = Date.Substring(0, 7); string s2 = s1.Replace("/", ""); s3 = "/LifeLog/Monthly/Log" + s2 + ".json"; //jsonファイル数を読み込み string path = Application.dataPath + "/" + "StreamingAssets"; string[] files = Directory.GetFiles(path, "*.json", SearchOption.AllDirectories); Debug.Log(files.Length); jsonString = Application.persistentDataPath + s3; StreamingJson = new string[files.Length]; SendJson = new string[files.Length]; //Jsonヌルを取得 StreamingJson[0] = Application.streamingAssetsPath + "/LifeLog/Monthly/Log000000.json"; SendJson[0] = Application.persistentDataPath + "Log000000.json"; FileCopy(StreamingJson[0], SendJson[0]); for (int t = 0; t< files.Length; t++) { string TrimNum = s2.Substring(0, 4); if(t < 10) { ConvertNum = TrimNum.Insert(4, "0" + t.ToString()); ConvertNum.Insert(4, "00"); } if(10< t) { ConvertNum = TrimNum.Insert(4, t.ToString()); ConvertNum.Insert(4, "00"); } if (ConvertNum.Substring(4, 2) != "00") { StreamingJson[0] = Application.streamingAssetsPath + "/LifeLog/Monthly/Log" + ConvertNum + ".json"; SendJson[0] = Application.persistentDataPath + ConvertNum + ".json"; FileCopy(StreamingJson[0], SendJson[0]); } } //jsonファイルをインスタンス後、一度更新しないと正しくアクティブが表示されないので更新 ReSet(); Call(); } public void ReSet() { //ファイルが存在しないなら更新する if (System.IO.File.Exists(Application.persistentDataPath + "Log000000.json") == false) { SceneManager.LoadScene("UICalendar"); } } void FileCopy(string StreamingJson, string jsonString) { if (System.IO.File.Exists(jsonString)== false) { File.Copy(StreamingJson, jsonString); } } IEnumerator FileCopyForAndroid(string StreamingJson, string jsonString) { using (var webRequest = UnityWebRequest.Get(StreamingJson)) { yield return webRequest.SendWebRequest(); if (webRequest.isNetworkError || webRequest.isHttpError) { yield break; } File.WriteAllBytes(jsonString, webRequest.downloadHandler.data); } } public void Call() { #if UNITY_IOS var request = UnityWebRequest.Get(jsonString); var Text = File.ReadAllText(jsonString); var jsonText = request.downloadHandler.text; #endif jsonData = new MonthlyLog(); } }

解決したいこと

スクリプトから一部抜粋していますが、ビルドしてテスト起動自体には成功しており、カレンダー自体は問題なく動作しています。しかし、JSONだけが読み込まれていない状態です。原因はStreamingAssetsのフォルダーを読み込んでいない、あるいは読み込んでいてもpresistentDataPathにコピー生成することに失敗している。という状況にのように思えます。

大変恐縮ですが、iOSでのJSONファイルのコピー生成及び読み込みにはwindowsやmacOSとは違った何か特殊な書き方があるのでしょうか?ご教授お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

■問題点1:string path = Application.dataPath + "/" + "StreamingAssets";
パスが違います。
Application.streamingAssetsPathを使いましょう。
ストリーミングアセット - Unity マニュアル

■問題点2:SendJson[0] = Application.persistentDataPath + "Log000000.json";など
ファイル名の先頭に/が必要だと思います。
安全性を考えるなら単純な文字列結合ではなくPath.Combineを使いましょう。
Path-Combine(string, string) - Unity スクリプトリファレンス

投稿2021/03/17 00:34

sakura_hana

総合スコア11427

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

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

TALOS

2021/03/17 08:53

ありがとうございます!こちらだけが諸々の原因ではありませんでしたが、ご指摘頂いた点は根本的なミスでした!無事にデバッグすることができました!本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問