2017-09-29 11 views
0

私はスクリーンショットを撮って、すぐにそれを使って何らかのプレビューを表示し、いくつかの時間は動作し、何度かは表示されません。ないScreenCapture.CaptureScreenshotでスクリーンショットをキャプチャして保存する

public GameObject screenshotPreview; 

public void TakeScreenshot() { 

     string imageName = "screenshot.png"; 

     // Take the screenshot 
     ScreenCapture.CaptureScreenshot (imageName); 

     // Read the data from the file 
     byte[] data = File.ReadAllBytes(Application.persistentDataPath + "/" + imageName); 

     // Create the texture 
     Texture2D screenshotTexture = new Texture2D(Screen.width, Screen.height); 

     // Load the image 
     screenshotTexture.LoadImage(data); 

     // Create a sprite 
     Sprite screenshotSprite = Sprite.Create (screenshotTexture, new Rect(0, 0, Screen.width, Screen.height), new Vector2(0.5f, 0.5f)); 

     // Set the sprite to the screenshotPreview 
     screenshotPreview.GetComponent<Image>().sprite = screenshotSprite; 

} 

(ここでは、そこにいくつかの文法ミスがあるかもしれない)仕事で、私はその場でそれを再作成してみますので、私は、このコンピュータでの団結を持っていない限り、私が読んだとして、 ScreenCapture.CaptureScreenshotは非同期ではないので、データをロードしようとする直前に画像が書き込まれていたはずですが、何回か前に言いましたが、動作しないと8x8テクスチャに赤い疑問符、これは明らかに読み込まれていないテクスチャですが、ファイル私はそれが正しくロードされていない理由を理解できないので、そこにいたはずです。

もう1つのことを試みました(これはうんざりですが、これに疲れていてアイデアがなくなってしまいました)は、更新メソッドを入れてしばらく待ってからデータを読み込み、テクスチャを作成し、スプライトして表示することもできますが、以前よりも頻繁に失敗することはありませんが、それでも失敗します。ファイルが作成されていても書かれていません。これに対処するには?どんなアドバイスもありがとうございます。

追加情報として、このプロジェクトはiOSデバイスで実行されています。

答えて

0

ScreenCapture.CaptureScreenshot機能には多くの問題があることが知られています。 Hereもその一つです。ここで

は、そのdocからの引用です:

Androidでは、この関数はすぐに戻ります。結果スクリーンショット は後で利用可能です。

iOSの動作は文書化されていませんが、iOSでは動作が同じであると見なすことができます。読み込み/読み込みを試みる前に、スクリーンショットを撮ってから数フレーム待ってください。

public IEnumerator TakeScreenshot() 
{ 

    string imageName = "screenshot.png"; 

    // Take the screenshot 
    ScreenCapture.CaptureScreenshot(imageName); 

    //Wait for 4 frames 
    for (int i = 0; i < 5; i++) 
    { 
     yield return null; 
    } 

    // Read the data from the file 
    byte[] data = File.ReadAllBytes(Application.persistentDataPath + "/" + imageName); 

    // Create the texture 
    Texture2D screenshotTexture = new Texture2D(Screen.width, Screen.height); 

    // Load the image 
    screenshotTexture.LoadImage(data); 

    // Create a sprite 
    Sprite screenshotSprite = Sprite.Create(screenshotTexture, new Rect(0, 0, Screen.width, Screen.height), new Vector2(0.5f, 0.5f)); 

    // Set the sprite to the screenshotPreview 
    screenshotPreview.GetComponent<Image>().sprite = screenshotSprite; 

} 

あなたはこの関数を呼び出すためにStartCoroutine(TakeScreenshot());を使用する必要があります。


これが機能しない場合は、この機能を使用しないでください。ここではユニティでスクリーンショットを取り、保存するための別の方法は次のとおりです。

IEnumerator captureScreenshot() 
{ 
    yield return new WaitForEndOfFrame(); 

    string path = Application.persistentDataPath + "Screenshots/" 
      + "_" + screenshotCount + "_" + Screen.width + "X" + Screen.height + "" + ".png"; 

    Texture2D screenImage = new Texture2D(Screen.width, Screen.height); 
    //Get Image from screen 
    screenImage.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); 
    screenImage.Apply(); 
    //Convert to png 
    byte[] imageBytes = screenImage.EncodeToPNG(); 

    //Save image to file 
    System.IO.File.WriteAllBytes(path, imageBytes); 
} 
+0

私はちょうど[ここ]読んでいました(https://developer.vuforia.com/forum/faq/unity-how-can-i-capture-スクリーンショット)については、あなたがそれを提案したという事実が私の気持ちを良くして、明日、私はそれにショットをつけてくれます。ありがとう! –

0

「非同期ではない」というドキュメントには何も表示されません。実際、Androidの場合(これを正しく読んでいれば)、それは明示的に非同期であると言います。

つまり、ファイルが見つからないうちにストールしようとします。コルーチンにそれを投げ、while(!file.found)は何を得ますか?また、そこにいくつかのデバッグチェックを投げて、ファイルが現れる前に(表示されていると仮定して)ファイルが表示されるまでの時間(秒またはフレーム)を調べることもできます。

関連する問題