はじめに
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を使用したい場合は
動的に生成した方が良さそうです。
コメント