Как я могу обновить папку ресурсов Unity во время выполнения, чтобы получить последние файлы (без AssetDatabase.Refresh ())? - PullRequest
1 голос
/ 25 марта 2019

Я создаю игру в Unity для Android и делаю снимки экрана во время выполнения и отображаю их на более позднем этапе той же сцены. Однако, когда я пытаюсь это сделать, изображения кажутся устаревшими снимками экрана (из предыдущего сеанса), и они будут обновляться только во время выполнения, если я обновлю папку ресурсов вручную, чего я не могу сделать при работе на Android.

Я пробовал другие способы загрузки изображений, такие как WWW и чтения из ByteArray, которые также не работали. Я также использовал AssetDatabase.Refresh (), который работал, но не доступен для использования на Android.

Вот мой код скриншота (работает как требуется):

IEnumerator CaptureIt()
    {
        string fileName = "/Screenshot" + screenshotCounter + ".png";
        string pathToSave = "Assets/Resources/Screenshots/" + fileName;
        ScreenCapture.CaptureScreenshot(pathToSave);
        screenshotCounter++;
        yield return new WaitForEndOfFrame();
    }

Вот мой код для отображения изображения в виде спрайта:

public void loadImage(int roundNum)
    {
        loadedSprite = Resources.Load<Sprite>("Screenshots/Screenshot" + roundNum);
        imageDisplay.sprite = loadedSprite;
    }

Как я уже сказал, я ожидаю, что это загрузит последний экземпляр снятого скриншота, но это произойдет, только если папка ресурсов была обновлена.

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Хорошо, вот как я исправил проблему:

Код скриншота:

IEnumerator CaptureIt()
{
    string fileName = "Screenshot" + screenshotCounter + ".png";
#if UNITY_EDITOR
    //Path for Editor
    string pathToSave = "Assets/Resources/Screenshots/" + fileName;
#elif UNITY_ANDROID
    //Path for Android
    string pathToSave = fileName;
#endif
    ScreenCapture.CaptureScreenshot(pathToSave);
    screenshotCounter++;
    yield return new WaitForEndOfFrame();
}

Dsiplay код:

public void loadImage(int roundNum)
{
#if !UNITY_EDITOR
    string url = Application.persistentDataPath +"/"+ "Screenshot" + roundNum + ".png";
    var bytes = File.ReadAllBytes( url );
    Texture2D texture = new Texture2D( 996, 2048 );
    texture.LoadImage( bytes );
    Sprite sp = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
    imageDisplay.sprite= sp ;
#else
    StartCoroutine(loadTex("Screenshots/Screenshot" + roundNum));
    Debug.Log("sping");
#endif

IEnumerator loadTex(string filePath)
{
    ResourceRequest resourceRequest = Resources.LoadAsync<Sprite>(filePath);
    while (!resourceRequest.isDone)
    {
        Debug.Log("yielding 0");
        yield return 0;
    }
    Sprite sp = resourceRequest.asset as Sprite;
    Debug.Log("yield return null");
    imageDisplay.sprite = sp;
    yield return null;
}

Надеюсь, это поможет.

0 голосов
/ 25 марта 2019

Я бы попробовал использовать для этого папку StreamingAssets, но я очень сомневаюсь, что это работает даже на Android (я не думаю, что вы можете писать там во время выполнения). В противном случае вы можете переключиться на использование Application.persistentDataPath.
В обоих случаях вам придется использовать другой способ загрузки своих спрайтов. как использование WWW или File IO.

...