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

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

新規登録して質問してみよう
ただいま回答率
85.38%
C#

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

Android

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

Unity

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

Q&A

解決済

3回答

2853閲覧

Android上でimageの保存が出来ない

yonn

総合スコア120

C#

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

Android

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

Unity

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

0グッド

0クリップ

投稿2022/08/09 05:32

編集2022/08/10 12:57

前提

ツイッターで映像をツイートする機能を作っています。
カメラで映っている映像をResourceフォルダに保存したいと思います。
(その後別のスクリプトで呼び出します)

エディタ上ではうまくいのですが、Android上でパスが違うと表示され なぜかうまくいきません。

//
Error Unity DirectoryNotFoundException: Could not find a part of the path "/data/app/unity-------
//

実現したいこと

Androidの実機でも画像が保存出来るようになりたい。

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

2022/08/09 14:03:39.596 31253 31273 Error Unity DirectoryNotFoundException: Could not find a part of the path "/data/app/unity.●●●.▼▼▼/base.apk/Resources/twpng.png". 2022/08/09 14:03:39.596 31253 31273 Error Unity at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x00000] in <00000000000000000000000000000000>:0 2022/08/09 14:03:39.596 31253 31273 Error Unity at System.IO.File.Create (System.String path, System.Int32 bufferSize) [0x00000] in <00000000000000000000000000000000>:0 2022/08/09 14:03:39.596 31253 31273 Error Unity at System.IO.File.WriteAllBytes (System.String path, System.Byte[] bytes) [0x00000] in <00000000000000000000000000000000>:0 2022/08/09 14:03:39.596 31253 31273 Error Unity at Catch_画像_SC.Capture2 () [0x00000] in <00000000000000000000000000000000>:0 2022/08/09 14:03:39.596 31253 31273 Error Unity 2022/08/09 14:03:39.596 31253 31273 Error Unity (Filename: currently not available on il2cpp Line: -1)

該当のソースコード

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.IO; 5using UnityEditor; 6using UnityEngine.UI; 7 8public class Catch_画像_SC : MonoBehaviour 9{ 10 public Camera sub_camera; 11 12 //サブカメラの「ビューポート矩形」 0:0のまま   「クリアフラッグ」 深度のみにする 13 int カメラの外枠_横 = 1920; 14 int カメラの外枠_たて = 1080; 15 16 void Start() 17 { 18 Capture1_保存(); 19 } 20 public void Capture1_保存() 21 { 22 Invoke("Capture2", 0.0001f);//0.0001f 秒後に次の問題表示 23 } 24 public void Capture2() 25 { 26 27 var size = new Vector2Int(カメラの外枠_横, カメラの外枠_たて); //*サイズを設定 28 var render = new RenderTexture(size.x, size.y, 24); 29 30 var texture = new Texture2D(size.x, size.y, TextureFormat.RGB24, false); 31 32 33 try 34 { 35 36 sub_camera.targetTexture = render;  // カメラ画像を RenderTexture に描画 37 sub_camera.Render(); 38 39 40 RenderTexture.active = render;     // RenderTexture の画像を読み取る 41 texture.ReadPixels(new Rect(0, 0, size.x * 1f, size.y * 1f), 0, 0); 42 texture.Apply(); 43 } 44 finally 45 { 46 sub_camera.targetTexture = null; 47 RenderTexture.active = null; 48 } 49 50 // PNG 画像としてファイル保存 51 File.WriteAllBytes( 52 $"{Application.dataPath}/Resources/twpng.png", texture.EncodeToPNG()); 53 } 54}

試したこと

「.png」をつけたり外したり日本語スクリプトを変更してみたりしましたがうまくいかなかったです。

そもそもRecouceフォルダにAndroid上から保存できるかも疑問です。

またRecouceフォルダに保存出来ないならゲームの記録などの画像はどうやってツイート出来るのだろうなど考えておりました。

どのようなアプローチで進めれば良いかわからず困っております。
ご存知の方何卒ヒントなど頂けませんでしょうか?

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

Unity 2019.4.31f1
Windows
Windows10
プラットフォーム: Android
プラットフォーム: Android7.1


最終的な解決

c#

1 // PNG 画像としてファイル保存 2 // File.WriteAllBytes( 3 // $"{Application.dataPath}/Resources/twpng.png", texture.EncodeToPNG()); 4 5 File.WriteAllBytes( 6 $"{Application.persistentDataPath}/twpng.png", texture.EncodeToPNG());

最終的な解決の確認
下記コードでAndroid上でツイートができたのでこれでスマホに保存されていた事が証明されました。

Android上での保存と呼び出しの両方が初めてだったので完了の確認が遅くなり申し訳ありませんでした。

下記は保存ではなく画像を呼び出してツイートを行っています。

皆さんの回答それぞれについていろいろ試させて頂きました。
本当にありがとうございます。

c#

1//Unity Asset 「VoxelBusters.EssentialKitを使用」 2 3 4 public void Twitter_Go() 5 { 6 Debug.Log("===  Twi ツイート開始"); 7 8#if UNITY_ANDROID 9 10 string path = $"{Application.persistentDataPath}/twpng.png"; 11 byte[] bytes = File.ReadAllBytes(path); 12 Texture2D texture = new Texture2D(2, 2); 13 texture.LoadImage(bytes); 14 15 16#elif UNITY_IOS 17 18#else 19 Texture2D texture = Resources.Load<Texture2D>("twpng"); // エディター用 「 .png 」をつけるとエラー 20#endif 21 22 ShareSheet shareSheet = ShareSheet.CreateInstance(); 23 shareSheet.AddImage(texture); //画像追加 24 shareSheet.AddText("テスト"); //文章 25 shareSheet.AddURL(URLString.URLWithPath("https://www.google.co.jp/")); //URL 26 shareSheet.SetCompletionCallback((result, error) => 27 { 28 Debug.Log("Share Sheet was closed. Result code: " + result.ResultCode); 29 }); 30 shareSheet.Show(); 31 32 }

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

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

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

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

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

slemntqe

2022/08/09 05:39

Windowsと書かれていますが開発環境がWindowsである事をわかりやすく書くべきです。また、WindowsのバージョンやAndroidのバージョン情報も明示して下さい。
guest

回答3

0

ベストアンサー

Resourcesフォルダは読み込み専用です。
修正:
Resourcesフォルダを含め、Unityのプロジェクトフォルダ内の各ファイルはビルド時にアプリ内に組み込まれます。
そのため、Resourcesフォルダは組み込まれて存在しないため、書き込むことは出来ません。

保存したい場合はApplication.persistentDataPathに保存してください。

投稿2022/08/09 06:34

編集2022/08/10 00:59
fiveHundred

総合スコア10104

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

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

yonn

2022/08/09 13:34

ありがとうございます。 エラーがなくなったのでうまくいったようです。 画像の確認の仕方がわからないのですが一つ前に進めたようです。 本当にありがとうございました これからそれを取り出す方法を調べて見ようと思います。
slemntqe

2022/08/09 13:48 編集

>Resourcesフォルダは読み込み専用です。 Resourcesフォルダが読み込み専用では無く/data/appよりも下の階層にResourcesフォルダを作成して自由に利用しようとした事に原因があります。 >エラーがなくなったのでうまくいったようです。 私の回答は確認していますか? エラーがなくなったので良いという曖昧な理解の仕方は良くありません。
fiveHundred

2022/08/09 14:18 編集

> Resourcesフォルダが読み込み専用では無く/data/app以下にResourcesフォルダが存在する事に重要な意味があります。 それはAndroid固有の話です。 UnityではResourcesフォルダは特別なフォルダであり、その扱いやビルド後のパスはビルドするOSによって異なります。 (そもそも、アプリに組み込まれて存在すらしない、という場合もあります) しかし、Resourcesフォルダは書き込みが想定されていない、ということでは一貫しており、それが「読み込み専用」と言った理由です。
fiveHundred

2022/08/09 14:26

と思ったけど、Androidの場合でも、そもそも組み込まれて存在していないのかもしれません。 (StreamingAssetsと混同していました) そして、それを「Androidでも$"{Application.dataPath}/Resources/~"にResourcesフォルダがある」と質問者さんが勘違いしていたのが質問の状況かなと思います。 いずれにせよ、Application.persistentDataPathは、OSが異なっていても書き込みが出来るフォルダのパスになっていますので、そちらに保存するのが一番でしょう。
fiveHundred

2022/08/10 01:00

とりあえず、回答が不正確なままにするわけにはいかないので、修正しました。 大変失礼しました。
guest

0

/data/appはシステムディレクトリですのでアプリの権限で自由に利用できるディレクトリではありません。
/sdcarddata/data/unity.●●●.▼▼▼/files等のディレクトリでファイルI/Oをしましょう。

投稿2022/08/09 05:38

slemntqe

総合スコア120

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

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

yonn

2022/08/10 13:09

コメントありがとうございます。 下記の方法でディレクトリの確認をしました。 「Debug.Log(Application.persistentDataPath);」 ↓ 「/storage/emulated/0/Android/data/unity.●●●.▼▼▼/files」 と表示されました。 ひょっとするとスマホによってディレクトリの構造が変わる可能性があるのかと考え、試しに「Application.persistentDataPath」で試すとうまくいったので今回はこれを採用とさせて頂きました。   今回初めての事で検証することに時間がかかり大変申し訳ありませんでした。 皆さんの回答は何日も悩んでいる私のような者からすれば本当にありがたいお言葉です。 本当にありがとうございました。
guest

0

DirectoryNotFoundExceptionというエラーは「ディレクトリが見つかりません」=「フォルダが見つかりません」なので、「Resourcesフォルダが存在しないので保存できません」と言われていると考えてください。該当のソースコードの中にフォルダを作成するコードが見当たらないので、フォルダを作成するコードを追加すればいいと思います。

cs

1// フォルダが存在しなければ作成する 2if (!Directory.Exists($"{Application.dataPath}/Resources")) 3{ 4 Directory.CreateDirectory($"{Application.dataPath}/Resources"); 5}

そもそもですが、ゲームの記録などの画像のツイートは大体スクリーンショットで撮ってるんじゃないでしょうか?

投稿2022/08/09 06:06

KomoriGameDev

総合スコア433

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

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

KomoriGameDev

2022/08/09 14:07

低評価付けるなら、せめて何が悪かったのか理由を書いてほしいです… 何を反省したら良いのか分からずただただ悲しいです…
fiveHundred

2022/08/10 01:12

低評価つけたのは私ではないですが、説明します。 Application.dataPathはビルドしたアプリ上では、「インストール先のパス」を指すようです。 しかし、そのパスはシステムディレクトリ上(slemntqeさんの回答を参考)にあるので、そこにディレクトリを作ること自体できません。 補足ですが、Application.dataPathはエディタ上では「インストール先のパス」の代わりに「プロジェクトフォルダのパス」になります。 そのため、質問者さんは「(プロジェクトフォルダ)/Resources」を参照しようとして、このコードを書いたのでしょう。 ビルド後はResourcesフォルダ内も含め、全てアプリに組み込まれてしまうので、$"{Application.dataPath}/Resources"なんていうものは存在しないため、動作しないことになったのです。
KomoriGameDev

2022/08/10 01:41

説明ありがとうございます。おかげで理由がわかってスッキリしました! 全く的外れな回答をしてしまいました…回答を削除してしまいたいぐらい恥ずかしいです… 時間を取らせてしまい申し訳ありませんでした…
yonn

2022/08/10 13:22

KomoriGameDevさんコメント遅くなり申し訳ありません。 私も同じ経験があるのでお気持ちわかります。 コメントしようと思っていましたがいろいろあり遅くなり申し訳ないです。 分からない時にコメント頂くだけでも嬉しいです。   スマホゲームが縦なのにのツイート画像が横に向いているのがあり、その画面にスコアなどが載っていたので私も最近まで知らなかったです。   画面の裏のサブカメラで画像を映してそこにテキストを載せてスクショ(?)をとっているようです。 エディターではうまくいったのですがAndroid上での挙動が全く違い今回の質問に至りました。 サブカメラもツイートも実機での事も全てわからず苦労しましたが皆さんのおかげで解決しました。 ディレクトリの作り方は知らなかったの勉強になりました。 ありがとうございました。
KomoriGameDev

2022/08/10 13:52

コメントありがとうございます。共感して頂いたので励みになります! なにか気を使わせてしまっていたら申し訳ないです…余計なコメントをしてしまいました… とにかく、解決してよかったです!
yonn

2022/08/11 03:20

私も初心者ながらわかる疑問に回答してあげようとして低評価をたくさん押された事がありましたのでコメントは差し上げようと思っていました。 上級者の方からの低評価のボタンはとても心に堪えます。 間違えていてもいろいろな知識を出し合える場になれば良いのにといつも思います。 これからも宜しくお願い致します。
KomoriGameDev

2022/08/11 03:48

匿名の方からの無言低評価は意外と傷つきますね… 高評価だけでも良いような気がするのですが… こちらこそよろしくおねがいします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.38%

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

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

質問する

関連した質問