2013-03-01 100 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。