【Unity3d】3d網頁遊戲場景打包與加載

http://www.cnblogs.com/dosomething/archive/2012/04/07/2436353.htmlhtml

3d遊戲中  一個場景每每比較大  若是遊戲的進行須要下載一個10M甚至更大的場景時  加載所用的時間會致使很大部分玩家的流失ui

咱們知道unity3d中的內置地形是使用一張高度圖  加載場景時  首先加載地形並顯示  再去加載場景中的部件(好比樹、房子等)  將會頗有必要spa

在加載場景中的部件時  能夠根據玩家當前所在的位置  由近到遠的去加載3d

 

場景中的每一個部件實際上並不都是獨一無二的  code

好比一棵如出一轍的樹  可能同一個場景中出如今不少地方  不一樣的只是樹的位置信息  orm

那麼在加載場景的時候則只須要加載一個樹的模型  並記錄下N個樹的transform信息  將會大大的減小場景所佔的空間  htm

若是模型的重用率較高  那麼這個問題的解決將會成倍的減小一個場景所佔的空間blog

場景在加載時  也只須要下載一個樹的模型  並根據transform信息  在指定的位置複製出N棵樹便可遊戲

 

在使用unity3d的BuildPipeline進行打包以前  須要遍歷一邊所選文件夾下的場景文件 ip

若是文件的MeshFilter的Mesh爲在該文件夾中只出現了一次  則說明該模型在場景中沒有重複  則記錄下該模型文件的transform信息  並打包

若是該Mesh出現的次數大於一次  則記錄下這些和該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  則說明該模型在場景中只出現了一次

若大於1  則能夠根據記錄的transform信息循環生成多個

原先有幾百個資源包  大小有十幾兆的場景  

用該方法後  變成了二十多個資源包  大小減小到不足2M  

固然這適用於場景中的模型有重用的現象