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
当然这实用于场景中的模型有重用的现象