Unity3d Web3d资源的动态加载

@灰太龙

参考了宣雨松的博客,原文出处http://www.xuanyusong.com/archives/2405,如果涉及到侵权,请通知我!

Unity3d Web3d资源的动态加载中,用到了AssetBundle,在这儿我讲解一下,AssetBundle是个什么东西,AssetBundle可以将GameObject和这个GameObject所需要的资源一起打包进来,也就是说在Web端需要实例化这个资源的时候,就去下载这个所需要的资源,并且实例化这个东西!

下面列出打包的代码:

 using UnityEngine;
using System.Collections;
using System.IO;
using UnityEditor;
public class ExportAssetBundle : EditorWindow { [MenuItem("Custom Editor/Create AssetBunldes Main")]
static void CreateAssetBunldesMain ()
{
//获取在Project视图中选择的所有游戏对象
Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);
//遍历所有的游戏对象
foreach (Object obj in SelectedAsset)
{
string sourcePath = AssetDatabase.GetAssetPath (obj);
//本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径
//StreamingAssets是只读路径,不能写入
//服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。
string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";
if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)) {
Debug.Log(obj.name +"资源打包成功");
}
else
{
Debug.Log(obj.name +"资源打包失败");
}
}
//刷新编辑器
AssetDatabase.Refresh ();
}
[MenuItem("Custom Editor/Create AssetBunldes ALL")]
static void CreateAssetBunldesALL ()
{ Caching.CleanCache ();
string Path = Application.dataPath + "/StreamingAssets/ALL.assetbundle"; Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets); foreach (Object obj in SelectedAsset)
{
Debug.Log ("Create AssetBunldes name :" + obj);
} //这里注意第二个参数就行
if (BuildPipeline.BuildAssetBundle (null, SelectedAsset, Path, BuildAssetBundleOptions.CollectDependencies)) {
AssetDatabase.Refresh ();
} else { }
}
[MenuItem("Custom Editor/Foreach AssetBunldes ALL")]
static void ExportAllAssetBunldesAll()
{
StreamWriter write=new StreamWriter(Application.dataPath + "/StreamingAssets/gameobjects.txt");
Caching.CleanCache();
Object[] SeletedAsset=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);
foreach(Object obj in SeletedAsset)
{
write.Write(obj.name+" ");
Debug.Log(obj.name.ToString());
string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";
if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies))
{
Debug.Log(obj.name +"资源打包成功");
}
else
{
Debug.Log(obj.name +"资源打包失败");
}
}
write.Flush();
write.Close();
}
}

下面是要所有GameObject做成Prefab,然后对Prefab进行打包,打包成assetbundle文件,然后加载了这个assetbundle资源之后,就可以用Instantiate的方式,建立这个物体!

选择Custom Editor/Foreach AssetBunldes ALL打包,可以打包所选择的所有预制件,并且生成了一个gameobjects.txt文件,打包的时候assetbundle的文件名和预制件的名字一样,

那么我们初始化物体的时候,需要读取这个gameobjects.txt文件,依次初始化物体, 这样就实现了物体的分块加载!

加载代码如下:

 using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Net;
public class Load : MonoBehaviour { // Use this for initialization
void Start () {
StartCoroutine(START());
}
private IEnumerator START()
{
string temp="";
string url="http://--------------------------------------------/gameobjects.txt";
WWW www=new WWW(url);
yield return www;
temp=www.text;
string asseturl="http://-----------------------------------";
string[] temp1=temp.Split(' ');
for(int i=;i<temp1.Length;i++)
{
Debug.Log(temp1[i].ToString()+"-------------");
StartCoroutine(LoadMainCacheGameObject(asseturl+temp1[i]+".asset"));
}
}
private IEnumerator LoadMainCacheGameObject(string path)
{
WWW bundle = WWW.LoadFromCacheOrDownload(path,);
yield return bundle;
//加载到游戏中
yield return Instantiate(bundle.assetBundle.mainAsset);
bundle.assetBundle.Unload(false);
}
}

通过for循环依次加载物体!还有个问题就是打包的assetbundle中初始化出来的Prefab,有些脚本指向的GameObject或者Transform丢失,这个时候,可以有GameObject.FindWithTag的功能或者GameObject.Find来查找物体,也就是说专门有一个脚本去为另一个脚本赋值,这个脚本如果完成了赋值操作,就Destory(this)来销毁自己!举个例子!这个Set脚本,就是为加在同一个GameObject的物体的igui的一个脚本中变量赋值的,当赋值工作完成后,就Destory(this)来销毁脚本!

 using UnityEngine;
using System.Collections; public class Set : MonoBehaviour { iGUICode_demo demo;
bool flag1=false;
bool flag2=false;
bool flag3=false;
bool flag4=false;
void Start()
{
demo=GetComponent<iGUICode_demo>();
}
// Update is called once per frame
void Update () {
if(!flag1)
{
GameObject temp1=GameObject.FindWithTag("AutoWander");
if(temp1!=null)
{
demo._autoPerson=temp1;
flag1=true;
}
}
if(!flag2)
{
GameObject temp2=GameObject.FindWithTag("ManualWander");
if(temp2!=null)
{
demo._manualPerson=temp2;
ObjManager._camera=temp2;
flag2=true;
}
}
if(!flag3)
{
GameObject temp3= GameObject.Find("iGUIListBoxSimple(Clone)");
if(temp3!=null)
{
ObjManager._window=temp3;
flag3=true;
}
}
if(flag1&&flag2&&flag3)
{
demo._autoPerson.SetActive(false);
Destroy(this);
}
}
}

1.我看到别人把每个物体导出为.unity3d,然后也导出了变换信息,我认为这是不需要的,因为预制件中已经包含了这些信息!

2.还有就是有的问题需要注意,比如角色站在地板上,那么如果角色在地板之前加载,那么角色会掉下去,这个时候,要先加载地板,或者后加载地板,设置人物不受重力影响!等地板加载完之后,再设置人物受重力影响,防止掉落下去!

Unity3d Web3d资源的动态加载的更多相关文章

  1. 【Unity3D】Unity3D之 Resources.Load 动态加载资源

    [Unity3D]Unity3D之 Resources.Load 动态加载资源 1.Resources.Load:使用这种方式加载资源,首先需要下Asset目录下创建一个名为Resources的文件夹 ...

  2. [UE4]一个好用的虚幻4插件,根据资源名称动态加载资源,GetCurrentLeveName(获得当前地图名称)

    下载地址 一.下载与UE4相对应的版本 二.在工程根目录新建Plugins目录,解压插件. 三.如果工程已经打开,则需要重新打开   四.重新打开工程后,右下角会有提示有新插件可用. 五.这个插件提供 ...

  3. 【NGUI】Unity3D UIGrid 排序、动态加载与销毁

    本帖最后由 Lucifer_H 于 2014-10-31 09:39 编辑 做 UIGrid 的动态加载是做游戏的装备列表时用到的,装备信息都是从后台发过来的,具体加载的代码如下: [C#] 纯文本查 ...

  4. unity3d 加密资源并缓存加载

    原地址:http://www.cnblogs.com/88999660/archive/2013/04/10/3011912.html 首先要鄙视下unity3d的文档编写人员极度不负责任,到发帖为止 ...

  5. (转)unity3d加密资源并缓存加载

    http://www.haogongju.net/art/1931680 首先要鄙视下unity3d的文档编写人员极度不负责任,到发帖为止依然没有更新正确的示例代码. view source   pr ...

  6. 在Unity3D的网络游戏中实现资源动态加载

    用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游 ...

  7. (转)在Unity3D的网络游戏中实现资源动态加载

    原文:http://zijan.iteye.com/blog/911102 用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的 ...

  8. unity3d动态加载资源

    在Unity3D的网络游戏中实现资源动态加载 分类: 最新学习2012-06-14 13:35 1127人阅读 评论(0) 收藏 举报 网络游戏nullvectorjson游戏string 用Unit ...

  9. Unity3D动态加载外部资源

    最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别.Resources ...

随机推荐

  1. C语言--函数

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenVveW91MTMxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  2. 屏蔽全部统计代码(51.la cnzz 百度统计 谷歌分析师adsense、屏蔽淘宝客广告代码)的方法

    支持百度统计 .51.la统计.cnzz统计.51yes统计.谷歌分析师.阿里妈妈淘宝客广告.chinaz弹窗.假设有很多其它的须要屏蔽的,欢迎联系 default7#zbphp.com 改动etc的 ...

  3. 如何在word2007中并排查看对比显示两个文档

    使用word编辑或修改文件时,有时会需要对两个文档进行对比,此时就应该使用并排查看功能. 点击“视图”菜单中的“并排查看” 所打开的两个文档就会同时打开,并排显示 可点击“同步滚动”设置或取消同步滚动

  4. 彻底理解Cisco/Linux/Windows的IP路由

    -1.只要理解实质,名称并不重要! 很多使用Linux的网络高手在面对Cisco管理员的诸如管理距离,路由度量等词汇时,还没有PK就自觉败下阵来了.我觉得这实在太可惜了,大家本是一家,为何这么为难对方 ...

  5. android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效的解决方法

    Android横竖屏幕切换时注意4.0以上配置configChanges要加上screenSize,要不还会调用onCreate(). <activity android:name=" ...

  6. OOP 概述

    面向对象程序设计基于四个基本概念:数据抽象.封装.继承和动态绑定. 类的基本思想是数据抽象和封装. 1 数据抽象 数据抽象是一种依赖于接口和实现分离的编程技术.类的接口包括用户所能执行的操作:类的实现 ...

  7. FastJson解析对象及对象数组--项目经验

    第一次使用json,解析工具为FastJson,使用语言为java 常见的json解析实例,以map为例: Map<String,String> map=new HashMap<St ...

  8. 剑指offer: 38 数字在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5} 和数字3,输出4. 思路如下 1. 预估时间复杂度,最复杂情况是,顺序扫描,统计K出现的次数,时间复杂 ...

  9. 如何学习一门新技术-iOS开发

    如何快速学习一门新技术 以CoreBluetooth 蓝牙开发为例.我们可以从官方获得的资源有:SampleCode, Documentation,API Reference. 先从Documenta ...

  10. maven占位符

    maven占位符默认是${} 也可以自己指定. pom.xml配置如下: <plugin> <groupId>org.apache.maven.plugins</grou ...