對于在 Android 上運行的 Unity 應用程式,我有一個簡單的目標:創建一個函式,該函式禁用我的 GUI、創建螢屏截圖、存盤影像并再次啟用 GUI。
這是我當前的代碼:
整個 UI 存盤在我的處理程式類作為屬性保存的 GameObject 中:
private bool makeScreenshotFlag;
public GameObject UserInterface;
makeScreenshotFlag 以上用于更新功能:
// Update is called once per frame
void Update()
{
if (makeScreenshotFlag)
{
// Working with this flag is necessary,
// since we need to wait for the next frame,
// where the gui is not visible;
MakeScreenShot();
}
}
如果相應的按鈕被按下,我會觸發以下方法:
public void OnCreateScreenshotButtonPressed()
{
UserInterface.SetActive(false);
makeScreenshotFlag = true;
}
最后是截圖本身的方法:
private void MakeScreenShot()
{
if (UserInterface.activeSelf) return; // wait for the next frame if the gui is still active
try
{
string filename = "screenshot_" DateTime.Now.ToString("HH-mm-ss--dd-MM-yyyy") ".png";
ScreenCapture.CaptureScreenshot(filename);
}
catch (Exception e)
{
DebugHelper.NewLog = "Error capturing screenshot: " e.Message;
}
finally
{
makeScreenshotFlag = false;
UserInterface.SetActive(true);
}
}
理論上這應該有效,但是檔案ScreenCapture.CaptureScreenshot()說明如下:
CaptureScreenshot 在 Android 上立即回傳。螢屏截圖在后臺繼續。幾秒鐘后,生成的螢屏截圖將保存在檔案系統中。
實際上,這意味著,當我制作螢屏截圖時,GUI 已經再次啟用。到目前為止,我找不到任何事件或類似事件,以便在截取螢屏截圖后立即得到通知。我唯一能想到的就是存盤截圖檔案名并在截圖開始后檢查檔案是否存在每一幀。
有沒有其他更實用的方法?
uj5u.com熱心網友回復:
最有可能的是,您正在使用 UI 本身捕獲幀。最好使用 Coroutine 等到幀結束。
public IEnumerator MakeScreenShot()
{
// Wait till the last possible moment before screen rendering to hide the UI
yield return null;
// Disable UI
UserInterface.SetActive(false);
// Wait for screen rendering to complete
yield return new WaitForEndOfFrame();
// Take screenshot
Application.CaptureScreenshot("screenshot.png");
// Show UI after we're done
UserInterface.SetActive(true);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/332864.html
上一篇:FormValidation的JavaScript變數范圍和可訪問性
下一篇:如何在C#腳本中決議和查找字串?
