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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

3270閲覧

Unity)ScreenCapture.CaptureScreenshotが遅すぎる

navesanta

総合スコア198

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2018/11/12 07:13

編集2018/11/13 23:51

Unityで作成したアプリにスクリーンショットの機能を装着したのですが
ボタンを押してから実際にスクリーンショット画像(png)になるまでがかなり遅いです。

シュミレーター実験でAssets/imagesフォルダにできるように設定してボタンを押してから
出来るまでの時間を計ると3分~10分くらいかかります。
設計上のミスがどこかにあるのでしょうか?速くする裏技みたいなものはあるのでしょうか?

環境)
PC: mac
Unity2018.2
言語:C#

空のGameObjectを作成して下記スクリプトをアタッチして
べつのUIのButtonのOnClick属性にPushScreenShot()を付けました。
画像はできることはできるのですが時間がかかり過ぎて現実的ではありません。

ScreenShotScript.cs

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class ScreenShotScript : MonoBehaviour { //ファイル名の指定 [SerializeField] private string _imageTitle = "imageA"; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } public void PushScreenShot(){ StartCoroutine(imageShooting(_imageTitle)); } public IEnumerator imageShooting(string title){ string name = title + ".png"; yield return new WaitForSeconds(2.0f); ScreenCapture.CaptureScreenshot("Assets/images/" + name); Debug.Log("保存しました"); } }

new ScreenShotScript.cs

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class ScreenShotScript : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } public void PushScreenShot(){ ScreenCapture.CaptureScreenshot(Application.persistentDataPath + "/imageA.png"); Debug.Log("保存しました"); }

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

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

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

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

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

ganta7188

2018/11/12 08:10

通常なら一瞬で撮れるんですけど、なんでしょうね。スクリプトは特に問題ないと思います。解像度やカメラの設定の可能性があるので、新しいシーンや、新しいプロジェクトなどで試してみてください。
navesanta

2018/11/13 02:20

新しいシーンとプロジェクトでやはり試しましたが同じ結果です。怪しいのがアスペクト比ですが変更しても変わりません。あと何が原因なのでしょうか?
ganta7188

2018/11/13 04:07

原因、思い当たらないので、いろいろ試すしかないかもです。コルーチンでなく、ScreenCapture.CaptureScreenshotをそのまま呼んだらどうでしょう? あとは保存先を変えてみるとか・・・。ダメそうなら、https://qiita.com/tempura/items/e8f4bbb4419407916d12 こちらのTexture2D.ReadPixelsを試してみてください
sakura_hana

2018/11/13 07:58

シミュレーターということはスマホアプリでしょうか。シミュレーターを使っているから遅い可能性があるので実機でも試してみてください。(余談ですがAssets/imagesフォルダに保存するとその後取得する方法が無い気がするのですが。遅いのもその辺が影響している可能性もあるので、保存先をPersistentDataPath等にしてみるといいかもしれません)
navesanta

2018/11/13 23:52

>ScreenCapture.CaptureScreenshotをそのまま呼んだらどうでしょう?コールチンなしでそのままやっても結果は同じです。Texture2D.ReadPixelsを試してみます。
navesanta

2018/11/13 23:55

>実機でも試してみてください。保存先をPersistentDataPath等にしてみるといいかもしれません。上記にコードを追加しました。実際に端末でApplication.persistentDataPathを使って試したのですがなぜかライブに反映されません(保存されない)。どこかnew ScreenShotScript.csでコードのおかしいところがあるでしょうか?
sakura_hana

2018/11/14 01:04

すみません、CaptureScreenshotは実機だと勝手にPersistentDataPathが付くっぽいです。なので「実機で"Assets/images/ファイル名"に保存」「実機で"ファイル名"に保存」「シミュレーターで"ファイル名"に保存」のパターンを試してみてください。(Assets/imagesというフォルダを生成しているので遅いのかもしれない為、ファイル名のみを渡してみる)/なお「ライブに反映されない」ですが、多分ライブという機能が参照しているパスとスクショ保存先が違うだけなんじゃないかなーと思います。
navesanta

2018/11/14 02:07

>Texture2D.ReadPixelsを試してみてください。→Texture2D.ReadPixelsを設定しました。しかしGameObjectにTexture2Dをコードを使って表示する方法が浮かばないのでテストができません。(初歩的なことかもしれませんが)
navesanta

2018/11/14 07:04

>Texture2D.ReadPixelsを試してみてください。→Texture2D.ReadPixelsでもやはり数分かかります。
navesanta

2018/11/14 08:11

>「実機で"Assets/images/ファイル名"に保存」「実機で"ファイル名"に保存」「シミュレーターで"ファイル名"に保存」3つとも反映されるのに時間がかかります。
navesanta

2018/11/14 08:13

反映されるタイミングがDropBoxの保存時の別デバイスへの反映に酷似しています。DropBoxを使っているのですが偶然でしょうか?
MMashiro

2018/11/14 13:02

一つそもそも前提的な質問ですが、どうやって保存完了と認識してますか?ScreenCapture.CaptureScreenshotしたあと10分ほどフリーズしてるとかでしょうか?
navesanta

2018/11/14 20:12

保存完了はシュミレータの場合は実際に指定したフォルダ内にファイルができたことを見て判断しています。端末の場合はRecourse.Loadで表示して変わっているか判断です。
guest

回答1

0

自己解決

原因がわかってきました。
シュミレータの場合はアプリを保存しているディスクが外付けHDDなのでそれが遅くなる要因かと。

実機の場合はライブラリに表示されないのは、そこに保存されるのではなく
storege/emulated/0/Android/data/com.○○.appNameに保存されるようなので
そちらを参照すればいいという結論に達しました。

投稿2018/11/15 00:40

navesanta

総合スコア198

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問