2013-03-01 98 views
1

我正在使用Unity WWW对象加载ogg theora格式的电影文件,但我遇到了一些奇怪的现象,我一直无法弄清楚如何解决。Unity3D中的MovieTexture从来没有准备好播放

为了便于说明,我的资产文件夹中有一个名为“Movies /”的文件夹,其中包含我所有本地存储的电影文件。

交流我的应用程序如下,这与StartCoroutine运行一个类的方法里面的#代码段:

WWW www = new WWW("file://" + Application.dataPath + "/Movies/" + movieName + ".ogg"); 
yield return www; 
m_MovieTexture = www.movie; 
if (m_MovieTexture == null) 
{ 
    DbgLog("Movie is NULL!"); 
    return; 
} 
if (m_MovieTexture.isPlaying) 
{ 
    // Not sure how this can happen, but just in case.... 
    m_MovieTexture.Stop(); 
} 
else 
{ 
    if (www.error != null) 
    { 
     DbgLog("Error: " + www.error); 
     return; 
    } 
    DbgLog("Waiting to load " + www.url); 
    while (!m_MovieTexture.isReadyToPlay && !www.isDone) 
    { 
     yield return www; 
    } 
    DbgLog("Finished Loading"); 
    if (www.isDone && !m_MovieTexture.isReadyToPlay) 
    { 
     DbgLog("Weirdness! File finished loading before movie was ready to play!"); 
    } 
} 
m_MovieTexture.Play(); 
DbgLog("Playing video (" + m_MovieTexture.duration + " seconds)"); 
while (m_MovieTexture.isPlaying) 
    yield return null; 
// be kind... rewind. 
m_MovieTexture.Stop(); 
DbgLog("Finished Playing"); 
m_MovieTexture = null; 

当上面的代码执行,内部的日志报表显示,该www.isDone属性返回true即使m_MovieTexture.isReadyToPlay返回false也是如此。 Orignally,while循环只在m_MovieTexture.isReadyToPlay上等待,但是这个循环等待无休止的时间,所以增加了额外的条件,这暴露了真正发生的事情。电影的持续时间也始终为-1,最后,上述代码似乎并未等待视频播放,尽管显式调用了m_MovieTexture.Play(),然后在m_MovieTexture.isPlaying为true,m_MovieTexture.isPlaying立即返回false,并且电影从不播放(OnGUI方法中存在代码,该代码显示m_MovieTexture的内容(如果有)并且电影正在播放,但问题似乎存在于上述代码中,而不是OnGUI方法)。

任何想法,我可能会做错在这里将不胜感激。

在此先感谢

回答

1

WWW已经是一个非阻塞协同例程。所以你只需要一个函数来指导你的WWW实例加载视频并将影片分配给你的m_MovieTexture。然后在您的OnGUI或更新功能检查

if(m_MovieTexture!=null && !m.isPlaying && m.isReadyToPlay) m_MovieTexture.play(); 

这是链接到MovieTexture.onIsReadyToplay doc。