3D網(wǎng)頁游戲場景打包與加載

3D游戲中,一個場景往往斗勁大,若是游戲的進行須要下載一個10M甚至更大的場景時,加載所用的時候會導(dǎo)致很大項目組玩家的流失。

我們知道Unity3D中的內(nèi)置地形是應(yīng)用一張高度圖,對其地形進行打包今后,發(fā)明<=100KB。那么若是采取Unity3D的內(nèi)置地形作為游戲中的地形時,起首加載地形并顯示,再去加載場景中的部件(比如樹、房子等),將會很有需要。

在加載場景中的部件時,可以按照玩家當(dāng)前地點的地位,由近到遠(yuǎn)的去加載。場景中的每個部件實際上并不都是獨一無二的,比如一棵一模一樣的樹,可能同一個場景中呈如今很多處所,不合的只是樹的地位信息,那么在加載場景的時辰則只須要加載一個樹的模型,并記錄下N個樹的transform信息,將會大大的削減場景所占的空間。

若是模型的重用率較高,那么這個題目的解決將會成倍的削減一個場景所占的空間。景在加載時,也只須要下載一個樹的模型,并按照transform信息,在指定的地位復(fù)制出N棵樹即可。在應(yīng)用Unity3D的BuildPipeline進行打包之前,須要遍歷一遍所選文件夾下的場景文件,若是文件的MeshFilter的Mesh為在該文件夾中只呈現(xiàn)了一次,則申明該模型在場景中沒有反復(fù),則記錄下該模型文件的transform信息,并打包。

若是該Mesh呈現(xiàn)的次數(shù)大于一次,則記錄下這些和該Mesh雷同的模型的transform信息,打包時包含一個模型和多個transform信息
在Unity3D中有個名為ScriptableObject的類,可以哄騙它來存儲本身所需的各類百般的資料。

public class TransformHolder : ScriptableObject
    {

public int Length;

public Vector3[] position;

public Quaternion[] eulerAngles;

public Vector3[] localScale;

}

如許一來,每一個資料包中都包含一個模型和一個TransformHolder類型的文件,TransformHolder的Length若為1,則申明該模型在場景中只呈現(xiàn)了一次。
若大于1,則可以按照記錄的transform信息輪回生成多個。本來有幾百個資料包,大小有十幾兆的場景,用該辦法后,變成了二十多個資料包,大小削減到不足2M,當(dāng)然這實用于場景中的模型有重用的現(xiàn)象。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容