unity3d教程:AssetBundle

此代码是最终调试后可行代码,通过下面的制作过程和代码来逐步解释。

脚本:

Script_Cube_Trigger_Terrain1.cs  

  Script_Cube_Trigger_Terrain3.cs  

  Objects:

1、人物资源,需要有CharactorController,不然无法做object的Trigger碰撞响应。

2、两个Cube,在其Inspector面板中,将BoxCollider下的IsTrigger属性勾选上,调整该Cube的形状,作为加载地形的触发点,我把它们放在地形交界点处,玩家碰触后加载对面的地形。

3、将脚本绑定在两个cube上。

4、把各个地形块都制作好后,将地形上的Object作为地形对象的子节点。在Project视图里,创建几个prefab文件,将地形文件分别拖入其中,然后制作成AssetBundle。

5、制作过程中发现一个重大的问题,客户端模式Build出来的文件或者在编辑器中直观看到的结果,和Build成Web格式后的结果有些不一样。可能是WebPlayer的数据要依据固定的stream来源---WWW对象。而在CS脚本里所定义的成员或静态成员Object对象均无法保存当前WWW对象刚下载后的资源,造成下载部分和加载部分代码不能分开写,否则会因为丢失对象而加载失败,更糟糕的是在Web模式下,是不会报告什么错误的。所以这里解释下,两个脚本分别对应两个Cube的原因,就是各自保存了一份WWW对象,分别记录着自己所下载过的资源。注意不要用AssetBundleRequest对象来保存WWW对象中的asset,虽然手册上例子是这样写,但我们的问题也出现在这里,在经验和资料还不充分的情况下先做备案。

脚本代码:

using UnityEngine;  

  using System.Collections;  

  public class Script_Cube_Trigger_Terrain1 : MonoBehaviour {  

  int Flag = 0;  //记录是否已经加载过该资源,避免多次加载  

  //AssetBundleRequest abr;    <---- 刚才说的就是这里,暂时先不要用  

  string debugstr = “”;    //调试信息  

  static WWW wwwObj;        //每个场景中一个单独的对象  

  void Start ()  

  {  

  if(Flag == 0)  

  {  

  //判断平台信息,如果是webPlayer就从网络上加载,如果是本地,就从本地资源目录中加载。  

  if( Application.platform ==  RuntimePlatform.OSXWebPlayer || Application.platform ==  RuntimePlatform.WindowsWebPlayer )  

  {  

  //实例WWW对象,相当于从参数代表的网络地址上下载资源过程。  

  //GlobalConfig.GetConnectIP()方法可以取得当前机器的全局IP地址(这个例子中,服务器端和客户端在同一台机器上)  

  wwwObj = new WWW(“http://”+GlobalConfig.GetConnectIP()+“/AB/Terrain/Terrain1.unity3d”);  

  }  

  else  

  {  

  // 因为玩家是玩Web形式发布的游戏,所以本地没有资源,所以这里可以省略了,本地调试的时候可以打开用。  

  // wwwObj = new WWW(“file:///E:/123/Terrain1.unity3d”);  

  }  

  }  

  }  

  void Update () {  

  }  

  // 当前对象(此例中就是那俩Cube)如果Collier的IsTrigger属性被勾选上了,那么当另一个Collier碰撞到此对象上,就会触发这个函数。  

  void OnTriggerEnter(Collider other)  

  {  

  // this if-type hierarchy is just for simple debug, we can put debug message in each curly braces
  // 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/
  if(Flag == 0)  

  {  

  if(wwwObj!=null)  

  {  

  print(wwwObj.isDone.ToString());    //判断是否WWW对象已经下载完了  

  if(wwwObj.assetBundle!=null)  

  {  

  if(wwwObj.assetBundle.mainAsset  !=null)  

  {  

  //load resouce into the assetbundle of wwwObject  

  wwwObj.assetBundle.LoadAsync(“Terrain1”, typeof(GameObject));  

  //创建地形实例  

  if(Instantiate(wwwObj.assetBundle.mainAsset ) != null)  

  Flag = 1;  

  }  

  }  

  }  

  }  

  }  

  // 调试用的,通过GUI来调试,可视化,蛮方便的  

  void OnGUI()  

  {  

  GUI.Label(new Rect(0,0,200,200),debugstr);  

  }  

  }

作者:csdn博客 unity3d学习者

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 脚本
, 代码
, 地形生成
, 两个
, 资源
, unity客户端
地形glulookat
,以便于您获取更多的相关知识。

时间: 2024-11-01 16:34:22

unity3d教程:AssetBundle的相关文章

[Unity3d]打包Assetbundle并加载

由于我们要将模型资源放在远程的服务器端,但如果直接放fbx模型是不可以加载的,所以我们可以将fbx做成预设或者是直接将其打包成assetbundle格式的,然后通过www来加载获取. 说下使用方法: 1.把附件脚本放到工程文件夹下的...\Assets\Editor文件夹下. 2.在工程的Project视图里点击想要保存的资源,网络上推荐的是Prefab,右键点击,选择菜单里最下面的两个选项任意一个都可以,第一个选项对应的自定义属性有一个过期了,但是不影响使用. 3.指定文件的构建路径和文件后缀

unity3d教程:为精灵绑定碰撞区的方法

选择精灵集,然后点击"Open Editor-" 你可以设置各种参数,诸如:锚点.切割和填充算法.你可以同时选中多个精灵来编辑. 改变碰撞区类型为"Box Trimmed"(盒子边框型),这将在贴图四周创建边框.如想更多的控制其位置,请选择"Box Custom",便可拖拽边框. 点击Commit. 每次做了改变都请点击Commit,以便重构图集和顶点数据. 关闭精灵集编辑窗口,此时场景中的精灵已经绑定了碰撞区.用该精灵创建和即将用该精灵创建的实

unity3d教程:如何利用UILabel和UIButton制做计数器

首先 我们要双击导入需要的NGUI包 以下是导入的提示 ,需要我们把这里全部导入 导入NGUI后的工程文件 导入NGUI 后 , 在上边的菜单栏就会出现NGUI的选项 ,先将默认的 Main Camera删去 ,创建一个New UI 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/

怎样在unity3d中嵌入播放视频

Unity播放视频主要支持mov, .mpg, .mpeg, .mp4, .avi, .asf格式.首先,我们需要安装QuickTime播放器.然后,在Unity3D中加载视频. unity3d教程-如何在unity3d中嵌入播放视频 [html] view plaincopyprint? nbsp; public var movTexture : MovieTexture; nbsp; function Update() { nbsp; renderer.material.mainTextur

unity3d:如何做GUI中图片的旋转

GUIUtility.RotateAroundPivot (6*Time1, Vector2(103, 200))为旋转GUI的代码,第一个参数为旋转的角度,第二个参数为旋转的中心点,在它之下的GUI元素都会执行该旋转,例如图片.文字等.当你只想旋转某一GUI元素而其他元素不旋转事就得给它一个停止旋转的代码.利用图片旋转写的一个钟表的代码如下: 为了便于测试,在钟表左边给出一个数字时间经行对比.getTime(time : float)可用于实现场景中时间的显示,或者倒计时的显示等. 查看本栏目

Unity3D:GameObject调用脚本方法

SendMessage 可以不用管你脚本类型,用起来方便,只要脚本上有就响应,效率低,移动平台尽量不用(一个GameObject中的几个脚本互调) SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的Script BroadcastMessage ("函数名",参数,SendMessageOptions)  //自身和子Object的Script SendMessageUpwards ("函数名

Unity3d:批量修改贴图导入设置工具脚本

这个Unity3D批量修改贴图导入设置工具脚本十分小巧,但是威力大.特别针对大批量贴图要调整尺寸等等的时候作用尤为明显.在菜单中添加"Custom→Texture"的方式来批量改变所选的贴图导入设置.Unity本身只能一次打开一张图片进行导入设置,目前这个脚本可以批量更改贴图格式,是否开启MipMap,调整纹理最大尺寸,是否可读等等. 用法是把脚本放在你项目的资源目录的Editor文件夹下.然后选择你要批处理的纹理.到菜单中选择要处理的类型就可以了. ChangeTextureImpo

C#中Queue的线程安全问题

通过集合枚举在本质上不是一个线程安全的过程.甚至在对集合进行同步处理时,其他线程仍可以修改该集合,这会导致枚举数引发异常.若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常. 下列示例说明如何同步 Queue.如何确定 Queue 是否同步以及如何使用同步的 Queue.Unity3D教程手册 using System; using System.Collections; public class SamplesQueue { public s

Unity3D4.0的破解步骤

1.先下载并安装unity3d 4.0.0f7 最新版 2.下载unity.4.0.0f7-patch.gzip 3.解压unity.4.0.0f7-patch.gzip到unity安装目录,如F:\Editor\ 4.打开解压后的文件unity.4.0-patch.exe 5.单击patch,会在目录下生成Unity_v4.x.ulf 6.断网(重点!此处是与与旧版不同的地方) 7.打开unity3D,然后基本与旧版本的破解方法相同(读取ulf文件) 8.单击红圈按钮 9.选择刚刚生成的Uni