[Investor Relations]  |  官方微博

Unity3D培训

美国上市公司 · 亿元级外企unity3D培训企业

  • 全国服务监督电话4001118989
Unity3D培训 > Unity3D教程 > Unity3D AssetBundle的无缝地图实现
  • Unity3D AssetBundle的无缝地图实现

    发布:Unity3D培训  来源:Unity3D教程  时间: 2016年01月14日

  • Unity3D AssetBundle的无缝地图的实现,通过下面的制作过程和代码来逐步解释。...

  • Unity3D AssetBundle的无缝地图的实现,通过下面的制作过程和代码来逐步解释。

    脚本如下:

    Script_Cube_Trigger_Terrain1.cs

    Script_Cube_Trigger_Terrain3.cs

    Objects:

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

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

    如下图:

    Unity3D AssetBundle的无缝地图实现

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

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

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

    脚本代码:

    001using UnityEngine;

    002

    003using System.Collections;

    004

    005public class Script_Cube_Trigger_Terrain1 : MonoBehaviour {

    006

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

    008

    009//AssetBundleRequest abr; string debugstr = ""; //调试信息

    010

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

    012

    013void Start ()

    014

    015{

    016

    017if(Flag == 0)

    018

    019{

    020

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

    022

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

    024

    025{

    026

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

    028

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

    030

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

    032

    033}

    034

    035else

    036

    037{

    038

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

    040

    041// wwwObj = new WWW("file:///E:/123/Terrain1.unity3d");

    042

    043}

    044

    045}

    046

    047}

    048

    049void Update () {

    050

    051}

    052

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

    054

    055void OnTriggerEnter(Collider other)

    056

    057{

    058

    059// this if-type hierarchy is just for simple debug, we can put debug message in each curly braces

    060

    061if(Flag == 0)

    062

    063{

    064

    065if(wwwObj!=null)

    066

    067{

    068

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

    070

    071if(wwwObj.assetBundle!=null)

    072

    073{

    074

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

    076

    077{

    078

    079//load resouce into the assetbundle of wwwObject

    080

    081wwwObj.assetBundle.LoadAsync("Terrain1", typeof(GameObject));

    082

    083//创建地形实例

    084

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

    086

    087Flag = 1;

    088

    089}

    090

    091}

    092

    093}

    094

    095}

    096

    097}

    098

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

    100

    101void OnGUI()

    102

    103{

    104

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

    106

    107}

    108

    109}

  • 上一篇:unity3d写出android的“摇一摇”+震动效果

    下一篇:Unity3D Gamecenter 得分上传失败的处理

网站导航
2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56