Unity:将新剪辑分配给视频播放器会更改我当前场景中的所有视频播放器剪辑
Unity: Assigning a new clip to video player changes ALL video player clips in my current scene
我实例化了几个游戏对象,它们都有一个视频播放器组件,所有这些对象都在主 canvas 中,应该能够同时播放视频。
当我为他们中的一个分配新剪辑时,他们所有人都会重新开始播放并将他们的资源更改为新的。当然,它应该只改变我实际分配给它的那个。
我已经确定,下面的函数只会在正确的对象上调用一次。
我还打印了视频播放器的哈希码,以确保它们是不同的对象,它们确实是。
有谁知道是什么原因造成的?
我如何分配剪辑
public virtual void SetVideoResource(string fileName)
{
videoName = fileName;
textPanel.SetActive(false);
videoPanel.SetActive(true);
videoPlayer = videoPanel.GetComponentInChildren<VideoPlayer>();
videoPlayer.clip = (VideoClip)Resources.Load("Videos/" + fileName);
Debug.Log(videoPlayer.GetHashCode());
}
我的视频播放器组件的设置
和目标纹理
我自己解决了这个问题:
该行为的原因不是所有剪辑都已重新分配。 (所有视频播放器仍然有自己的视频资源)
但是,我将一个单一的渲染纹理分配给了视频播放器。这当然行不通,因为所有视频播放器都会将其帧渲染到这个渲染纹理上。
该解决方案根据每个视频播放器的视频面板大小实例化自定义渲染纹理:
public virtual void SetVideoResource(string fileName)
{
videoName = fileName;
textPanel.SetActive(false);
videoPanel.SetActive(true);
float parentWidth = videoPanel.GetComponent<RectTransform>().rect.width;
float parentHeight = videoPanel.GetComponent<RectTransform>().rect.height;
videoPlayer = videoPanel.GetComponentInChildren<VideoPlayer>();
CustomRenderTexture targetTexture = new CustomRenderTexture((int)(parentWidth*0.90f), (int)(parentHeight * 0.90f), RenderTextureFormat.ARGB32);
videoPanel.GetComponentInChildren<RawImage>().texture = targetTexture;
videoPlayer.targetTexture = targetTexture;
videoPlayer.clip = (VideoClip)Resources.Load("Videos/" + fileName);
}
我实例化了几个游戏对象,它们都有一个视频播放器组件,所有这些对象都在主 canvas 中,应该能够同时播放视频。 当我为他们中的一个分配新剪辑时,他们所有人都会重新开始播放并将他们的资源更改为新的。当然,它应该只改变我实际分配给它的那个。 我已经确定,下面的函数只会在正确的对象上调用一次。 我还打印了视频播放器的哈希码,以确保它们是不同的对象,它们确实是。
有谁知道是什么原因造成的?
我如何分配剪辑
public virtual void SetVideoResource(string fileName)
{
videoName = fileName;
textPanel.SetActive(false);
videoPanel.SetActive(true);
videoPlayer = videoPanel.GetComponentInChildren<VideoPlayer>();
videoPlayer.clip = (VideoClip)Resources.Load("Videos/" + fileName);
Debug.Log(videoPlayer.GetHashCode());
}
我的视频播放器组件的设置
和目标纹理
我自己解决了这个问题:
该行为的原因不是所有剪辑都已重新分配。 (所有视频播放器仍然有自己的视频资源) 但是,我将一个单一的渲染纹理分配给了视频播放器。这当然行不通,因为所有视频播放器都会将其帧渲染到这个渲染纹理上。
该解决方案根据每个视频播放器的视频面板大小实例化自定义渲染纹理:
public virtual void SetVideoResource(string fileName)
{
videoName = fileName;
textPanel.SetActive(false);
videoPanel.SetActive(true);
float parentWidth = videoPanel.GetComponent<RectTransform>().rect.width;
float parentHeight = videoPanel.GetComponent<RectTransform>().rect.height;
videoPlayer = videoPanel.GetComponentInChildren<VideoPlayer>();
CustomRenderTexture targetTexture = new CustomRenderTexture((int)(parentWidth*0.90f), (int)(parentHeight * 0.90f), RenderTextureFormat.ARGB32);
videoPanel.GetComponentInChildren<RawImage>().texture = targetTexture;
videoPlayer.targetTexture = targetTexture;
videoPlayer.clip = (VideoClip)Resources.Load("Videos/" + fileName);
}