如何在 Android 上的 Unity 中禁用用于屏幕截图的游戏对象?
Posted
技术标签:
【中文标题】如何在 Android 上的 Unity 中禁用用于屏幕截图的游戏对象?【英文标题】:How to disable Gameobjects for Screenshot capturing in Unity on Android? 【发布时间】:2021-12-09 18:11:39 【问题描述】:我对在 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);
理论上这应该可行,但是the documentation for ScreenCapture.CaptureScreenshot()
声明如下:
CaptureScreenshot 在 Android 上立即返回。屏幕截图在后台继续。生成的屏幕截图会在几秒钟后保存在文件系统中。
实际上,这意味着,当我制作屏幕截图时,GUI 已经再次启用。到目前为止,我找不到任何事件或类似事件可以在制作屏幕截图后立即得到通知。我唯一能想到的就是存储截图文件名,并在截图开始后检查文件是否存在。
还有其他更实用的方法吗?
【问题讨论】:
【参考方案1】:很可能,您正在使用 UI 本身捕获帧。最好使用协程等到帧结束。
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);
【讨论】:
目前我不仅在等待帧结束,甚至在等待下一帧(至少)。我的问题是,捕获屏幕截图似乎需要几帧,我无法确定何时完成。还是我误会了什么? 等一下,我会测试你的代码... :) 我认为捕获不需要几帧。最有可能的是,他们的意思是他们在捕获一帧后在后台处理它。如果我错了,请纠正我。以上是关于如何在 Android 上的 Unity 中禁用用于屏幕截图的游戏对象?的主要内容,如果未能解决你的问题,请参考以下文章
unity3d在android安卓中用啥代替pc上的OnMouseDown函数
在 Unity 中使用 Android Studio 上的类