Unity3D AssetBundle的无缝地图实现

unity3D更多资源教程免费下载,群193521697 邀请码:10026.(有问题找管理员)

Unity3D AssetBundle的无缝地图实现

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

脚本如下:

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。

脚本代码:

001

using UnityEngine;

002

 

003

using System.Collections;

004

 

005

public class Script_Cube_Trigger_Terrain1 : MonoBehaviour {

006

 

007

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

008

 

009

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

010

 

011

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

012

 

013

void Start ()

014

 

015

{

016

 

017

if(Flag == 0)

018

 

019

{

020

 

021

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

022

 

023

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

024

 

025

{

026

 

027

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

028

 

029

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

030

 

031

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

032

 

033

}

034

 

035

else

036

 

037

{

038

 

039

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

040

 

041

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

042

 

043

}

044

 

045

}

046

 

047

}

048

 

049

void Update () {

050

 

051

}

052

 

053

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

054

 

055

void 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

 

061

if(Flag == 0)

062

 

063

{

064

 

065

if(wwwObj!=null)

066

 

067

{

068

 

069

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

070

 

071

if(wwwObj.assetBundle!=null)

072

 

073

{

074

 

075

if(wwwObj.assetBundle.mainAsset !=null)

076

 

077

{

078

 

079

//load resouce into the assetbundle of wwwObject

080

 

081

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

082

 

083

//创建地形实例

084

 

085

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

086

 

087

Flag = 1;

088

 

089

}

090

 

091

}

092

 

093

}

094

 

095

}

096

 

097

}

098

 

099

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

100

 

101

void OnGUI()

102

 

103

{

104

 

105

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

106

 

107

}

108

 

109

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值