Unity场景遮挡剔除技术优化

Unity场景遮挡剔除技术优化
Unity场景遮挡剔除技术优化

Unity场景遮挡剔除技术优化

复杂的三维场景,尤其是复杂的地表模型,具有复杂的结构,在渲染时需要花费更多的时间。若要在实时渲染过程中快速绘制地形,应该首先考虑如何解决大规模数据构成的复杂地形表面模型与计算机图形硬件有限的绘制能力之间的矛盾。遮挡剔除技术的出现,很大程度上解决了这一矛盾。

遮挡剔除(Occlusion Culling)技术,是用于三维场景优化的重要技术,当物体被其它更靠近摄像机的物体完全遮挡而无法在摄像机中显示时,将不对该物体进行渲染。虚拟漫游系统的视点离地表较近,三维场景中较远的物体易被较近的物体所遮挡,当应用遮挡剔除技术时,将大幅降低场景中需要渲染的模型的数量,从而增加了产品实时渲染的速度。

Unity中的遮挡剔除技术

遮挡剔除在技术实现上,主要有两类方法:

一是将三维遮挡物体投影生成二维遮挡面并保存到深度缓存中,再利用深度图确立的遮挡关系进行深度剔除操作,即深度剔除法

另一类是将三维遮挡物体映射到二维平面,然后直接叠加到生成图像上,从而解决遮挡问题,即图像叠加方法。

在Unity中使用遮挡剔除时,会在渲染对象被送进渲染管线之前,将因为遮挡而不会被看到的隐藏对象或隐藏面进行剔除,从而减少了每帧的渲染数据量,提高了渲染性能。Unity在减少渲染对象时,先通过摄像机的视场角范围和剪切平面将不显示的内容进行剔除,然后可以对显示视角范围内的保留物体进行遮挡剔除。

Unity中遮挡剔除技术的应用

(一)Occlusion Culling的应用

打开Unity,在场景中导入或者创建三维场景,这里重点研究遮挡剔除问题,所以使用Unity 建立一个如下图所示的简易示例场景。场景中立方体表示实际场景中的建筑,它们之间会根据场景摄像机拍摄位置和视角的变化出现遮挡的情况。Occlusion Culling的应用就是将被遮挡住的物体从渲染队列中剔除,以减少硬件设备的数据计算量。

(二)设置Occlusion面板

在Unity菜单中选择Windows—Occlusion Culling命令,将打开Occlusion窗口,场景中将出现Occlusion Culling设置面板,选择该面板中的View Volumes选项,场景中的物体将被网格进行空间划分,如下图所示。

选中场景中所有长方体(即模拟的建筑物),选择Occlusion窗口中的Object选项夹,勾选该窗口中的Occluder Static 和Occludee Static 选项。其中Occluder Static选项用于赋予物体遮挡其它物体的能力,Occludee Static选项表示物体能够被其它物体所遮挡。对于一些透明、较小的物体,一般只选择Occludee Static而不选择Occluder Static。选择Occlusion窗口中的Bake选项夹,调整其中的Smallest Occluder、Smallest Hole 和Backface Threshold三项的值。它们的功能如下:

●Smallest Occluder:设置最小遮挡物的尺寸,当遮挡物的长或者宽大于设定值时,该物体才能够遮挡住后面的物体。

●Smallest Hole:设置最小孔的尺寸,当穿过物体内部的孔或者多个物体堆叠形成的孔的大小小于设定值时,遮挡剔除烘焙将忽略该孔的存在。

●Backface Threshold:设置背面移除阈值,用于优化场景。当该值为100时,摄像机拍摄不到的背面信息也会完整保留;当该值较小时,系统将对背面信息进行优化甚至去掉背面信息。

(三)遮挡剔除烘焙

参数设置完成后,点击窗口下方的Bake按钮即可进行遮挡剔除的烘焙,烘焙完成后,选择Occlusion窗口中的Visualization选项夹,即可在场景窗口中看到遮挡后的效果,大多数的长方体被剔除。

(四)使用Occlusion Area

Occlusion Area,即遮挡区域,用于场景较大而摄像机运动范围相对较小的情况。为摄像机活动的区域设置Occlusion Area,可以减少烘焙的数据量,从而节约烘焙时间。可以在未选中场景中物体的情况下,在Occlusion面板的Occlusion Areas选项夹下点击Create New后的Occlusion Area按钮进行创建。然后就可以在层次面板中看到创建的Occlusion Area,并可以在场景中调整其位置和大小。当需要进行遮挡剔除的区域被覆盖之后就可以对其进行烘焙。

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/0e17616434.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/0e17616434.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/0e17616434.html,yerCullDistances = distances; } Shadow 影子的计算完全依靠GPU。 Soft shadow 比hard shadow 多花费GPU效能。但是两者使用的CPU 与内存是相同的。 Anti-aliasing 也是完全靠GPU计算。 Anisotropic Textures 也是完全靠GPU计算,建议在天花板或是地板的Texture 上使用。 关于实时阴影的优化,请参考叫你自由前辈所写的这一帖: https://www.360docs.net/doc/0e17616434.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/0e17616434.html,ing UnityEngine; https://www.360docs.net/doc/0e17616434.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”表示该模型在场景中消失,一般这种情况出现在视点离物体非常远的情况。

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