[英]How to disable Gameobjects for Screenshot capturing in Unity on Android?
對於在 Android 上運行的 Unity 應用程序,我有一個簡單的目標:創建一個函數,該函數禁用我的 GUI、創建屏幕截圖、存儲圖像並再次啟用 GUI。
這是我當前的代碼:
整個 UI 存儲在我的處理程序類作為屬性保存的 GameObject 中:
private bool makeScreenshotFlag;
public GameObject UserInterface;
上面的makeScreenshotFlag
是在 Update 函數中使用的:
// 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 已經再次啟用。 到目前為止,我找不到任何事件或類似事件,以便在截取屏幕截圖后立即得到通知。 我唯一能想到的就是存儲截圖文件名並在截圖開始后檢查文件是否存在每一幀。
有沒有其他更實用的方法?
最有可能的是,您正在使用 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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.