http://www.mysjtu.com/page/M0/S716/716482.html
3d游戲中 一個場景往往斗勁大 若是游戲的進行須要下載一個10M甚至更大的場景時 加載所用的時候會導致很大項目組玩家的流失
我們知道unity3d中的內置地形是應用一張高度圖 對其地形進行打包今后 發明<=100KB
那么若是采取unity3d的內置地形作為游戲中的地形時 起首加載地形并顯示 再去加載場景中的部件(比如樹、房子等) 將會很有須要
在加載場景中的部件時 可以按照玩家當前地點的地位 由近到遠的去加載
場景中的每個部件實際上并不都是獨一無二的
比如一棵一模一樣的樹 可能同一個場景中呈如今很多處所 不合的只是樹的地位信息
那么在加載場景的時辰則只須要加載一個樹的模型 并記錄下N個樹的transform信息 將會大大的削減場景所占的空間
若是模型的重用率較高 那么這個題目的解決將會成倍的削減一個場景所占的空間
場景在加載時 也只須要下載一個樹的模型 并按照transform信息 在指定的地位復制出N棵樹即可
在應用unity3d的BuildPipeline進行打包之前 須要遍歷一邊所選文件夾下的場景文件
若是文件的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
當然這實用于場景中的模型有重用的現象