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
固然這適用於場景中的模型有重用的現象