unity大场景优化

unity大场景优化
unity大场景优化

首先介绍下draw call(这个东西越少你的游戏跑的越快):

在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏幕上呈现出来。这就和你希望你的亲友收到准备好的圣诞礼物需要包装好然后穿过城市准时放在他应该出现的地方一样没什么不同。你的CPU来完成包装和传递他们的活,同时会消耗很多的带宽,所以最终分配好这些关键性资源很重要。目前,真正可怕的事情是从描绘指令消耗远景开始,每一个独立的飞溅到地板上的血迹和一个角色或者一具死尸消耗的字节是一样的多的:他们都消耗同样的描绘指令。除此之外,没有什么更多的差别。

那么如何降低draw call 呢??那么我们就用到Culling(剔除)技术。如果不应用这个技术,电脑是不管3721把场景里所有的东西都送去渲染的。看得见的也渲染,看不见得照样也送去渲染。很傻是吧,那咋办呢。得告诉电脑,那个你

看得见的渲染,看不见的就算了。于是就有了

1.视锥体剔除(Frustum Culling)这个unity系统自带了好像,就不用操心了。

2.遮挡剔除(Occlusion Culling)

Unity 3专业版内置了一个强大的Occlusion Culling 插件Umbra免费的

遮挡剔除(Occlusion Culling)遮挡剔除是一种什么样的特性呢,当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染。. 遮挡剔除在3D图形计算中并不是自动进行的。因为在绝大多数情况下离camera 最远的物体首先被渲染,靠近摄像机的物体后渲染并覆盖先前渲染的物体(这被称为重复渲染,无效渲染"overdraw"). 遮挡剔除不同于视锥体剔除. 视锥体剔除只是不渲染摄像机视角范围外的物体而对于被其他物体遮挡但依然在视角范围内的物体则不包括在内. 注意当你使用遮挡剔除时你依然受益于视锥体剔除(Frustum Culling).

左边的场景使用了遮挡剔除. 右边的场景未使用遮挡剔除.

遮挡剔除的运行将通过在场景中使用一个虚拟的摄像机来创建一个物体潜在可视性状态(set)的层级. 这些数据可以让每个运行时间内的摄像机来确定什么能看见什么看不见。通过这些数据, Unity 将确定只把可以看见的物体送去渲染. 这将降低draw calls 的数量并提供游戏的运行效率.

occlusion culling的数据由单元(cells)组成. 每个单元是整个场景范围数值的一部分. 更多特定的单元来自一个二叉树(binary tree). Occlusion Culling使用两个叉, 一个给View Cells (静态物体) 另一个给Target Cells (移动物体). View Cells map给出了一个定义了静态可视物体的索引列表(精确剔除后的静态物体).

非常重要的一点是在创建你的物体时要随时注意,因为你需要在物体的尺寸和单元的尺寸间取得一个好的平衡. 理想情况下, you shouldn't have cells that are too small in comparison with your objects but equally you shouldn't have objects that cover many cells.有时你可以通过将大的物体拆成几个部分来改进遮挡剔除效果. 无论如何你仍然能够将小的物体合并为一体来降低draw calls, 在它们都属于一些小的组件的时候, occlusion culling 将不起作用.确定组件中那个是可视的组件的选集和可视信息被认为是PVS (潜在可视状态Potentially Visible Set).

Occlusion Culling设置

为了使用遮挡剔除需要进行相关的手动设置.首先你关卡中的几何体必须被分割成明显的不同尺寸的块. 这也有助于布置关卡中小块的容易定义的区域被其他大物体遮挡(例如墙,建筑物)这意味着每个单独的

mesh被确定是否渲染取决于occlusion 数据. 所以如果你有一个物体包含了房间里的所有家具那么所有的家具要么全渲染,要么全不渲染. 是否渲染是基于组件而不是基于每个单独物体自身的。

在检视面板(Inspector)你需要标识(tag)所有需要应用遮挡剔除的场景物体。最快的方法是是将你需要标示为Static的物体作为一个Empty GameObject 的子物体并设置这个Empty GameObject 为Static,当option出现的时候选择affect children. 当子物体被tagged as Static你可以取消子物体和Empty GameObject的父子关系.

检视面板中的Static checkbox

下一步点击Tools->Occlusion Culling. 打开Occlusion Culling 检视面板,在面板中你会发现几个数值被调整过了。这些数值前面描述过:-

Occlusion Culling - Object

遮挡剔除检视面板的object标签.

Object标签可以让你创建Occlusion Areas GameObjects. 这些区域让你指定什么地方你会使用遮挡剔除.

注意: 默认情况下如果你不创建任何遮挡剔除区域, 整个场景都会进行遮挡剔除.

Properties

Quick Select

快速选择和创建一个Occlusion Area并且快速编辑它.

None

这个是默认值.

Create New

创建一个新的Occlusion Area GameObject.

当你点击Create New in the Quick Select drop down, Unity将自动创建一个Occlusion Area 并且删除默认区域(整个场景). 现在你可以根据需要开始调整Occlusion Area(s).

Occlusion Area 检视面板.

Properties

Size

定义Occlusion Area的尺寸.

Center

选择Occlusion Area的中心. B默认为0,0,0 并在box的中心位置.

Is View Volume

定义摄像机的活动范围区域. 点选这个选项才能应用遮挡剔除在Occlusion Area内的静态物体.

Is Target Volume

如果你要遮挡剔除运动物体,打开这个选项.

Target Resolution

确定区域内的Occlusion Culling精度. 即一个Occlusion Area的单元尺寸. 注意: 这个选项只对Target Areas(移动物体)起作用.

Low

减少计算时间但同时精度降低.

Medium

计算时间和精度中等,比较平均.

High

计算时间长但精度高.

Very High

精度很高,计算时间更长.

Extremely High

最高精度.注意: 计算时间令人发指。

如果摄像机处于遮挡区域之外或者任何物体超出区域, 这些物体将不会被遮挡剔除.

Occlusion Culling - Bake

Occlusion culling 检视面板bake tab.

Properties

View Cell Size

每个view area单元的尺寸, 尺寸越小遮挡剔除越精确. 这个数值用来平衡遮挡剔除的精度和存储容量

Near Clip Plane

Near clip plane 如果设置最小数值那么游戏中所有摄像机都可看到.

Far Clip Plane

Far Clip Plane 用于选择objects. 任何物体的距离大于这个设定数值都会被自动遮挡.(Should be set to the largest far clip planed that will be used in the game of all the cameras)

Quality

品质级别

Preview

开发阶段使用这个(ie,不是很准确但可以让你御览在游戏中的大致表现)

Production

如果开发基本结束准备发布那就该选择这个(会耗费更多的时间但更精确)

当你调整完这些数值后可以点击Bake按钮开始处理Occlusion Culling 数据. 如果你对结果不太满意,你可以点击Clear 按钮删除以前的计算数据.

Occlusion Culling - Visualization

Occlusion culling 检视面板visualization 可视标签

Properties

Quick Select

让你快速选择场景中的任何摄像机来观看遮挡剔除的效果

The near and far planes 定义了一个虚拟摄像机来计算遮挡剔除数据. 如果你有几个摄像机near 或far planes不同, 你应该设置near plane 和largest far plane distance适配所有摄像机来调整物体的包括范围. 所有场景里的物体只在数值范围内起作用所有请确定你的所有物体都处于可视范围.

当你准备好生成occlusion data, 点击Bake 按钮. 记住在Bake标签的Quality selection box 中事先选择Preview 和Production. Preview可以快速生成数据并可以快速检查结果. Production 用于产品发布前的生成和检测.

请记住遮挡剔除的数据计算生成速度取决于事先设置的cell levels(单元级别), 数据尺寸大小和精度. Unity 会在窗口底部显示PVS 运算状态.

运算处理结束后, 你会在View Area看到一些不同颜色的cube. 颜色相同的区域共享遮挡剔除数据.

点击Clear 如果你想删除所有遮挡剔除的事先计算好的数据(预计算数据).

Moving Objects

如果想应用遮挡剔除到一个运动物体你必须创建一个Occlusion Area然后设定其尺寸来适配运动物体的活动空间(注意:运动物体不能被标示为static).

创建Occlusion Area后, 检查Is Target Volume checkbox 来遮挡剔除运动物体.

移动物体的Occlusion Area properties

Size

设定Occlusion Area 尺寸.

Center

设定Occlusion Area的中心. 默认0,0,0 并位于box的中心.

Is View Volume

定义摄像机能到哪里. 检查这个数值来遮挡剔除Occlusion Area中的static objects .

Is Target Volume

遮挡剔除运动物体时必选

Target Resolution

确定区域内的遮挡剔除精度。这将决定Occlusion Area的单元尺寸. 注意: 只对Target Areas起作用.

Low

减少计算时间但同时精度降低.

Medium

计算时间和精度中等,比较平均.

High

计算时间长但精度高.

Very High

精度很高,计算时间更长.

Extremely High

最高精度.注意: 计算时间令人发指。

添加完Occlusion Area后, 你需要了解它是如何划分单元中的box. 如果想了解occlusion area如何计算运动物体,你必须在Scene View中点选Target按钮并且关闭View 按钮同时Occlusion Culling 检视面板是打开的.

Selecting Target (moving objects) or View (static objects) 让你御览calculated data 的运作.

Testing the generated occlusion

occlusion 设置完毕后, 打开Cull Geometry option (in the Occlusion Culling window) 并在场景视窗移动Main Camera.

iScene View 中的Occlusion View mode

当你在周围移动Main Camera (无论是否在Play mode下), 你将会看到不同的物体disable. 你在这里需要找出的是occlusion data中的任何错误. 当你移动摄像机时你可能会发现会有物体突然出现在视野当中. 如果这种情况发生, your options for fixing the error are either to change the resolution (if you are playing with target volumes), or to move objects around to cover up the error. To debug problems with occlusion, you can move the Main Camera to the problematic position for spot-checking.

运算处理结束后, 你会在View Area看到一些不同颜色的cube. 蓝色cubes表现的是Target Volumes的单元划分. 白色cubes表现的是View Volumes的单元划分.如果参数设置正确你会看到一些物体不被渲染. 这表示要么这些物体不在摄像机视角范围内要么被其他物体遮挡住了.

如果occlusion完成后, 场景内任何物体也没有被遮挡, 拆分物体至更小的pieces 以便它们能被完整地包含在一个单元中.

要提醒朋友们的是,如果场景复杂,品质设置高的话,烘焙过程将漫长的令人发指。赶紧升级电脑吧!!!对于没有买专业版并无法使用umbra插件的朋友也不必担心,还有另外一个Culling剔除插件可以选择,是完全免费共享的。具体名字忘记了,不过去unity网站的讨论版搜一下Culling关键词可以很容易找见。就到这里 .就到这里.转自:https://www.360docs.net/doc/b816332605.html,/s/blog_409cc4b00100oivo.html

LOD(Level-of-detail)是最常用的游戏优化技术。如果你的程序可以定制开发应用LOD的模块,当然

是很美好的事情。不过如果没有也没关系,大家可以使用UniLOD这个第三方的LOD插件。免费共享的哦(向UniLOD开发者致敬,赞美伟大的共享精神!!!)

以下是简介:

功能众多,涉及到场景管理,模型优化,资源管理员,及显示效果变化,且不需要脚本编写,全部通过编辑器实现!目前此unity3d扩展为开源的,你可以下载到源代码来研究学习。

特色:

·1.自动简化网格体(Windows + Unity Pro only)

根据用户的设定自动减面。

· 2.Level-of-detail 编辑器

方便快捷的创建LOD组件来切换不同的品质级别或通过设定距离数值来显示

或隐藏物体。

创建你的LOD 场景

方便快捷的用LOD 组件来替换现有组件将现有的场景转换为拥有LOD管理的场景。

将单个的mesh和贴图成组来降低draw calls

将场景存储为标准assets 或者asset 包

·3.场景管理

Streaming 支持

Stream your scene as the player moves through the world

资源自动loaded/unloaded

Stream from resource folder, or asset bundles

Minimal performance impact with resource buffering

可以根据需要调整, 速度或者内存

Takes care of switching quality levels as the player moves though the world

充分优化, 使用最少的资源

· 4.资源管理

所有asset bundles 和普通资源都以标准方式载入。

Keeps reference counts on your resources and 自动释放

· 5.完整植入Unity 并只需要通过UnityEditor API来操作。

无需输入代码

Sorry,场景管理和资源管理的有些内容没搞懂就不乱翻译了。

链接:

https://www.360docs.net/doc/b816332605.html,/content/lod扩展beta版本发布unilod-beta-levelofdetail-and-streaming-support

当然,Unity3d自己的地形是自带LOD功能的,当你刷好你的地形后,你只需要调整Pixel Error这个

参数即可。Unity3d会自动计算生成地形的LOD,无需你做其他的任何设置。

要提醒朋友们的是,如果你使用了Lightmap,那么同时使用LOD的时候会有一些麻烦,我们的办法

是制作模型的时候事先做好第二套uv(不使用Unity的自动计算lightmapUV功能),而且所有LOD的第二套UV的分布位置都一致,很费工。不知道有没有更好的方法!!!

转自:https://www.360docs.net/doc/b816332605.html,/s/blog_409cc4b00100o6qu.html

动态实时灯光相比静态灯光,非常耗费资源。所以除了能动的角色和物体(比如可以被打的到处乱飞的油桶)静态的地形和建筑,通通使用Lightmap。

强大的Unity内置了一个强大的光照图烘焙工具Beast,这个东东是Autodesk公司的产品(可怕的垄断,感觉和3d沾边的软件丫都要插一手)。据说用来制作过杀戮地带和镜之边缘。

镜之边缘建筑场景漂亮干净的光影,Lightmap的效果。

在Unity中制作Lightmap很方便,调节几个参数后直接烘焙即可。支持GI,Skylight,

效果一流!!!当然你需要一台好点的机器,不然漫长的烘焙过程你就有的等了。

内置的光照图烘焙工具Beast

P场景准备和光照图烘焙

点选Window --> Lightmapping打开光照图烘焙面板:

1.确认所有将要被用来烘焙光照贴图的网格体UVs正确无误.最简单的办法是在mesh import

settings中选择Generate Lightmap UVs选项(由Beast自动分uv)

2.在Object面板中将所有网格体或地形标注为static –这将告诉Unity,这些物体将不会被移动和

改变并且可以被赋予光照贴图。

3.为了控制光照贴图的精度, 进入Bake面板并调整Resolution的值. (为了更好的了解你的

lightmap texels使用情况, 在Scene 视窗中找到Lightmap Display小窗口并且选择Show Resolution).

1.点击Bake 按钮。

2.Unity Editor's会出现一个进度条,位置处于右下角.

3.当烘焙结束, Lightmap Editor窗口会显示已经烘焙好的光照图.

Scene 和 game 视图会同时自动更新–现在你的场景已经有了光照图的效果!

Unity Lightmap的设置还有更详细和更高端的内容,请参考自带的文档,那才是王道啊!!!!!

最近制作的一个野外场景快完工了。阿弥托福!!!!希望能跑的流畅,千万别返工啊!!!

为了避免出现杯具,提前研究了一些资料,涉及到Lod技术(Levels of Detail,多细节层次),

选择剔除(Culling),光照贴图(Lightmap)当然还有强大而又脆弱的Unity3d引擎. 所有资料都来自互联网和Unity自带的文档。有些文档我自己业余时间翻译了下,错误的地方请朋友们指正。

unity3D游戏开发之登录场景和注册场景

首先制作背景图片,在ngui中插入一个texture,把选好的背景图片放入textur 在texture组件上添加一个uistretch脚本(自适应屏幕大小),把其属性中的st 成both,如图所示文章来自【狗刨学习网】

。如果感觉画面失真了,点击你的图片,把其属性中的texture type调成adva 然后把generate mip map选项后面的勾去了就好了,这样我们的背景图片就做好了 然后用ngui自带的组件,拖上去两个input(输入框)组件,再拖进去两个la 件,最后再拖入两个button组件,可以根据自己的喜欢,再加一个label当做游戏的把所有添加的组件放入panel中,这样比较好操作,效果如图所示

下面把注册时的界面搭建好,原理都是一样了,最后的效果如图 下面要写代码来控制所有要触发的事件了,在我们uiroot中的摄像机上创建一gameSence,然后我先口述一下大概流程,随后就贴上代码(其实很简单的几句),界面上需要有交互功能的就两个按钮,一个注册一个进入游戏,进入游戏先不管,因

个涉及到与服务器连接的一些知识,本人小白,还没涉及到,等涉及到的时候一定会家分享一下,言归正传,还一个按钮就是注册,当点击注册的时候,就会弹到注册的中,也就是把当前的登录界面隐藏掉,显示出咱们得注册界面,在咱们得注册界面中及到交互的按钮也是两个,一个提交,一个返回,提交按钮涉及到用户填写的账号要的数据库中,并且提交成功后要返回登录界面,咱们只做返回登录界面的这个功能,跟登录界面跳转到注册界面是一个概念,还有一个返回按钮,也是跳转到登录页面。以后肯定要跟服务器有一个交互的过程,所以在用户点击进入游戏按钮也好,还是注面中的提交按钮也好,在与服务器通讯的过程中,要防止用户再次操作,所以要另见panel,里面放入一个sprite和一个label,把sprite的透明度调成1(!!!注意定不要调成0,调成0后unity就不会渲染,那咱的层级设定就没有意义了,这也算的一个小bug吧),这样就用户就点击不了任何组件了。当通讯完成的时候,再取消panel,用户就可以再次操作了。大概思路就是这样,废话不多说,贴上我的代码,参考,也希望大神挑出我的毛病,哦对了,在说一点,在建父物体的时候,我都是用的我觉得应该用gameobject,因为用panel会增大draw call,对优化有一定的帮助。 using UnityEngine; using System.Collections; public class gameSence : MonoBehaviour { //登录场景 public GameObject sence1; //注册场景

Unity场景遮挡剔除技术优化

Unity场景遮挡剔除技术优化 复杂的三维场景,尤其是复杂的地表模型,具有复杂的结构,在渲染时需要花费更多的时间。若要在实时渲染过程中快速绘制地形,应该首先考虑如何解决大规模数据构成的复杂地形表面模型与计算机图形硬件有限的绘制能力之间的矛盾。遮挡剔除技术的出现,很大程度上解决了这一矛盾。 遮挡剔除(Occlusion Culling)技术,是用于三维场景优化的重要技术,当物体被其它更靠近摄像机的物体完全遮挡而无法在摄像机中显示时,将不对该物体进行渲染。虚拟漫游系统的视点离地表较近,三维场景中较远的物体易被较近的物体所遮挡,当应用遮挡剔除技术时,将大幅降低场景中需要渲染的模型的数量,从而增加了产品实时渲染的速度。 Unity中的遮挡剔除技术 遮挡剔除在技术实现上,主要有两类方法: 一是将三维遮挡物体投影生成二维遮挡面并保存到深度缓存中,再利用深度图确立的遮挡关系进行深度剔除操作,即深度剔除法 另一类是将三维遮挡物体映射到二维平面,然后直接叠加到生成图像上,从而解决遮挡问题,即图像叠加方法。 在Unity中使用遮挡剔除时,会在渲染对象被送进渲染管线之前,将因为遮挡而不会被看到的隐藏对象或隐藏面进行剔除,从而减少了每帧的渲染数据量,提高了渲染性能。Unity在减少渲染对象时,先通过摄像机的视场角范围和剪切平面将不显示的内容进行剔除,然后可以对显示视角范围内的保留物体进行遮挡剔除。 Unity中遮挡剔除技术的应用 (一)Occlusion Culling的应用 打开Unity,在场景中导入或者创建三维场景,这里重点研究遮挡剔除问题,所以使用Unity 建立一个如下图所示的简易示例场景。场景中立方体表示实际场景中的建筑,它们之间会根据场景摄像机拍摄位置和视角的变化出现遮挡的情况。Occlusion Culling的应用就是将被遮挡住的物体从渲染队列中剔除,以减少硬件设备的数据计算量。

unity开发游戏的优缺点

Unity做游戏的几个优势: 1、跨平台,平台相关的功能Unity都已经帮你实现好了。即便有些Unity没有实现,也有插件帮你实现。 2、基于Unity的酷炫的粒子光效编辑。Unity本身就是一个功能强大的粒子编辑器。之前我还认为cocos2d-x的粒子系统的功能足够了,但是跟专业的编辑器比起来,远远不够。粒子系统要跟粒子特效编辑器配合起来,其功能远远不是之配置一个粒子系统的几个参数就可以的。cocos2d-x本身的粒子系统是很鸡肋的功能,只能拿来做一些简单的光效,不可能用来做复杂的技能特效。 3、由于框架和架构的优势,Unity的游戏可以极大程度避免崩溃和闪退。由于代码都是c#写的,并且是组件结构,所以即便出了错误也只是个异常而已,而不会影响到系统流程。 4、强大的性能分析工具,可以轻易的找到内存和cpu 的瓶颈。支持Android和iOS的真机运行分析。 5、编辑器可以方便的进行扩展,不需要像传统游戏公司一样,有一个专门写编辑器的部门。无论是场景编辑器还是技能编辑器都可以轻松搞定。如果想玩高科技的话,还可以把技能编辑器做成可拖拽的模块化结构,策划可以像搭积木一样来编辑技能。最重要的是,这些都是所见即所得的。 6、方便的资源管理系统。使用Unity,你不用特意维护几份资源(比如原始资源、打包后的资源、iOS版本资源、Android版本资源等等),只要一份资源,然后Unity里面可以设置它的具体参数,比如使用纹理压缩、最大限制在512x512大小等等。Unity发布游戏的时候会自动根据平台相关的导出选项导出正确的资源。 7、丰富的插件。有大量的功能我无论拿cocos2d-x还是Unity都不知道怎么实现。比如一些shader特效、物件碎裂的特效、场景破坏和变形的特效等等,这些在Unity插件中都可以找到对应的实现。而且很多Unity 的游戏都可以反编译,无形中又可以学到很多东西。 8、熟悉之后确实感觉Unity很简单。很多功能都是成体系的自然而然的。比如物理、碰撞检测、导航寻路、场景管理、场景烘焙。这些

Unity3D教程:实现多人场景的网络通信

Unity3D教程:实现多人场景的网络通信 Posted on 2013年01月30日 by U3d / Unity3D 基础教程/被围观 358 次 1.首先要准备一个client和server通信的连接对象和脚本,可以做到同一个程序里,通过点击不同的按钮决定充当client或是server。 2.服务器不需要控制人物,只需要提供一个连接的场所,客户端连入后,需要每个为客户端创建一个新角色。可以把玩家作为一个prefab,建立另一个对象SpawnPlayer,并附加脚本Spawnscript.js监控客户端连接到服务器上的事件OnConnectedToServer,这个 事件只有客户端才会触发。当触发后,就会在场景中用角色的prefab创建出一个新的实例,并且让所有人的场景中也都创建出来,这需要使用Network.Instantiate方法,这个 方法会用参数中给出的prefab在所有的客户端场景指定位置创建一个实例,底层其实是 封装了RPC调用。 3.玩家本身会附带控制脚本,但是客户端需要进行镜头追踪,因为玩家是动态生成出来的,所以开始时Camera上的追踪脚本的追踪目标并没有绑定到玩家,所以需要进行这一步操作。还要保证绑定的对象是自己客户端所对应的人物,而不是别人的人物,所以最 好从刚才Network.Instantiate时保存下自己创建出来的人物,然后将Camera脚本的target赋值为它。

从一个对象获取它的脚本的方法是用GameObject.GetComponet(Type type)函数,参数需要传脚本的类名,类名Unity规定是和脚本文件名的前缀是相同的,比如SmoothFollow.js就是SmoothFollow。 4.需要给人物的prefab增加NetworkView的Component来,因为需要既需要同 步人物的Transform信息,也需要同步Animation,所以增加2个NetworkView,这里决 定使用状态同步机制(也可以用RPC),所以设置相关状态同步的属性。 5.人物角色的控制需要一些特殊处理,因为每个创建出来的角色都有相同的控制脚本,而一个客户端只能控制自己的人物,在进行控制响应之前,需要确定是自己的人物才可以 操作。 这里使用人物身上的networkView的类方法isMine来判断。只有创建了这个人物 的client的这个属性才会为true。所以只要看这个属性不为true,在控制人物位移、跳跃、动画之前就直接return掉就可以了。

Unity3d游戏场景优化

Unity3d游戏场景优化 涉及到Lod技术 (Levels of Detail,多细节层次),选择剔除(Culling),光照贴图(Lightmap) (一) 光照贴图 动态实时灯光相比静态灯光,非常耗费资源。所以除了能动的角色和物体静态的 地形和建筑,通通使用Lightmap。 强大的Unity内置了一个强大的光照图烘焙工具Beast,这个东东是Autodesk公司的产品(可怕的垄断,感觉和3d沾边的软件丫都要插一手)。 据说用来制作过杀戮地带和镜之边缘。

镜之边缘建筑场景漂亮干净的光影,Lightmap的效果。 在Unity中制作Lightmap很方便,调节几个参数后直接烘焙即可。支持GI, Skylight, 效果一流!!!当然你需要一台好点的机器,不然漫长的烘焙过程你就有的等了。 内置的光照图烘焙工具Beast P场景准备和光照图烘焙点选Window --> Lightmapping 打开光照图烘焙面板: 1.确认所有将要被用来烘焙光照贴图的网格体 UVs正确无误. 最简单的办法是在mesh import settings中选择 Generate Lightmap UVs选项(由Beast自动分uv) 2.在Object面板中将所有网格体或地形标注为 static –这将告诉 Unity, 这些物体将不会被移动 和改变并且可以被赋予光照贴图。 3.为了控制光照贴图的精度, 进入Bake 面板并调整Resolution 的值. (为了更好的了解你的

lightmap texels使用情况, 在Scene 视窗中找到Lightmap Display 小窗口并且选择Show Resolution). 1. 点击 Bake 按钮。 2. Unity Editor's 会出现一个进度条,位置处于右下角. 3. 当烘焙结束, Lightmap Editor窗口会显示已经烘焙好的光照图. Scene 和 game 视图会同时自动更新–现在你的场景已经有了光照图的效果! Unity Lightmap的设置还有更详细和更高端的内容,请参考自带的文档!

unity3d无缝场景切换解决方案

unity3d无缝场景切换解决方案(1) - 简单场景切 换 所谓无缝场景切换,无非是涉及到场景或物体的预读,复杂点涉及下场景卸载,在复杂点涉及到场景二维数组,再在复杂点涉及数据结构用二叉树实现场景资源有序的读取与卸载。当然,复杂的我以后慢慢再说,比较懒,先写最简单的,如果能起到抛砖引玉作用,那这篇文章也算是物有所值了。 无缝场景切换的优缺点: 优点: 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,那就得考虑内存或显存能吃你多少场景数据并且处理起来不费力。 按照你所需要建立的无缝场景切换方式,你可以按场景的坐标建立以下几种方式:

Unity3D技术之Advanced优化图形性能详解

Unity3D技术之Advanced优化图形性能详解 优化图形性能良好的性能对大部分游戏的成功具有决定作用。下面是一些简单的指导,用来最大限度地提高游戏的图形渲染。 图形需要哪些开销游戏的图形部分主要开销来自电脑的两个系统: GPU 或 CPU。优化的第一条原则是找到性能出现问题的地方;因为 GPU 和 CPU 的优化策略不尽相同(甚至 可能截然不同—因此,通常在优化 CPU 的时候会给 GPU 带来更多工作,反之亦然)。 主要瓶颈以及检查瓶颈的方式: ?GPU 通常受供给比率或内存带宽的限制。 ?以更低的显示分辨率运行游戏是否更快?如果是,您极有可能受到了 GPU 上的攻击比率限制。 CPU 通常受需要渲染的对象的数量限制,又称“绘制调用”。 ?在渲染统计信息 (Rendering Statistics) 窗口中查看“绘制调用”,如果数值超过数千(电脑)或数百(手机),那么您可能需要优化对象数量。当然,这些只是经验法则;瓶颈也可能存在于其他地方。非主要瓶颈: ?渲染不是问题,不管是对 GPU 还是 CPU!例如,您的脚本或物理可能是问题的根源。使用分析器找出问题所在。 ?GPU 需要处理的顶点过多。多少个顶点比较“适中”取决于 GPU 以及顶点着色器的复杂程度。对于手机来说,主要图形“不应超过 10 万个”,电脑则“不应超过 1000 万个”。 ?CPU 要处理的顶点过多,因为这些对象要在 CPU 上进行顶点处理。这可能是蒙皮网格、棉布仿真、粒子等。文章出处【狗刨学习网】 CPU 优化—绘制调用数量为了渲染屏幕上的所有对象,CPU 任务艰巨—这些工作 包括识别哪些光照效果会影响对象,设置着色器和着色器参数,向显卡驱动发送调用命令,然后显卡驱动准备将命令发送至显卡。所有这些“逐对象” CPU 开销都不小,因此,如果您拥有大量可见对象,它可以累计。 例如,Unity如果您有 1000 个三角形,如果所有三角形都在一个网格内,而不是 1000 个独立的网格分别拥有一个三角形,那么,成本将明显降低。 Java

Unity3D 美术资源规范

Unity3D 美术资源规范 一.单位,比例统一 在建模型前先设置好单位,在同一场景中会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序需要缩放也可以统一调整缩放比例。统一单位为米。 二.模型规范 ⒈所有角色模型最好站立在原点。没有特定要求下,必须以物体对象中心为轴心。 ⒉面数的控制。移动设备每个网格模型控制在300-1500个多边形将会达到比较好的效果。而对于桌面平台,理论范围1500-4000。如果游戏中任意时刻内屏幕上出现了大量的角色,那么就应该降低每个角色的面数。比如,半条命2对于每个角色使用2500-5000个三角面。 正常单个物体控制在1000个面以下,整个屏幕应控制在7500个面以下。所有物体不超过20000个三角面。 ⒊整理模型文件,仔细检查模型文件,尽量做到最大优化,看不到的地方不需要的面要删除,合并断开的顶点,移除孤立的顶点,注意模型的命名规范。模型给绑定之前必须做一次重置变换。 ⒋可以复制的物体尽量复制。如果一个1000面的物体,烘焙好之后复制出去100个,那么他所消耗的资源基本和一个物体消耗的资源一样多。 三.材质贴图规范

⒈我们目前使用的Unity3D软件作为仿真开发平台,该软件对模型的材质有一些特殊的要求,在我们使用的3dsMax中不是所有材质都被Unity3D软件所支持,只有standard(标准材质)和Multi/Sub-Objiect(多维/子物体材质)被Unity3D软件所支持。注:Multi/Sub-Objiect(多维/子物体材质)要注意里面的子材质必须为standard(标准材质)才能被支持。 ⒉Unity3D目前只支持Bitmap贴图类型,其它所有贴图类型均不支持。只支持DiffuseColor (漫反射)同self-Illumination(自发光,用来导出lightmap)贴图通道。Self-Illumination(不透明)贴图通道在烘焙lightmap后,需要将此贴图通道channel设置为烘焙后的新channel,同时将生成的lightmap指向到self-Illumination。 四.贴图文件格式和尺寸 原始贴图不带通道的jpg,带通道的为32位tga或者png,尺寸最大别超过2048,贴图文件尺寸须为2的N次方(8、16、32、64、128、256、512、1024)最大贴图尺寸不能超过1024x1024,特殊情况下尺寸可在这些范围内做调整。 五.贴图材质应用规则 ⒈贴图不能为中文命名,不能有重名; ⒉材质球命名与物体名称一致,材质球的父子层级的命名必须一致;

基于Unity3D的虚拟地理环境构建

龙源期刊网 https://www.360docs.net/doc/b816332605.html, 基于Unity3D的虚拟地理环境构建 作者:刘海艳陆映峰 来源:《商情》2020年第39期 【摘要】虚拟地理环境是基于虚拟技术而出现的一种全新内容,其本身能够有效的模拟实际的景物,从而实现对实际景物的模拟操作。这种情况下,虚拟地理环境构建就能够帮助很多行业实现之前不可能完成的任何。例如在建筑行业,可以通过虚拟地理环境的构建,来实现对环境的高度模拟,从而添加建筑等,来进行完整的视图。但是目前来看,我国的虚拟地理环境构建存在的问题非常严重,其主要的构建的地理环境和实际偏差过大,导致难以满足使用的需求。则本文将从基于Unity3D的虚拟地理环境构建方法入手,全面的展开基于Unity3D的虚拟地理环境构建探究。 【关键词】Unity3D技术; 虚拟地理环境构建; 虚拟环境生成 一、基于Unity3D的虚拟地理环境构建方法 Unity3D是一种全新的技术,这种技术的特点就是具有更加精密的计算引擎,能够实现更多维度的计算。但是这种计算应该是基于现实而出现的,或者说是基于现实规则而出现的,所以在使用Unity3D技术的使用,需要在其中导入相关的算式,这样才能塑造出更加真实的内容。目前来看,我国的虚拟地理环境构建方法之中,并不能有效的进行Unity3D技术的全面应用,主要是对相关的构建方法不够了解,为了更好的改变这种情况,所以本文提出具体的构建方法: (一)基本构建步骤 根据Unity3D仿真平台的特点,基于Unity3D的虚拟环境生成过程可以简化为以下几个步骤。按照先后顺便分别是地形地物素材准备、基本环境生成及修理、纹理贴图、道路巷道设置、树木植被叠加、地表植被叠加和地形细节设置等步骤。 (二)构建优化方法 虚拟环境生成方法中所谓的优化包含2个方面:一是对地形生成先后顺序的优化,二是对各步骤所需素材及辅助工具的优化。从本质上讲,都是环境生成的必要环节,没有先后顺序之分。但考虑到地形和地物建模的方便性和Unity3D场景的特点,通常按照“从下到上、从小到大、从疏到密、从点到面”的原则进行。地表纹理处理最底层,制作优先度高,其次是巷道沟渠,然后是建筑。从高度上讲,它们往往处于地表之下或紧贴地表或结构复杂,制作的优先度是在灌木和植被之上。辅助工具优化表现在右侧方框中,结合U-nity3D平台的开发特点,描

Unity模型制作规范及解决方法

《3D-Unity模型物体制作规范》 01.管理场景。首先看看场景有没有虚拟体,辅助对象,空组,空物体,全部都要删除。以免场景 过大,或是影响到后期物体的动画调整。 02.优化模型。工业模型尽量不要出现,能用简模就用简模.优化模型的目的就是进unity运行 的更快。首先你要保证模型能用。优化之前先与方案人员沟通,哪些物体可以删除,哪些物体被遮掩看不到,尽可能的节省面数。只是单纯的去优化模型删边删面,面数少不了多少。 03. 检测模型。首先导出你所优化的所有模型,看看是否能全部导出,第二步在unity里旋转看看模型是否有破面。这一步很关键,要确保模型能导出,物体没有破面。 04. 材质。unity里的物体材质,需要max提供材质球.标准做法就是3d人员在max里将物体材质琢个上一遍,只需要上一个基本色,即物体的漫反射。物体表面有材质球命名与物体命名统一,全部用英文.举例,物体a,材质名称就是a.如果用中文,unity都是乱码.物体的贴图也要用英文,这样导fbx时,勾选贴图,材质贴图在unity里就能直接显示,省去unity人员在琢个加载贴图.所有物体包括拆装工具都要加uvw贴图,本身有纹理贴图或是已经展过uv的物体就不要再加了。不展uv,影响到unity里物体材质效果。 05.动画调整。注意的就是工具动画要放到场景里去调试,以免跟附近其它模型有穿插.max工具动画是不需要调整的,后期unity人员会用程序代码控制.3d人员的工作就是将物体轴心调到跟工具轴心一致。动画帧数要用text文档记录好.举例,螺栓01拆1-10, 螺栓01装11-20,之后做好发给unity人员好切动画. 06.组的应用,父子关系的应用。理解清楚这些概念,才能更好的去做动画,服务项目。 注意事项及技巧 01.由于Unity看不到单面模型的反面,故导出请仔细检查单面物体。如玻璃。 02.材质、贴图、模型名称中不能出现中文。进unity,不要出现中文名,以免出现乱码,报错。 03.地面用贴图,不要用子材质。 04.max默认的uv平铺在unity里是出错的,要加uvw贴图去调整。 05.相同材质的模型用同一个材质,以减轻系统与后期材质制作负担。 06.可以塌陷的模型尽量塌陷。 07.单个模型四边面数不能超过3万。极限是三万,大概在两万五就可以。 08.零件所对应的碰撞体,命名规范参照《1ZR零部件参数定义》。 09.动画曲线是直线,做之前先将max设置好。 10.工具轴心要统一.将工具对好要拆卸的物体,然后调整物体轴心,确保物体工具轴心统一。 11.所有物体的碰撞体命名要规范,如,aa,碰撞体名为Collider_aa,第一个字母C要大写。检查碰撞体是否都绑定上物体。 12.物体的关键帧只能出现在一段时间内,其它时间段内不要出现此物体的关键帧。除非是同一时间段,多个物体同时动画,才允许同一时间内出现关键帧。 13.场景合并文件或是导出fbx之前,记得要保存,跟建模布尔之前要保存是一个概念,max经常会出现意外的报错。

某Unity引擎3dArpg手游项目美术场景制作程序部门给出的细化规则

某Unity引擎3dArpg手游项目美术场景制作程序部 门给出的细化规则 由于手游设备的特性,场景之作遵循以下标准: 1.单个物体最大500面,如果超过,分拆成不同的子物体;尽量使 用背面预先剔除的模型(只有一半可见的模型),节省资源,提高效率。 2.UV值范围不要超过[0,1]区间,保证UV不越界,以方便将来纹 理拼合,去除对Lightmapping的影响。 3.去除模型中UV映射的接缝以及重合的顶点。 4.所有贴图必须长宽相等,格式位tga,单个导入设置最大1024, 够用就好,在保持效果的前提下,尽量缩小。 5.贴图导入设置开启Mipmap,关闭Read/Write Enable。 6.类型相似且材质相同的模型尽量合并为贴图集,减少材质数量。 7.禁止同一个模型使用多个数量的相同贴图和材质,十分浪费,一 个材质即可解决问题。 8.尽最大可能减少使用透明材质(Alpha Blend),如果使用尽可能 减少透明区域在屏幕上的覆盖面积,移动平台对于透明非常敏感,消耗很大。 9.移动显卡对于Cutout(Alpha Test/clip)材质消耗十分大,效率非 常低下,除非必要的情况,一定要避免使用。 10.单个地形长宽最大128x128。 11.地表贴图导入设置最大256。

12.地表纹理混合最多4层,尽量减少,能合并的纹理尽量预先合并。 13.Unity地形转换为Mesh后,从场景里删除Unity地形,在场景最 终制作完成后,删除地形Mesh的MeshCollider组件。 14.单个场景的总面数最大3w面,极限最大5w面;通用建议:以最 大3w面为常用面数,大场景可以到3w-4w,极个别场景最大5w 面且要慎重使用,总体来讲总面数越小,效率越高,能适配的机型越多。 15.合理设计场景使得摄像机同时可见物体最少,以摄像机同时可见 面数不超过当前场景总面数的70%为最佳状态,且越少越好。16.合理设计场景,避免出现场景物体频繁遮挡或者穿透摄像机的问 题,摄像机不可见部分减少或禁止设计内容,避免种植对场景视觉几乎无影响又非常小的琐碎物体。 17.设置合理的远/近裁剪面,过小的近裁剪面和过大的远裁剪面,会 增加不必要的物体加入渲染,降低效率,同时降低了DepthBuffer 精度,容易出现Z-Fighting现象。 18.合理设置摄像机的fov,过大的fov会产生严重的边角变形,且由 于张角过大视椎体增大,会增加渲染物体的数量,一般以45度角为准,最大50度。 19.根据不同的Layer,设置不同的Cull Distance,以便及时裁减掉 不可见或者无用的物体。例如:大物体层设置的可视距离大些,而小物体层可以设置地小些,另外,一些开销比较大的实体(如粒子系统)可以设置得更小些等等。

unity场景优化问题

■图形显示的优化 简单来说就是「结合!结合!结合!」(combine! combine! combine!) Mesh 尽可能结合,Material 和Texture 尽可能共享。 一个Mesh 建议使用的面数在1500~4000 之间。 一个Mesh 建议只用一个Material。 注意:两个Mesh结合成一个Mesh,但是却使用两个Material,并不会提高效能。 如果要提高效能必须把这两个Mesh的Material也合并成一个。 换句话说,一个Mesh使用多个Material 和一个Material 使用多个render,其实耗能是差不多的。 所以,尽可能的让对象共享相同的Texture 才是提升效能的根本之道。 Pixel Light Pixel Light 非常耗能,如果想要在旧计算机上也跑得很顺, 可以在Edit->Render Settings 中把Pixel Light Count 设成0。(完全不使用Pixel Light) 你也可以根据每个Light 的重要度,分别设定。 重要度高的Render Mode 设成Force Pixel 。 不重要的设成Force Vertex。 Layer 管理 地上的小石头或瓦砾之类的小东西产生的影子比较不明显,

我们可以把这些东西设在同一个图层。 并利用script中https://www.360docs.net/doc/b816332605.html,yerCullDistances 功能变更参数控制显示的距离。 function Start () { var distances = new float[32]; // Set up layer 10 to cull at 15 meters distance. // All other layers use the far clip plane distance. distances[10] = 15; https://www.360docs.net/doc/b816332605.html,yerCullDistances = distances; } Shadow 影子的计算完全依靠GPU。 Soft shadow 比hard shadow 多花费GPU效能。但是两者使用的CPU 与内存是相同的。 Anti-aliasing 也是完全靠GPU计算。 Anisotropic Textures 也是完全靠GPU计算,建议在天花板或是地板的Texture 上使用。 关于实时阴影的优化,请参考叫你自由前辈所写的这一帖: https://www.360docs.net/doc/b816332605.html,/thread-2263-1-2.html ■Texture 2D Unity 读取PSD档之后,会自动将图档平面化缩压,并不会让制作

unity大场景优化

首先介绍下draw call(这个东西越少你的游戏跑的越快): 在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏幕上呈现出来。这就和你希望你的亲友收到准备好的圣诞礼物需要包装好然后穿过城市准时放在他应该出现的地方一样没什么不同。你的CPU来完成包装和传递他们的活,同时会消耗很多的带宽,所以最终分配好这些关键性资源很重要。目前,真正可怕的事情是从描绘指令消耗远景开始,每一个独立的飞溅到地板上的血迹和一个角色或者一具死尸消耗的字节是一样的多的:他们都消耗同样的描绘指令。除此之外,没有什么更多的差别。 那么如何降低draw call 呢??那么我们就用到Culling(剔除)技术。如果不应用这个技术,电脑是不管3721把场景里所有的东西都送去渲染的。看得见的也渲染,看不见得照样也送去渲染。很傻是吧,那咋办呢。得告诉电脑,那个你 看得见的渲染,看不见的就算了。于是就有了 1.视锥体剔除(Frustum Culling)这个unity系统自带了好像,就不用操心了。 2.遮挡剔除(Occlusion Culling) Unity 3专业版内置了一个强大的Occlusion Culling 插件Umbra免费的 遮挡剔除(Occlusion Culling)遮挡剔除是一种什么样的特性呢,当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染。. 遮挡剔除在3D图形计算中并不是自动进行的。因为在绝大多数情况下离camera 最远的物体首先被渲染,靠近摄像机的物体后渲染并覆盖先前渲染的物体(这被称为重复渲染,无效渲染"overdraw"). 遮挡剔除不同于视锥体剔除. 视锥体剔除只是不渲染摄像机视角范围外的物体而对于被其他物体遮挡但依然在视角范围内的物体则不包括在内. 注意当你使用遮挡剔除时你依然受益于视锥体剔除(Frustum Culling).

Unity面试题分析

最近unity3d找工作有些受挫,自己也开始补课了。 下面把这段时间看到的些面试题供出来让大家也学习下,题目只是面试官选拔人才的一部分,在研究面试题目的过程中,多检测下自己的不足,及时温习或补习下,最终学到真本事才是最重要的。 祝自己也祝大家好运哈! 题目中有些答案有网上搜的,也有个人整理的,有错误或不足的地方,望指正,谢谢! 文章最后会有参考的一些网址或资料的链接,有想看原址的朋友可以直接跳到最后哦。 题目归类区(看题目字体颜色识第几部分) ps:下面题目可能稍有点多,翻页会较麻烦,根据题目的颜色辨别是第几部分吧(超链接功能不会,也懒得做了) 第一部分 1.请简述值类型与引用类型的区别 2.C#中所有引用类型的基类是什么 3.请简述ArrayList和List的主要区别 4.请简述GC(垃圾回收)产生的原因,并描述如何避免? 5.请描述Interface与抽象类之间的不同 6.下列代码在运行中会产生几个临时对象? 7.下列代码在运行中会发生什么问题?如何避免? 8.请简述关键字Sealed用在类声明和函数声明时的作用 9.请简述private,public,protected,internal的区别 10.反射的实现原理? 11. .Net与Mono的关系? 12.简述unity3d支持的作为脚本的语言的名称 13.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么? 14.Unity3D的协程和C#线程之间的区别是什么? 15.U3D中用于记录节点空间几何信息的组件名称,及其父类名称 16.简述四元数的作用,四元数对欧拉角的优点?

17.向量的点乘、叉乘以及归一化的意义? 18.矩阵相乘的意义及注意点 19.为何大家都在移动设备上寻求U3D原生GUI的替代方案 20.请简述如何在不同分辨率下保持UI的一致性 21.为什么dynamic font在unicode环境下优于static font 22.Render的作用?描述MeshRender和SkinnedMeshRender的关系与不同 23.简述SkinnedMesh的实现原理 24.在场景中放置多个Camera并同时处于活动状态会发生什么? 25.Prefab的作用?如何在移动环境的设备下恰当地使用它? 26.如何销毁一个UnityEngine.Object及其子类 27.为什么Unity3D中会发生在组件上出现数据丢失的情况? 28.如何安全的在不同工程间安全地迁移asset数据?三种方法 29.MeshCollider和其他Collider的一个主要不同点? 30.当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免? 31.OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生? 32.请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义? 33.Unity3D如何获知场景中需要加载的数据? 34.MeshRender中material和sharedmaterial的区别? 第二部分 1.请描述游戏动画有哪几种,以及其原理。 2.alpha blend 工作原理 3.写光照计算中的diffuse的计算公式 4.lod是什么,优缺点是什么 5.两种阴影判断的方法工作原理 6.MipMap是什么?作用? 7.用u3d实现2d游戏,有几种方式? 8.u3d中碰撞器和触发器的区别? 9.物体发生碰撞的必要条件 10.CharacterController和Rigidbody的区别 11.物体发生碰撞时,有几个阶段,分别对应的函数 12.u3d中,几种施加力的方式,描述出来。

Unity3D技术之加载游戏场景并显示进度条实现详解

Unity3D加载场景有很多种方式,做一些小的 DEMO 的时候往往是直接使用 Application.LoadLevel 或者 Application.LoadLevelAsync 加载场景,,但是这种办法不适合在真正的 Unity3D 开发中,因为前一种需要把所有的场景都打包,这在某些情况下是不现实的,比如开发页游,我们不可能把所有的场景都打包让用户下载,我们需要一个场景一个场景的加载,这时候我们可以使用 WWW 先通过 HTTP 加载场景到本地缓存,然后再使用 Application.LoadLevel 或者 Application.LoadLevelAsync 函数加载场景,使用这种加载方式,不仅不需要 Build Settings -> Add Current 处理加载场景,进度条的显示也更加容易,但是使用这种方式,需要先把场景打包成 unity3d 或者assetbundle 文件。文章出处【狗刨学习网】 先把测试场景搭建好,如图: 然后添加一个 C# 脚本,取名 UseWww.cs,全部代码如下: https://www.360docs.net/doc/b816332605.html,ing UnityEngine; https://www.360docs.net/doc/b816332605.html,ing System.Collections;

3. 4.public class UseWww : MonoBehaviour 5.{ 6.public UISlider progressBar; 7.public UILabel lblStatus; 8. 9.private WWW www; 10.private string scenePath; 11. 12.void Awake() 13.{ 14.this.scenePath = "file:///" + Application.dataPath + "/Assets/MainScene.unity3d"; 15.// 开始加载场景 16.this.StartCoroutine (this.BeginLoader ()); 17.} 18. 19.void Update() 20.{ 21.if (this.www != null && this.progressBar != null && !this.www.isDone) 22.{ 23.// 更新进度 24.this.progressBar.value = this.www.progress; 25.} 26.} 27. 28.private IEnumerator BeginLoader() 29.{ 30.this.lblStatus.text = "场景加载中,请稍候。。。"; 31.// 加载场景使用 WWW.LoadFromCacheOrDownload,函数,这样加载完成才能使用 Application.LoadLevel 或者 Application.LoadLevelAsync 32.this.www = WWW.LoadFromCacheOrDownload (scenePath, Random.Range(0, 100)); 33.yield return this.www; 34. 35.if(!string.IsNullOrEmpty(this.www.error)) 36.{ 37.this.lblStatus.text = "场景加载出错!"; 38.} 39. 40.if (this.www.isDone) 41.{ 42.this.lblStatus.text = "场景正在初始化,请等待。。。"; 43.Application.LoadLevelAsync("MainScene"); 44.} 45.} 46.}

Unity 场景优化LOD 技术

LOD技术在Unity场景优化中的作用 LOD(Level Of Detail)技术,也称为层次细节技术,是在实时渲染显示系统中采取的细节省略技术,此技术于1976 年由Clark 提出。在由多层次结构物体组成的场景当中,其模型之间的区别在于细节的描述程度,细节越丰富,在实时渲染过程中就会消耗更多的系统资源,显示速度就越慢。同时,在游戏角色或虚拟人物(后称“视点”)运动的过程中,物体在屏幕上的显示大小会发生变化。物体占屏幕面积越小,其细节表现越差。 不同细节的LOD 模型随视点移动的变化 LOD 技术就是利用这一特点,在不影响画面视觉效果的前提下,通过逐次简化场景中物体的细节来减少其复杂性,从而提高渲染速度。该技术通常对每个原始物体模型建立几个不同复杂程度的几何模型,与原模型相比复杂度依次降低且均保留一定层次的细节。在渲染时根据视点距该物体的距离(或该物体在显示时所占屏幕面积的大小),选择适当层次细节的几何模型来显示。如上图所示,LOD0 至LOD2 模型即为物体的原始模型和与其具有不同复杂程度的几何模型,它们的细节层次逐渐减少。当视点位置移动到不同LOD 范围时,场景中显示对应的LOD 模型。 Unity中的LOD技术 使用Unity 开发的产品,多为实时三维游戏或虚拟现实系统,这样的产品在运行的过程中需要硬件进行实时渲染,加之其产品可以发布到移动终端和智能手机平台,故需要对产品场景进行大量的优化,以满足其运行速度。Unity 具有高度优化的图形渲染管道,内嵌了Mecanim动画系统、Shuriken 粒子系统、Navigation Mesh 寻路系统、Autodesk Beast 烘焙工具、Umbra 遮挡剔除工具、NVIDIA PhysX 物理引擎等。 其中LOD 技术在Unity 中以LODGroup 组件的形式被使用。如下图所示。在该组件中,开发者可以将不同层次细节的物体模型分别添加到LOD:0 至LOD:7 中。其中,LOD:0 在视点最近距离观看时进行显示,一般添加层次细节丰富的原始模型,后面的各个LOD 依次添加与原始模型外观相同但细节层次逐次降低的模型。最后的“Culled”表示该模型在场景中消失,一般这种情况出现在视点离物体非常远的情况。

相关主题
相关文档
最新文档