Unity3D游戏在开启时都jqgrid 默认不加载加载哪些资源

社会化媒体
了解更多>>
桂ICP备 号
阅读下一篇
自媒体运营攻略
行业经验交流
Hi,在你登录以后,就可以永久免费的收藏任何您感兴趣的内容,关注感兴趣的作者!
手机注册或邮箱注册
点击按钮进行验证
请输入正确的邮箱
已有帐号请点击
帐号创建成功!
我们刚刚给你发送了一封验证邮件
请在48小时内查收邮件,并按照提示验证邮箱
感谢你对微口网的信任与支持
你输入的邮箱还未注册
还没有帐号请点击
点击按钮进行验证
你输入的邮箱还未注册
又想起来了?
你已成功重置密码,请妥善保管,以后使用新密码登录
邮件发送成功!
我们刚刚给你发送了一封邮件
请在5分钟内查收邮件,并按照提示重置密码
感谢你对微口网的信任与支持
对不起,你的帐号尚未验证
如果你没有收到邮件,请留意垃圾箱 或
意见与建议
请留下您的联系方式
* 留下您正确的联系方式,以便工作人员尽快与你取得联系
转藏至我的藏点http://mahaile.blog.51cto.com/167
上一章我们讲解了 如何创建一个简单的游戏世界 这一章我们来 看看unity3d中的地形系统 废话少说 赶紧开始吧,,哈哈
首先创建一个新的场景&
点击菜单栏中的 Terrain-& create Terrain 菜单 &
完成后如 下图
创建地形系统的时候 unity会按默认的 宽高&图像分辨率,纹理分辨率 等创建一个地形 &不过不怕 这些我们都可以修改滴&&
&&如果需要在game 窗口(即是游戏运行窗口)中看效果 ,需要调整下摄像机的位置和角度 &
操作方式 &选中&&Hierarchy 中的 main camera 摄像机 然后使用 场景编辑器上面那4 个 功能(拖动,移动,旋转,缩放)进行调节即可 调节过程中就可以再game 窗口中看到效果啦, & 各位童鞋 多操作几次就可以熟练操作了
点击 Terrain -&resolution 菜单 可以设置地形的各个参数
如上图所示从上到下分别代表的含义是
Terrain Width:&地形的宽度
Terrain Height:&地形的高度
Terrain Length:地形的长度
HeightMap Resolution:地形高度图的分辨率.&
Detail Resolution:细节分辨率,控制草和细节网格地图的分辨率。数值越高标示效果越好,想对也越消耗机器性能,可能会卡。根据情况适当的调节。
Control Texture Resolution:控制不同纹理的分辨率。
Base Texture Resolution:控制相对纹理分辨率,这里指一定范围内的。
设置完毕点击&set Resolution按钮,有兴趣的朋友可以动态的修改一下参数,看看你的地形发生了什么样的改变?
修改完后我们来给地形添加点元素吧&
选中 Hierarchy 中的 刚刚创建的terrain 地形 右边出现了地形的编辑窗口
上图中 的红框框 讲解 &从上 到下
1: position 是地形的 位置坐标 &
& &rotation 的旋转坐标
& &scale & 缩放比例
& &这个位置任何游戏组件都有这 3 个属性
2: &这7 个属性 从左往右 分别是&编辑高度、编辑特定高度、设置平滑、纹理贴图、画树模型、画草模型、其他设置.善用着七个工具可以编辑一个非常不错的游戏地形,稍后我会介绍这七个按钮的具体操作流程。
&2.1 选中编辑高度 & 下面出现 barusher 和 settings &属性栏
Brushes:地形绘制画笔,这里有很多种画笔的图案可供我们选择。
Brush Size :画笔宽度取值范围
Opacity :画笔高度取值范围
各位童鞋 可以修改参数 在地图系统上 绘制 高度 感受这些参数的 意义&
上图是我使用编辑高度拖拽出来的效果 &现在有点难看哈 ,,没事滴 & 我们继续完善它&
2.2 &编辑特定高度
和编辑高度页面中的信息差不多,只是多了一个Height用来设置最大的高度,编辑高度中Opacity是最大高度,但是在这里Height才是最大高度但是Opacity必需有数值,举个例子Opacity设置为100 &Height设置&80&最高的高度就是80 & .Opacity设置为20 &Height设置&100最高的高度还是20. &&
2.3 设置平滑
用上面拉出来的地形 如果 近距离看 会发现 有些山峰 的边角会有些粗糙, 这时我们就可以使用 设置平滑来 山峰的边角平滑过渡
2.4 &纹理贴图
这个东东呢 ,就是给地图加上图片 ,从而实现 好看的地图 而非像上面光光的 &图片资源方面我们可以导入系统标准的资源库,里面有很多好看的地形资源,当然也可以自己添加喜欢的图片做地形资源。
导入系统 图片资源 &选择 &菜单栏中的assets -& import package -& terrain assets & 点击导入 ,这里只是导入 地形系统的资源 &在此次你也可以导入其他资源 & 如下图
点击Edit Textures &出现一个下拉列表
&add Textures&添加一个贴图&
&Edit Textures &编辑贴图
&Remove Textures删除贴图
点击 addTextures 添加一个贴图&
如图 中的 箭头 标记 &选择一个 你喜欢的地形图片 &给地形&
Add Terrain Texture (添加贴图)
splat :选择一个贴图,上面导入了系统自带的地形资源,在这里随便添加两个贴图用于区分资源。也可以添加自己喜欢的图片,拖放在工程中就可以在这里看到图片资源。
Tile size x:&设置贴图X轴宽度
Tile size x:设置贴图Y轴宽度
Tile offset x:设置贴图X轴偏移量
Tile offset y:设置贴图Y轴偏移量
有兴趣的童鞋修改一下参数方可看到效果,这里暂时使用默认数值。。
现在回头看看 是不是好看多了 , 精彩还在后面的 ,我们继续 ....
2.5 &&画树模型&
既然 是地形 当然是有树啦 &
Hierarchy 标签栏中,点击Create - & Tree 可以创建一个树的模型,设置自己的树木模型,这里我们先导入系统自带的树木模型,以后在讨论自定义模型的制作。
因为新建的工程中是没有树木和草地的贴图元素,可以在Unity3D 的标准资源库中导入,导入的方法和纹理贴图介绍的一样。打开Unity3D 在Project标签栏中 鼠标右键 Import package - & Tree Creator 将标准树木资源模型导入工程。
点击&Add Terrain Texture 添加一个 树模型 &过程和 添加纹理贴图 类似&
在上图中 花树模型的 属性&
Brush Size : 画笔绘制一次树木添加数量,数值越大越多,越小则越少,取值范围0到100。
Tree Density:树之间的百分比,在一片树中间在放入量一片树就得修改这个数值了,取值范围0到100。
Color Variation:树之间颜色差的范围,取值范围0到1。
TreeHeight:树的高度,它是与场景模型有一定比例,越大树越高,取值范围0到200。
Variation:树与树之间的高度比例,取值范围0到30。
Tree Width:树的宽度,它是与场景模型有一定比例,越大树越宽,取值范围0到200。
Variation:&树与树之间的宽度比例,取值范围0到30。
童鞋可以 调整这些参数 才地形上 花 并观看 效果&
我在 地形上 添加了 树 效果如下
game 游戏运行时的效果 如图
但我们在 游戏 的 game 窗口中 看 效果 会 发现 &地形中 灰暗暗的一片 &这是为什么呢 , 这是因为 光线不够 , & 这些unity 都为我们想好了 ,记得我们 前面有一章讲了 game object 吗 ? &现在我们来添加一个 平行光 (如何添加平行光 不知道的童鞋去看&& 添加游戏组件&),给 地形加点 亮度
各位童鞋注意哦,平行光的位置对游戏中的亮度是没有关系的, 角度才对亮度有关系, 所以我们添加了 平行光 旋转旋转角度就可以搞定了 &&
如下图 是不是好看多了 &
画草模型:
起始它不仅能草,还能画一些自定义模型,可以处理一些零碎的小东西丰富游戏场景 它或 画树模型有些类似 &这里就不再多啰嗦了&
主要设置一些3D游戏地形的一些参数
一下面列出一些主要参数的介绍,盆友们可以自己拖动鼠标修改一下其中的具体数值就可以在游戏视图中清晰的看到效果。
Pixel Error:控制地形密度容差,数值越大越圆滑,越小地形角度越明显。
Base Map Dist:控制地形贴图的距离.
Case shadows: 是否显示地形阴影
Draw:是否绘制绘制场景模型,比如树,草等等。
Wind Settings&地形中风的设置
Speed:风速&
Size:风的范围
学习了这一章 童鞋们赶快 试试 制作自己的喜欢的游戏地形吧 , & 哈哈 ,, 这章暂时就到这了 , &有什么不明白的地方或遗漏的地方 &欢迎积极留言 , 大家共同学习 共同进步 咔咔&
阅读(...) 评论()【转】Unity3D实现动态加载游戏资源
在flash时代,资源的动态加载非常的普遍,主要是受限于网速的快慢,我们在用unity3d制作在线项目的时候,不可避免的要考虑到优化加载的问题,这篇文章算是比较好的经验之谈了,转来大家看看!用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载。比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕。应该优先加载用户附近的场景资源,在游戏的过程中,不影响操作的情况下,后台加载剩余的资源,直到所有加载完毕。
本文包含一些代码片段讲述实现这个技术的一种方法。本方法不一定是最好的,希望能抛砖引玉。代码是C#写的,用到了Json,还有C#的事件机制。
在讲述代码之前,先想象这样一个网络游戏的开发流程。首先美工制作场景资源的3D建模,游戏设计人员把3D建模导进Unity3D,托托拽拽编辑场景,完成后把每个gameobject导出成XXX.unity3d格式的资源文件(参看BuildPipeline),并且把整个场景的信息生成一个配置文件,xml或者Json格式(本文使用Json)。最后还要把资源文件和场景配置文件上传到服务器,最好使用CMS管理。客户端运行游戏时,先读取服务器的场景配置文件,再根据玩家的位置从服务器下载相应的资源文件并加载,然后开始游戏,注意这里并不是下载所有的场景资源。在游戏的过程中,后台继续加载资源直到所有加载完毕。&
一个简单的场景配置文件的例子:&
MyDemoSence.txt&
Json代码:
&&& "AssetList"
"Name" : "Chair 1",
"Source" : "Prefabs/Chair001.unity3d",
"Position" : [2,0,-5],
"Rotation" : [0.0,60.0,0.0]
"Name" : "Chair 2",
"Source" : "Prefabs/Chair001.unity3d",
"Position" : [1,0,-5],
"Rotation" : [0.0,0.0,0.0]
"Name" : "Vanity",
"Source" : "Prefabs/vanity001.unity3d",
"Position" : [0,0,-4],
"Rotation" : [0.0,0.0,0.0]
"Name" : "Writing Table",
"Source" : "Prefabs/writingTable001.unity3d",
"Position" : [0,0,-7],
"Rotation" : [0.0,0.0,0.0],
"AssetList" : [{
&&&&&&&&&&&
"Name" : "Lamp",
&&&&&&&&&&&
"Source" : "Prefabs/lamp001.unity3d",
&&&&&&&&&&&
"Position" : [-0.5,0.7,-7],
&&&&&&&&&&&
"Rotation" : [0.0,0.0,0.0]
AssetList:场景中资源的列表,每一个资源都对应一个unity3D的gameobject&
Name:gameobject的名字,一个场景中不应该重名&
Source:资源的物理路径及文件名&
Position:gameobject的坐标&
Rotation:gameobject的旋转角度&
你会注意到Writing
Table里面包含了Lamp,这两个对象是父子的关系。配置文件应该是由程序生成的,手工也可以修改。另外在游戏上线后,客户端接收到的配置文件应该是加密并压缩过的。
主程序: C#代码
public class MainMonoBehavior : MonoBehaviour {
&&& public
delegate void MainEventHandler(GameObject dispatcher);
&&& public event
MainEventHandler StartE
&&& public event
MainEventHandler UpdateE
&&& public void
ResourceManager.getInstance().LoadSence("Scenes/MyDemoSence.txt");
if(StartEvent != null){
&&&&&&&&&&&
StartEvent(this.gameObject);
&&& public void
Update() {
if (UpdateEvent != null) {
&&&&&&&&&&&
UpdateEvent(this.gameObject);
这里面用到了C#的事件机制,大家可以看看我以前翻译过的国外一个牛人的文章:C#
事件和Unity3D&
在start方法里调用ResourceManager,先加载配置文件。每一次调用update方法,MainMonoBehavior会把update事件分发给ResourceManager,因为ResourceManager注册了MainMonoBehavior的update事件。
在LoadSence方法里先创建一个Asset的对象,这个对象是对应于配置文件的,设置type是Json,source是传进来的“Scenes/MyDemoSence.txt”。然后注册MainMonoBehavior的update事件。
ResourceManager.cs
private MainMonoBehavior mainMonoB
private string mResourceP
private Scene mS
private Asset mSceneA
private ResourceManager() {
mainMonoBehavior = GameObject.Find("Main
Camera").GetComponent&MainMonoBehavior&();
mResourcePath = PathUtil.getResourcePath();
public void LoadSence(string fileName) {
&&& mSceneAsset
= new Asset();
mSceneAsset.Type = Asset.TYPE&_&JSON;
mSceneAsset.Source = fileN
mainMonoBehavior.UpdateEvent += OnU
在LoadSence方法里先创建一个Asset的对象,这个对象是对应于配置文件的,设置type是Json,source是传进来的“Scenes/MyDemoSence.txt”。然后注册MainMonoBehavior的update事件。
public void OnUpdate(GameObject dispatcher) {
(mSceneAsset != null) {
LoadAsset(mSceneAsset);
if (!mSceneAsset.isLoadFinished) {
&&&&&&&&&&&
//clear mScene and mSceneAsset for next LoadSence call
mSceneAsset =
mainMonoBehavior.UpdateEvent -= OnU
OnUpdate方法里调用LoadAsset加载配置文件对象及所有资源对象。每一帧都要判断是否加载结束,如果结束清空mScene和mSceneAsset对象为下一次加载做准备,并且取消update事件的注册。
最核心的LoadAsset方法:
private Asset LoadAsset(Asset asset) {
&&& string
fullFileName = mResourcePath + "/" + asset.S
&&& //if www
resource is new, set into www cache
(!wwwCacheMap.ContainsKey(fullFileName)) {
if (asset.www == null) {
&&&&&&&&&&&
asset.www = new WWW(fullFileName);
&&&&&&&&&&&
if (!asset.www.isDone) {
&&&&&&&&&&&
wwwCacheMap.Add(fullFileName, asset.www);
传进来的是要加载的资源对象,先得到它的物理地址,mResourcePath是个全局变量保存资源服务器的网址,得到fullFileName类似&。然后通过wwwCacheMap判断资源是否已经加载完毕,如果加载完毕把加载好的www对象放到Map里缓存起来。看看前面Json配置文件,Chair
1和Chair 2用到了同一个资源Chair001.unity3d,加载Chair
2的时候就不需要下载了。如果当前帧没有加载完毕,返回null等到下一帧再做判断。这就是WWW类的特点,刚开始用WWW下载资源的时候是不能马上使用的,要等待诺干帧下载完成以后才可以使用。可以用yield返回www,这样代码简单,但是C#要求调用yield的方法返回IEnumerator类型,这样限制太多不灵活。
继续LoadAsset方法:
(asset.Type == Asset.TYPE&_&JSON)
if (mScene == null) {
&&&&&&&&&&&
string jsonTxt = mSceneAsset.www.
&&&&&&&&&&&
JsonMapper.ToObject&Scene&(jsonTxt);
//load scene
foreach (Asset sceneAsset in mScene.AssetList) {
&&&&&&&&&&&
if (sceneAsset.isLoadFinished) {
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&&&
LoadAsset(sceneAsset);
&&&&&&&&&&&&&&&
if (!sceneAsset.isLoadFinished) {
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
代码能够运行到这里,说明资源都已经下载完毕了。现在开始加载处理资源了。第一次肯定是先加载配置文件,因为是Json格式,用JsonMapper类把它转换成C#对象,我用的是LitJson开源类库。然后循环递归处理场景中的每一个资源。如果没有完成,返回null,等待下一帧处理。
继续LoadAsset方法:
&&& else if
(asset.Type == Asset.TYPE&_&GAMEOBJECT)
{ //Gameobject
if (asset.gameObject == null) {
&&&&&&&&&&&
wwwCacheMap[fullFileName].assetBundle.LoadAll();
&&&&&&&&&&&
GameObject go =
(GameObject)GameObject.Instantiate(wwwCacheMap[fullFileName].assetBundle.mainAsset);
&&&&&&&&&&&
UpdateGameObject(go, asset);
&&&&&&&&&&&
asset.gameObject =
if (asset.AssetList != null) {
&&&&&&&&&&&
foreach (Asset assetChild in asset.AssetList) {
&&&&&&&&&&&&&&&
if (assetChild.isLoadFinished) {
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
Asset assetRet = LoadAsset(assetChild);
&&&&&&&&&&&&&&&&&&&
if (assetRet != null) {
&&&&&&&&&&&&&&&&&&&&&&&
assetRet.gameObject.transform.parent =
asset.gameObject.
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
asset.isLoadFinished = ***e;
&&& return
终于开始处理真正的资源了,从缓存中找到www对象,调用Instantiate方法实例化成Unity3D的gameobject。UpdateGameObject方法设置gameobject各个属性,如位置和旋转角度。然后又是一个循环递归为了加载子对象,处理gameobject的父子关系。注意如果LoadAsset返回null,说明www没有下载完毕,等到下一帧处理。最后设置加载完成标志返回asset对象。
UpdateGameObject方法:
private void UpdateGameObject(GameObject go, Asset asset) {
&&& //name
&&& go.name =
//position
&&& Vector3
vector3 = new Vector3((float)asset.Position[0],
(float)asset.Position[1], (float)asset.Position[2]);
go.transform.position = vector3;
//rotation
&&& vector3 =
new Vector3((float)asset.Rotation[0], (float)asset.Rotation[1],
(float)asset.Rotation[2]);
go.transform.eulerAngles = vector3;
这里只设置了gameobject的3个属性,眼力好的同学一定会发现这些对象都是“死的”,因为少了脚本属性,它们不会和玩家交互。设置脚本属性要复杂的多,编译好的脚本随着主程序下载到本地,它们也应该通过配置文件加载,再通过C#的反射创建脚本对象,赋给相应的gameobject。
最后是Scene和asset代码:
public class Scene {
&&& public
List&Asset& AssetList {
public class Asset {
&&& public const
byte TYPE&_&JSON
&&& public const
byte TYPE&_&GAMEOBJECT
&&& public
//default type is gameobject for json load
Type = TYPE&_&GAMEOBJECT;
&&& public byte
&&& public
string Name {
&&& public
string Source {
&&& public
double[] Bounds {
&&& public
double[] Position {
&&& public
double[] Rotation {
&&& public
List&Asset& AssetList {
&&& public bool
isLoadFinished {
&&& public WWW
&&& public
GameObject gameObject {
代码就讲完了,在我实际测试中,会看到gameobject一个个加载并显示在屏幕中,并不会影响到游戏操作。代码还需要进一步完善适合更多的资源类型,如动画资源,文本,字体,图片和声音资源。
动态加载资源除了网络游戏必需,对于大公司的游戏开发也是必须的。它可以让游戏策划(负责场景设计),美工和程序3个角色独立出来,极大提高开发效率。试想如果策划改变了什么NPC的位置,美工改变了某个动画,或者改变了某个程序,大家都要重新倒入一遍资源是多么低效和麻烦的一件事。&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Unity3D脚本:Unity3D实现动态加载游戏资源 | Unity3D教程手册
当前位置 :
» Unity3D脚本:Unity3D实现动态加载游戏资源
Unity3D脚本:Unity3D实现动态加载游戏资源
用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载。比如想加载一个大
场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕。应该优先加载用户附近的场景资源,在游戏的过程中,不影响操作的情况下,后台加载剩
余的资源,直到所有加载完毕。
本文包含一些代码片段讲述实现这个技术的一种方法。本方法不一定是最好的,希望能抛砖引玉。代码是C#写的,用到了Json,还有C#的事件机制。
在讲述代码之前,先想象这样一个网络游戏的开发流程。首先美工制作场景资源的3D建模,游戏设计人员把3D建模导进Unity3D,托托拽拽编辑场
景,完成后把每个gameobject导出成XXX.unity3d格式的资源文件(参看BuildPipeline),并且把整个场景的信息生成一个配
置文件,xml或者Json格式(本文使用Json)。最后还要把资源文件和场景配置文件上传到服务器,最好使用CMS管理。客户端运行游戏时,先读取服
务器的场景配置文件,再根据玩家的位置从服务器下载相应的资源文件并加载,然后开始游戏,注意这里并不是下载所有的场景资源。在游戏的过程中,后台继续加
载资源直到所有加载完毕。
一个简单的场景配置文件的例子:
MyDemoSence.txt
Json代码:
"AssetList" : [{
"Name" : "Chair 1",
"Source" : "Prefabs/Chair001.unity3d",
"Position" : [2,0,-5],
"Rotation" : [0.0,60.0,0.0]
"Name" : "Chair 2",
"Source" : "Prefabs/Chair001.unity3d",
"Position" : [1,0,-5],
"Rotation" : [0.0,0.0,0.0]
"Name" : "Vanity",
"Source" : "Prefabs/vanity001.unity3d",
"Position" : [0,0,-4],
"Rotation" : [0.0,0.0,0.0]
"Name" : "Writing Table",
"Source" : "Prefabs/writingTable001.unity3d",
"Position" : [0,0,-7],
"Rotation" : [0.0,0.0,0.0],
"AssetList" : [{
"Name" : "Lamp",
"Source" : "Prefabs/lamp001.unity3d",
"Position" : [-0.5,0.7,-7],
"Rotation" : [0.0,0.0,0.0]
AssetList:场景中资源的列表,每一个资源都对应一个Unity3D的gameobjectName:gameobject的名字,一个场景中不应该重名
Source:资源的物理路径及文件名
Position:gameobject的坐标
Rotation:gameobject的旋转角度
你会注意到Writing Table里面包含了Lamp,这两个对象是父子的关系。配置文件应该是由程序生成的,手工也可以修改。另外在游戏上线后,客户端接收到的配置文件应该是加密并压缩过的。
public class MainMonoBehavior : MonoBehaviour {
public delegate void MainEventHandler(GameObject dispatcher);
public event MainEventHandler StartE
public event MainEventHandler UpdateE
public void Start() {
ResourceManager.getInstance().LoadSence("Scenes/MyDemoSence.txt");
if(StartEvent != null){
StartEvent(this.gameObject);
public void Update() {
if (UpdateEvent != null) {
UpdateEvent(this.gameObject);
  这里面用到了C#的事件机制。在start方法里调用ResourceManager,先加载配置文件。每一次调用update方
法,MainMonoBehavior会把update事件分发给ResourceManager,因为ResourceManager注册了
MainMonoBehavior的update事件。
ResourceManager.cs
private MainMonoBehavior mainMonoB
private string mResourceP
private Scene mS
private Asset mSceneA
private ResourceManager() {
mainMonoBehavior = GameObject.Find("Main Camera").GetComponent&MainMonoBehavior&();
mResourcePath = PathUtil.getResourcePath();
public void LoadSence(string fileName) {
mSceneAsset = new Asset();
mSceneAsset.Type = Asset.TYPE_JSON;
mSceneAsset.Source = fileN
mainMonoBehavior.UpdateEvent += OnU
  在LoadSence方法里先创建一个Asset的对象,这个对象是对应于配置文件的,设置type是Json,source是传进来的“Scenes/MyDemoSence.txt”。然后注册MainMonoBehavior的update事件。
public void OnUpdate(GameObject dispatcher) {
if (mSceneAsset != null) {
LoadAsset(mSceneAsset);
if (!mSceneAsset.isLoadFinished) {
//clear mScene and mSceneAsset for next LoadSence call
mSceneAsset =
mainMonoBehavior.UpdateEvent -= OnU
OnUpdate方法里调用LoadAsset加载配置文件对象及所有资源对象。每一帧都要判断是否加载结束,如果结束清空mScene和mSceneAsset对象为下一次加载做准备,并且取消update事件的注册。最核心的LoadAsset方法:
private Asset LoadAsset(Asset asset) {
string fullFileName = mResourcePath + "/" + asset.S
//if www resource is new, set into www cache
if (!wwwCacheMap.ContainsKey(fullFileName)) {
if (asset.www == null) {
asset.www = new WWW(fullFileName);
if (!asset.www.isDone) {
wwwCacheMap.Add(fullFileName, asset.www);
传进来的是要加载的资源对象,先得到它的物理地址,mResourcePath是个全局变量保存资源服务器的网址,得到fullFileName。
然后通过wwwCacheMap判断资源是否已经加载完毕,如果加载完毕把加载好的www对象放到Map里缓存起来。看看前面Json配置文
件,Chair 1和Chair 2用到了同一个资源Chair001.unity3d,加载Chair
2的时候就不需要下载了。如果当前帧没有加载完毕,返回null等到下一帧再做判断。这就是WWW类的特点,刚开始用WWW下载资源的时候是不能马上使用
的,要等待诺干帧下载完成以后才可以使用。可以用yield返回www,这样代码简单,但是C#要求调用yield的方法返回IEnumerator类
型,这样限制太多不灵活。继续LoadAsset方法:
if (asset.Type == Asset.TYPE_JSON) { //Json
if (mScene == null) {
string jsonTxt = mSceneAsset.www.
mScene = JsonMapper.ToObject&Scene&(jsonTxt);
//load scene
foreach (Asset sceneAsset in mScene.AssetList) {
if (sceneAsset.isLoadFinished) {
LoadAsset(sceneAsset);
if (!sceneAsset.isLoadFinished) {
代码能够运行到这里,说明资源都已经下载完毕了。现在开始加载处理资源了。第一次肯定是先加载配置文件,因为是Json格式,用
JsonMapper类把它转换成C#对象,我用的是LitJson开源类库。然后循环递归处理场景中的每一个资源。如果没有完成,返回null,等待下
一帧处理。继续LoadAsset方法:
else if (asset.Type == Asset.TYPE_GAMEOBJECT) { //Gameobject
if (asset.gameObject == null) {
wwwCacheMap[fullFileName].assetBundle.LoadAll();
GameObject go = (GameObject)GameObject.Instantiate(wwwCacheMap[fullFileName].assetBundle.mainAsset);
UpdateGameObject(go, asset);
asset.gameObject =
if (asset.AssetList != null) {
foreach (Asset assetChild in asset.AssetList) {
if (assetChild.isLoadFinished) {
Asset assetRet = LoadAsset(assetChild);
if (assetRet != null) {
assetRet.gameObject.transform.parent = asset.gameObject.
asset.isLoadFinished =
终于开始处理真正的资源了,从缓存中找到www对象,调用Instantiate方法实例化成Unity3D的gameobject。
UpdateGameObject方法设置gameobject各个属性,如位置和旋转角度。然后又是一个循环递归为了加载子对象,处理
gameobject的父子关系。注意如果LoadAsset返回null,说明www没有下载完毕,等到下一帧处理。最后设置加载完成标志返回
asset对象。UpdateGameObject方法:
private void UpdateGameObject(GameObject go, Asset asset) {
go.name = asset.N
//position
Vector3 vector3 = new Vector3((float)asset.Position[0], (float)asset.Position[1], (float)asset.Position[2]);
go.transform.position = vector3;
//rotation
vector3 = new Vector3((float)asset.Rotation[0], (float)asset.Rotation[1], (float)asset.Rotation[2]);
go.transform.eulerAngles = vector3;
这里只设置了gameobject的3个属性,眼力好的同学一定会发现这些对象都是“死的”,因为少了脚本属性,它们不会和玩家交互。设置脚本属性
要复杂的多,编译好的脚本随着主程序下载到本地,它们也应该通过配置文件加载,再通过C#的反射创建脚本对象,赋给相应的gameobject。最后是
Scene和asset代码:
public class Scene {
public List&Asset& AssetList {
public class Asset {
public const byte TYPE_JSON = 1;
public const byte TYPE_GAMEOBJECT = 2;
public Asset() {
//default type is gameobject for json load
Type = TYPE_GAMEOBJECT;
public byte Type {
public string Name {
public string Source {
public double[] Bounds {
public double[] Position {
public double[] Rotation {
public List&Asset& AssetList {
public bool isLoadFinished {
public WWW www {
public GameObject gameObject {
  在实际测试中,会看到gameobject一个个加载并显示在屏幕中,并不会影响到游戏操作。代码还需要进一步完善适合更多的资源类型,如动画资源,文本,字体,图片和声音资源。
【上一篇】
【下一篇】
您可能还会对这些文章感兴趣!

我要回帖

更多关于 视频加载的默认图片 的文章

 

随机推荐