【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  

固然这适用于场景中的模型有重用的现象