unity引擎可以制作无缝超大unity3d地图 无缝拼接吗

中国领先的IT技术网站
51CTO旗下网站
Unity3D无缝地形场景切换的解决方法
当我们开发一个大型项目的时候-会遇到这样的问题(地形场景的切换)这个只是字面意思-并不是重场景1的100
100 100坐标一下切换到场景2的100 100 100坐标这样的方法。
作者:U3d来源:Unity教程手册| 09:16
(如果您以为是这样的技术和代码)那就不用看了。这个技术的实质意义是为了解决--多地形场景带来的大量内存占用问题-举个我的例子-我的测试项目是1013张绘制地形--在不用上面的技术情况下-占用了我4.2G的内存(还好我电脑16G)想想下-如果一个大型的游戏直接这么运行的话(当然是不可能会这样傻的)一下就会带来5-8G的内存占用--这个游戏还能玩吗?(当然这个8G的占用内存也没换来他应该的效果,所以是浪费)
涉及到几个U3D函数:
Application.LoadLevel(lv):场景读取(记着用多场景前要现在File-Build Setting里登记下场景,才能在脚本里读取到)
DontDestroyOnLoad(object):保持物体在场景切换的时候不被卸载(能保持他的所有属性哦)
*AssetBundle类:预读资源(主要用于web3d,运行时实时从服务器下载需要的场景资源)
涉及到几个基础知识:
static 静态类、静态变量:在整个游戏中都不会被重新加载,所以可以当全局全场景变量使用,主要用于记录场景数组。
Collider的Is Trigger属性:设置成True,他是可以穿越不会产生能量传递的,但是,他是可以接受碰撞侦测的。配合主角的OnTriggerEnter事件,就可以知道你是否正在穿越一个Trigger了。在这里,我们用在判断何时加载新场景上。
2.制作场景边界
使用Cube + IsTrigger=True属性是最好的办法。
如果是双场景切换,注意两个场景边界坐标别重在一起,不然你走到边界会发现两个边界不停的切换=.=,要让2个场景边界互相交错一起。有必要的话,边界可以往里面缩一点(甚至可以吧场景重叠1/3,但这样两个场景你要做很多重复的东西),避免用户看到边界。
3.编写脚本
先理清楚逻辑关系以及一些常识:
1.是主摄像机走到边界才会做场景加载或卸载动作。所以代码是放在主摄像机上或者主角上。
2.场景可以加载,但是没有卸载场景这个东西(也没必要卸载,因为同一时间只会有一个场景为当前场景),所以如果你用九宫格方式做无缝连接,你需要把场景读取,然后让场景里所有物体DontDestroyOnLoad(当然包括主角,也就是this),然后其他场景也这么操作,当需要卸载场景时,只要把所有那个场景Object给Destroy掉就可以了。而做双场景连接则不需要这样,也简单的多。Unity3D教程手册:
3.如果是九宫格,你需要一个静态二维数组去记录每个位置场景的名字。这里也可以不需要这么做,有个技巧,你可以格式化场景名字规则来推算下一个需要加载的场景名字,比如M1N1表示(1,1)场景,那你就可以用字符串拆分的方法知道需要读取M0N0,M1N0,M2N0等等的场景。
4.接下来就是处理碰撞,获取下一个场景(双场景方式)或者当前场景(九宫格方式)的名字,这里你就可以看到一个被格式化过的场景名有多么重要。
1function OnTriggerEnter(other:Collider){23Application.LoadLevel(other.name);& //这是双场景方式直接把边界Cube名字设为了下一个场景名45}
上面的介绍是大概的描述-具体实现方法如下
我们在使用这个技术之前要将你的地形--在U3D里的File-Build Setting里登记下场景,才能在脚本里读取到-Add Current(这个是登记地形),之后我们来制作一个简单的-2个地形的切换方法。
Unity3D教程:无缝地形场景切换的解决方法
这个图是做好了的2张地形--中间的Cube是用来接受角色的碰撞的--这样我们就知道在何时去载入我们的下张地形场景了(不包括其他-数据,列如--坐骑这类的-这个需要另一段代码单独给坐骑-马或者车子这类的--还有很多)
Cube---把Inspector--Is Trigger--划勾--(这个作用是接受碰撞但不产生能量传递-也就是说他接受碰撞,但可以让同样具有 Is Trigger-划勾的属性物体通过--列入-我们的角色或坐骑)(补充--我们的角色也需要去勾选-Is Trigger-这些才可以通过,但官方自带的FPS--没有Is Trigger-这个勾选像-可以用如下方法解决-创建一个新的Cube为他重新命名-把他作为FPS-父物体--然后勾选-Cube的 Is Trigger-子物体就会有这项属性了)Unity3D教程手册:
这些工作建立好了以后-开始我们的脚本工作。
脚本如下:
01function OnTriggerEnter(other:Collider)0203{0405if (other.gameObject.name==&Cube1&)0607Application.LoadLevel(&Terrain 1&);0809};10
为了方便大家理解--我没有重新命名--Cube1--就是我们接受碰撞体,Terrain 1是我们的要载入的下张地形。(大家可以用很多方法去优化他--有优化的方法请发在这个帖子内-方便大家查看-非常感谢)
这段代码要放在角色上或角色摄像机上或FPS的父物体Cube上。
以上的操作就完成了-一个重地形0到地形1的切换--(可以解决100M或跟高的内存占用问题-这个要看你的地形场景而定了)
但这并不完整--我们也可能要重地形1回到地形0---这个要你们自己解决了-以上的内容已经把这个解决的方法说出来了--大家自己学习发挥下--这样才有进步。
下面我们来说明4张地形场景的载入--逻辑(这里只说明逻辑,具体代码和上方一样,需要大家自己发挥下)
Unity3D教程:无缝地形场景切换的解决方法
这个图中可以看到4张地形场景--我重点讲解--中间的2个大的Cube逻辑--那4个长方形的大家应该都清楚了。除非你没认真看。
中间最大的Cube是来判断--角色走的这个范围内的时候他要去载入那张地形场景-如果在这个大的Cube的范围内折载入其他的2张地形场景。(这个大的Cube可以根据自己的地形规格-做出调整这里给出的并不准确)
中间最小的Cube是来判断--角色走的这个范围内的时候他要去载入那张地形场景-如果角色走入小的Cube中后-载入其他3地形。
上面的方法只是--引导--实际制作中可以跟据这些方法推敲-这个4张地形场景同样少了-往返的-制作介绍--给大家学习的空间去发挥吧。
原文链接:
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条热点头条原创
24H热文一周话题本月最赞
讲师:226883人学习过
讲师:27169人学习过
讲师:132519人学习过
精选博文论坛热帖下载排行
本书主要介绍采用Visual Studio 2005的C#语言为前台,SQL Server 2005数据库为后台的数据库系统开发技术。
全书分为15章,内容包括走进.NE...
订阅51CTO邮刊165被浏览14681分享邀请回答17 条评论分享收藏感谢收起新手求教,Unity3d能不能导入很大的全景图?_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:78,287贴子:
新手求教,Unity3d能不能导入很大的全景图?收藏
我想用Unity显示一个360度全景图,网上找到的教程是这样:但是我的全景图很大,像素是,用.tif格式保存有2.3GB,用jpg格式保存也有几百MB,请问Unity能不能导入这么大的一个图贴到一个球上呢?
达内unity3d培训全程&实战教学&,unity3d金牌讲师授课.免费unity3d课程试听中!到达内unity3d学院学习unity3d,只需4个月速成unity3d游戏工程师.
能 不过最好压缩一下 不然导入也好 转格式也好 使用解析也好各种卡死你
不能~最大8192~就只从优化一个方向考虑吧~ tif无损肯定不可能用,最后只需要考虑在显存全展开的大小~~建议不要死磕这种精度话说用户是要控制一个拿望远镜的角色来观察的吗?~
以前有个房产项目是客户给了一堆效果序列图,要求用户可以浏览序列图做成的视频,因为他们希望用户在任何地方停止都可看到精美的单帧效果图,但是这些效果图也要上G,完全载入内存都成问题,拿来播放更加根本不现实,后来给的优化方案是用户看的视频是高画质的压缩1080p,其实也就几十兆,当用户停止在某帧的时候,去读取资源里相应的那张序列图并且显示出来~~ 就兼顾实现需求了~你这个优化思路其实也是一样,玩家一开始可以看一张稍高画质的天空盒,对准某个角度放大的时候,再去在该局部载入对应的高分辨率图,有必要的话可以多做几个细分层级。自带贴图的mipmap其实也有类似功能,但那个是显存优化,按照你的需求应该是内存级别的优化~所以应该自己控制具体的细分贴图分辨率。
哇这个听上去很棒!但是我这边还是有个小问题,就是我这个项目是用于浸入式VR设备的,设备是一个立方体盒子,六面都是显示屏,要求人在其中能够操纵全景图的某个局部放大,那么其他的局部需要相应的缩小,这样就像人朝图中的某个地方走了过去一样,必须要有这种自然的效果,所以如果像您说的,用户停留在某个角度时候,去取那个角度的高分辨率图,应该是不行的,因为其他每一个角度像素点都会被显示出来,所以都得兼顾
楼主问题解决了吗
必须要压缩过图片资源的
登录百度帐号推荐应用}

我要回帖

更多关于 unity 无缝场景 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信