【Unity】AssetBundle化したプレハブの中でRenderTextureを持っていたらエラーが出た

【Unity】AssetBundle化したプレハブの中でRenderTextureを持っていたらエラーが出た

https://www.yui-tech-blog.com/entry/assetbundle-rendertexture-error

Timelineの中で、RenderTextureを使用していたところ、

Unity: Releasing render texture that is set as Camera.targetTexture! というエラーが出てしまいました。

バグが起きた環境

  • Unity2019

  • Timelineに必要なアセットをプレハブにまとめ、PlayableDirectorをアタッチし、AssetBundle化

  • 事前にRenderTextureを生成しておいて、TimelineAsset内でRenderTextureの参照を直接持っていた

  • Timelineのプレハブは使用後はPoolし、使いまわしていた

上記の環境でゲームを実行したところ、TimelineのプレハブをAssetbundle.Unloadする際に

Unity: Releasing render texture that is set as Camera.targetTexture!

エラーが出ました。

解決策

RenderTextureをScript上で動的に生成し、随時参照を渡して、

Finalizeのタイミングで動的生成したRenderTextureを解放するようにしました。

Timelineに直接持っているRenderTextureを適切なタイミングで解放し、参照にnullを入れてみたのですが、

そもそもTimelineのプレハブをInstantiateしているため、AssetBundle内のリソース元のプレハブ内では

依然として参照を持っているため、解決しなかったみたいです。

RenderTextureをScript上で扱うために下記のようなコードを書きました。

 

/// <summary>

/// RenderTextureに写すためのカメラ

/// </summary>

private Camera renderTextureCamera;

/// <summary>

/// RenderTextureを表示するためのRawImage

/// </summary>

private RawImage rawImage;

/// <summary>

/// RenderTexture

/// </summary>

private RenderTexture renderTexture;

/// <summary>

/// RenderTextureの生成

/// </summary>

private void CreateRenderTexture()

{

renderTexture = new RenderTexture(512,512,24);

renderTextureCamera.targetTexture = renderTexture;

rawImage.texture = renderTexture;

}

/// <summary>

/// RenderTextureを解放

/// </summary>

private void ReleaseRenderTexture()

{

renderTextureCamera.targetTexture = null;

rawImage.texture = null;

renderTexture.Release();

renderTexture = null;

}

解説

CreateRenderTexture()でRenderTextureのセットアップを行っています。

new RenderTexture(横幅, 縦幅, Depth)で、RenderTextureのサイズとDepthを指定しつつ生成します。

その後に、RenderTextureに画面を写すためのカメラのtargetTextureと、

その映像を表示するためのRawImageのtextureにRenderTextureの参照を代入します。

また、RenderTextureを使用しなくなった場合は、ReleaseRenderTexture()を呼びます。

RenderTextureの参照を持っている変数にnullを代入し、RenderTexture.Release()でRenderTextureを解放します。

こうすることでメモリリークしないようになり、該当のエラーも出ないようになりました。

まとめ

AssetBundleにするアセット内でRenderTextureを使用したい場合は

動的に生成した方が良さそうです。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity AssetBundle Browser是Unity引擎的一款插件,它可以帮助游戏开发者在编辑器内浏览和管理AssetBundle资源。AssetBundle资源是游戏制作过程必需的一种资源,它可以将一些预制件、贴图、声音和代码等打包成二进制文件,并在运行时通过代码加载到游戏,从而实现动态加载资源和减少加载时间的效果。 Unity AssetBundle Browser插件提供了一个可视的资源管理界面,用户可以通过它对资源进行打包、解包、浏览、删除等操作。在使用AssetBundle资源时,由于资源文件的二进制格式与编辑器内资源格式不同,开发者需要将资源文件打包成AssetBundle进行加载。Unity AssetBundle Browser将这个过程简了,用户只需选择需要打包的资源,设置相关参数,并点击打包按钮,就可以轻松地创建AssetBundle文件,并将其加载到游戏。 此外,Unity AssetBundle Browser还支实时预览AssetBundle资源,开发者可以通过它快速地浏览预制件、纹理、材质球等资源,从而提高开发效率。总的来说,Unity AssetBundle Browser是一款十分实用的插件,它为开发者提供了一种便捷的方式去管理和使用AssetBundle资源,使游戏制作变得更加高效和便捷。 ### 回答2: Unity AssetBundle Browser是一个Unity扩展工具,用于在IDE浏览和管理AssetBundle。AssetBundle是一种Unity资源包,可以使开发者轻松创建和管理资源,如纹理、声音和模型等。 Unity AssetBundle Browser可以让开发者直观地查看AssetBundle文件的内容,包括资源列表、依赖关系和预览功能。此外,它还提供了打包、解包、压缩和解压缩AssetBundle文件的功能,使开发者可以更灵活地使用AssetBundle,以满足项目需求。 使用Unity AssetBundle Browser,开发者可以快速地浏览和编辑AssetBundle,节省了大量的时间和精力。它还可以帮助开发者更好地理解AssetBundle的工作原理,为开发者深入学习Unity提供了一个重要的工具。 总之,Unity AssetBundle Browser是一个非常有用的工具,可以帮助Unity开发者更高效地管理和使用AssetBundle,提高项目开发效率和质量。 ### 回答3: Unity AssetBundle Browser是Unity游戏引擎的一个工具,可以用于浏览和导AssetBundle资源包。AssetBundle是一种Unity的资源打包方式,可以将游戏的资源打包成一个文件,方便后续的版本管理和部署。 使用AssetBundle Browser可以很方便地管理和处理AssetBundle资源包,包括在游戏动态加载和卸载资源,减小游戏的内存占用和优游戏性能。通过AssetBundle Browser,我们可以查看和编辑资源包的资源,例如模型、贴图、音频等,并提供了一套完整的编辑工具,支资源导入、复制、删改等操作。 在游戏开发,AssetBundle Browser可以用于优游戏的资源处理方式,提高游戏性能,同时也可以帮助开发者更加高效地管理和打包游戏资源。值得注意的是,AssetBundle Browser只适用于Unity游戏引擎,需要Unity开发环境的支。因此,开发者在使用AssetBundle Browser时,需要提前了解Unity的相关知识和技术,否则会影响到开发效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值