如何在 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函数

unity3d 怎样发布android程序

在 Unity 中使用 Android Studio 上的类

Unity3d里如何测试android的touch事件?

Android 和 iOS 上的 Unity ScrollView 性能问题

Android上的Unity Facebook SDK登录错误