最近接到的一个项目中多处用到播放视频而且有的地方还需要同时播放多个视频。下面说说我遇到的问题以及是如何解决的。
unity5.6出了专门播放视频的组件,等我研究明白了再来更新。在这个项目中我用的还是老办法。使用Image的材质球来播放视频。在我们播放一个视频的时候按照我们正常的脚本来做不会有任何问题,可是在同时播放多个视频的时候我们会发现他们同时播放一个视频。无论你的视频是以MovieTexture形式在Inspector面板上指定还是用Resources动态加载,都会出现问题。困扰了我很久。后来在我一个朋友的提醒下我明白了,UGUI所有物体在没有指明材质球的时候其实是共用一个默认的材质球。所以才会在播放多个视频时多个视频显示一样的画面。所以,核心问题就是我们需要为我们多个视频的Image指定一个实例的Material。我们在工程中创建我们需要个数的材质球,然后在需要播放视频的Image上指定对应的材质球。注意:我们在选择材质球的shader时选择UI/Default。好了问题顺利解决。下面是我写的播放视频的代码。
private void PlayMovie(Image ig,string name,Material m)
{
MovieTexture mt = Resources.Load<MovieTexture>(name);
ig.material = m; //指定特定的材质球
ig.material.mainTexture =mt;
if (!mt.isPlaying)
{
mt.Play();
}
StartCoroutine(checkAmOver(ig, mt));
}
下面代码就是监测视频是否播放完以及播放完之后做的事情。我们可以在自己声明的委托中加入我们想要做的事件。
private IEnumerator checkAmOver(Image mg,MovieTexture m)
{
while (m.isPlaying)
{
yield return new WaitForEndOfFrame();
}
mt.Stop();//一定要加stop,这个很重要。
//mg.transform.parent.gameObject.SetActive(false);
// _timers.GetComponent<Timer>().isTime = true;
//if (movieOverAc!=null)
// movieOverAc(); //我们想要做的事件
}
你以为就结束了,Unity的bug有时候还真是让人无语。我遇到的问题就是第一次播放总有一个视频无法播放。就是硬生生的Bug。我的解决方案就是在播放这段视频之前让他这个失效的Image单独播放一段好用的视频,设置Image的透明度为0,就是所谓的缓冲作用。不过这个bug我感觉也是因人而异,你们可能就不会遇到。如果遇到了可以试试我的方法。好了,以上是我项目中播放多个视频遇到的问题以及解决方案。希望对你有帮助。