如何统一更新运行时的图像?

Posted

技术标签:

【中文标题】如何统一更新运行时的图像?【英文标题】:How can i update an image on runtime in unity? 【发布时间】:2021-05-08 01:13:36 【问题描述】:

我正在构建从关卡场景到菜单场景的平滑过渡。 这个想法是在下一个场景(菜单)加载之前制作关卡的屏幕截图。 然后截取这个覆盖整个屏幕并淡出以显示菜单的屏幕截图。

在关卡结束时,我会截屏。

ScreenCapture.CaptureScreenshot("Resources/DestroyedBoss.png");

当我加载下一个场景时,这个屏幕截图应该加载并覆盖整个场景。

     public Texture2D myTexture;

 void Start()
 

     // load texture from resource folder
     myTexture = Resources.Load("DestroyedBoss") as Texture2D;

     GameObject rawImage = GameObject.Find("RawImage");
     rawImage.GetComponent<RawImage>().texture = myTexture;
 

屏幕截图会褪色,包含它的对象将被销毁。

     public RawImage imageToFade;

 void Update()
 
     imageToFade.color -= new Color(0, 0, 0, 0.2f * Time.deltaTime);

     if (imageToFade.color.a < 0.1) 
         Destroy(this.gameObject);
 

这一切都很好,除了加载屏幕截图本身。

似乎unity在运行游戏时不会更新图像。并且总是使用我上次运行游戏时的屏幕截图。

我已经搜索/谷歌搜索并尝试了 2 天,但我不知所措。

我怎样才能做到这一点?有没有办法在运行我的游戏时更新 png 文件?也许为屏幕截图创建一个临时容器并将其设置为 RawImage?

【问题讨论】:

您不能在运行时将内容添加到Resources .. 内容是一种预兑现的.. 更糟糕的是:在构建之后,Resources 无论如何都是只读的,所以即使 如果您的代码可以在编辑器中运行,那么它无论如何都不会在实际构建的应用程序中运行 我认为您应该使用Application.persistentDataPath 并通过例如实际加载图像UnityWebRequestTexture.GetTexture @derHugo 你先生真棒。 Application.persistentDataPath 运行良好。我用它来保存和加载屏幕截图,效果很好。我会尝试用 UnityWebRequestTexture.GetTexture 加载,以进行练习。 【参考方案1】:

就像 derHugo 评论的那样。您可以使用 Application.persistentDataPath 来保存您的图像。

ScreenCapture.CaptureScreenshot(Application.persistentDataPath+"DestroyedBoss.png");

要加载图片,可以使用 UnityWebRequestTexture.GetTexture。

 IEnumerator SetImage()

    yield return new WaitForSeconds(1);

    using (UnityWebRequest uwr =
        UnityWebRequestTexture.GetTexture(Application.persistentDataPath + "DestroyedBoss.png"))
    
        yield return uwr.SendWebRequest();

        if (uwr.isNetworkError || uwr.isHttpError)
        
            Debug.Log(uwr.error);
        
        else
        
            // Get downloaded asset bundle
            myTexture = DownloadHandlerTexture.GetContent(uwr);

            GameObject rawImage = GameObject.Find("RawImage");
            rawImage.GetComponent<RawImage>().texture = myTexture;
            FadeOut.instance.StartFade();
        
    

它工作正常,但屏幕截图需要几秒钟才能出现在文件夹中。所以对我来说......它效果不佳。 我将使用另一种技术。 而不是在加载菜单时淡化屏幕截图。我将停止游戏(Time.timescale = 0)并淡入菜单截图,然后加载实际的菜单场景。

再次感谢 derHugo。

【讨论】:

【参考方案2】:

您可以在成功捕获图像后尝试更改图像,也许它在调用 start 的那一刻没有完成,要弄清楚这一点,您可以使用 ienumerator 并稍微使用 waitforseconds 来更改您更改的那一刻图像,更好的方法是在图像完全捕获时获得回调

【讨论】:

以上是关于如何统一更新运行时的图像?的主要内容,如果未能解决你的问题,请参考以下文章

Three.js 运行时纹理/图像更新

如何解决在Win7中运行VS2012时的兼容性问题

SearchServlet 已由 Java 运行时的更新版本编译

[JavaWeb]_[初级]_[Jfinal使用时的常见错误]*持续更新*

[JavaWeb]_[初级]_[Jfinal使用时的常见错误]*持续更新*

支持所有JavaScript运行时的HTTP网络库-Fly.js