Unity3D无缝场景切换解决方案 - 简单场景切换
发布日期:2021-09-29 04:02:27 浏览次数:5 分类:技术文章

本文共 2555 字,大约阅读时间需要 8 分钟。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

所谓无缝场景切换,无非是涉及到场景或物体的预读,复杂点涉及下场景卸载,在复杂点涉及到场景二维数组,再在复杂点涉及数据结构用二叉树实现场景资源有序的读取与卸载。当然,复杂的我以后慢慢再说,比较懒,先写最简单的,如果能起到抛砖引玉作用,那这篇文章也算是物有所值了。

  无缝场景切换的优缺点:
  优点:
  1.场景(游戏)连贯性。
  2.相对于多场景游戏,不需要等待场景更换(在进入场景后已经在实时加载下一个场景了)
  3.相对于单个大场景,这种方式能避免所有的场景数据被装入内存(尽管U3D优化很好并不会被渲染出来),很大的数据在内存里影响你游戏的性能(特别是在iphone这种小内存环境)。
  缺点:
  1.操作繁琐(本文介绍比较基础简单的方式)
  2.开发者要求较高(注意保持逻辑清晰,不然后期你会全乱掉的)
  涉及到几个U3D函数:
  Application.LoadLevel(lv)     场景读取(记着用多场景前要现在File-Build Setting里登记下场景,才能在脚本里读取到) DontDestroyOnLoad(object)  保持物体在场景切换的时候不被卸载(能保持他的所有属性哦)
  *AssetBundle 类       预读资源(主要用于web3d,运行时实时从服务器下载需要的场景资源)
  涉及到几个基础知识:
  static 静态类、静态变量:在整个游戏中都不会被重新加载,所以可以当全局全场景变量使用,主要用于记录场景数组。
  Collider的Is Trigger属性:设置成True,他是可以穿越不会产生能量传递的,但是,他是可以接受碰撞侦测的。配合主角的OnTriggerEnter事件,就可以知道你是否正在穿越一个Trigger了。在这里,我们用在判断何时加载新场景上。
  简单的无缝场景切换方案:
  1.建立场景(已经做好很大场景的就准备做切割吧)
  场景尽量小,如果是web3d,那需要更小,已保证场景在网络上传输时间不至于太长,在漫游中再实时读取其他场景数据。一般来说,场景大小考虑因素有两种:如果是web3d模式,考虑网络传输速度;如果是pc,mac,wii,iphone,那就得考虑内存或显存能吃你多少场景数据并且处理起来不费力。
  按照你所需要建立的无缝场景切换方式,你可以按场景的坐标建立以下几种方式:
  1 ) 双场景切换(本文重点)                2)九宫格场景切换
  1)双场景切换:用于单个场景较大的情况。同一时间只加载1个到2个场景(预读周围4个场景),场景间需要交错,避免让用户看到场景的边界深渊=.=.当用户走到边界,就加载下一个场景,如果走到4个顶点,加载下两个场景(如果场景庞大应尽量用障碍物避免用户走到顶点,因为走到顶点要加载的数据是走到边界加载的2倍-,-)
  2)九宫格场景切换:用于单个场景较小的情况。因为同一时间需要在内存中载入以用户为中心的周围(包括本地)9个场景资源,不同于双场景切换的是,场景间不需要交错,因为用户视野永远不会看到当前场景界限。用9宫格方式需要将场景预先存入静态的二维数组,以便读取使用。
  2.制作场景边界
  使用Cube + IsTrigger=True属性是最好的办法。
  1)如果是双场景切换,注意两个场景边界坐标别重在一起,不然你走到边界会发现两个边界不停的切换=.=,要让2个场景边界互相交错一起(做的时候你自然会明白)。有必要的话,边界可以往里面缩一点(甚至可以吧场景重叠1/3,但这样两个场景你要做很多重复的东西),避免用户看到边界。然后建议是把Cube的名字设置成邻接场景名称,因为待会儿写脚本时候方便。
  2)如果是九宫格场景,那就不需要重在一起了,边界Cube名字建议使用本场景的名字,因为这样你一走到下一个场景,就可以知道你在的场景位置而读取周围新场景了。
  3.编写脚本
  好了,现在可以开始写脚本了,我一如既往的很懒,所以不会吧全部代码粘帖出来[unity3D]无缝场景切换解决方案(1) - 简单场景切换 - kingmax_res - kingmax_res的博客。
  先理清楚逻辑关系以及一些常识:
  1.是主摄像机走到边界才会做场景加载或卸载动作。所以代码是放在主摄像机上或者主角上。
  2.场景可以加载,但是没有卸载场景这个东西(也没必要卸载,因为同一时间只会有一个场景为当前场景),所以如果你用九宫格方式做无缝连接,你需要把场景读取,然后让场景里所有物体DontDestroyOnLoad(当然包括主角,也就是this),然后其他场景也这么操作,当需要卸载场景时,只要把所有那个场景Object给Destroy掉就可以了。而做双场景连接则不需要这样,也简单的多。
  3.如果是九宫格,你需要一个静态二维数组去记录每个位置场景的名字。这里也可以不需要这么做,有个技巧,你可以格式化场景名字规则来推算下一个需要加载的场景名字,比如M1N1表示(1,1)场景,那你就可以用字符串拆分的方法知道需要读取M0N0,M1N0,M2N0等等的场景。
  4.接下来就是处理碰撞,获取下一个场景(双场景方式)或者当前场景(九宫格方式)的名字,这里你就可以看到一个被格式化过的场景名有多么重要。
  function OnTriggerEnter(other:Collider){
  Application.LoadLevel(other.name);  //这是双场景方式直接把边界Cube名字设为了下一个场景名
  }
  更加复杂化的无缝切换方案思路:
  1.使用角色与边界距离动态判断,以确定载入时机以及载入哪个方位的场景。
  2.加入判断角色为中心的圆内的物体加载(操作起来有点复杂,除非你整个场景是数字化的,或者干脆是动态生成的),这需要一个加权的二叉搜索树将大地图所有的物体放进去,在满足条件时候去载入最近的。
  (仅提供思路,可能有更好的数据结构去优化他)

转自:

           

给我老师的人工智能教程打call!

这里写图片描述

转载地址:https://blog.csdn.net/hddghhfd/article/details/84062367 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ETC 纹理压缩和 Alpha 通道处理
下一篇:Adroid 触摸屏设备

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年03月06日 05时46分58秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java怎么中断阻塞状态_java并发编程()阻塞方法与中断方法 2019-04-21
java zlib 位运算_位运算入门:找出一个二进制数的最右端的第一个1;计算一个二进制数中1的个数;找出数组中唯一一个出现次数为奇数的数;找出数组中唯二两个出现次数为奇数的数... 2019-04-21
java lua热更新_lua热更新学习 2019-04-21
script执行php文件_php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法... 2019-04-21
apache 2.4 php5.4_apache2.4+php5.4+my sql 5.6,网站经常无故不能访问 2019-04-21
php apc.dll下载,PHP之APC缓存详细介绍 apc模块安装 2019-04-21
html贝塞尔曲线在线,贝塞尔曲线的一些事情_html/css_WEB-ITnose 2019-04-21
Java前台显示近20天的东西_第十次课:前台首页设计及显示商品信息 2019-04-21
java开发web网站的路由设计_理解Web路由(浅谈前后端路由与前后端渲染) 2019-04-21
excel如何把顺序倒过来_在excel中怎么使文字颠倒顺序反过来显示呢? 2019-04-21
php正则表达式获取图片路径,php 常用正则表达式实例(图片地址,与指定内容获取)... 2019-04-21
脚本语言php是什么意思,PHP脚本语言 2019-04-21
matlab数学规划模型,数学规划模型 2019-04-21
视频提取音频php,如何提取视频中的音频,从视频文件中提取出音频输出成MP3格式... 2019-04-21
diy.php添加验证码,织梦dedecms自定义表单中加入验证码 2019-04-21
在php脚本中 通过可以获取,在PHP中,可以使用Unix时间戳获取精确的脚本执行时间。... 2019-04-21
s2-045 php exp,S2-045-EXP.py --Struts2任意代码执行漏洞 (S2-045,CVE-2017-5638) 2019-04-21
linux sdk 窗口句柄,Venus: 针对Linux平台上,对常用的系统API进行面向对象的封装SDK。... 2019-04-21
c语言程序设计 科学出版社习题答案,C语言程序设计(科学出版社)第4章 课后习题参考答案.doc... 2019-04-21
c语言 无错 但只运行一半,求哈夫曼编码时程序运行到一半就终止了,编译无错... 2019-04-21