您的位置:首页 > 移动开发 > Unity3D

Unity3D基础知识梳理

2017-05-29 19:28 417 查看

基本框架体系

美术部分

美术主要内容:

3d模型

材质

纹理(贴图)

shader(着色器),Unity本身拥有几十种shader,也可以根据自己的需要使用shaderLab语言来编写shader

贴图、纹理、材质区别?

整个 CG(影视动画) 领域中这三个概念都是差不多的,在一般的实践中,大致上的层级关系是:材质 Material包含贴图 Map,贴图包含纹理 Texture。

纹理是最基本的数据输入单位,游戏领域基本上都用的是位图。此外还有程序化生成的纹理 Procedural Texture。贴图的英语 Map 其实包含了另一层含义就是“映射”。其功能就是把纹理通过 UV 坐标映射到3D 物体表面。贴图包含了除了纹理以外其他很多信息,比方说 UV 坐标、贴图输入输出控制等等。

材质是一个数据集,主要功能就是给渲染器提供数据和光照算法。贴图就是其中数据的一部分,根据用途不同,贴图也会被分成不同的类型,比方说 Diffuse Map,Specular Map,Normal Map 和 Gloss Map 等等。另外一个重要部分就是光照模型 Shader ,用以实现不同的渲染效果。

Unity中的UV

首先我们来认识下什么是UV,在三维中UV这里是指u,v纹理贴图坐标的简称(它和空间模型的X, Y, Z轴是类似的)。它定义了图片上每个点的位置的信息。这些点与3D模型是相互联系的, 以决定表面纹理贴图的位置。

UV就是将图像上每一个点精确对应到模型物体的表面。在点与点之间的间隙位置由软件进行图像光滑插值处理。这就是所谓的UV贴图。

那么UV坐标又是什么呢,由于所有的图象文件都是二维的一个平面。水平方向是U,垂直方向是V,通过这个平面的,二维的UV坐标系。我们可以定位图象上的任意一个象素。但是一个问题是 如何把这个二维的平面贴到三维的NURBS表面和多边形表面呢?

对于NURBUS表面。由于他本身具有UV参数,尽管这个UV值是用来定位表面上的点的参数,但由于它也是二维的,所以很容易通过换算把表面上的点和平面 图象上的象素对应起来。所以把图象贴带NURBUS表面上是很直接的一件事。 但是对于多边形模型来讲,贴图就变成一件麻烦的事了。所以多边形为了贴图就额外引进了一个UV坐标,以便把多边形的顶点和图象文件上的象素对应起来,这样才能在多边形表面上定位纹理贴图。所以说多边形的顶点除了具有三维的空间坐标外。还具有二维的UV坐标。 对于纹理贴图而言,一张贴图的U和V坐标的数值范围都是0到1,而不管他的实际分辨率是多少。

3D中,这几个概念没有那么复杂。

1、纹理即“纹路”,每个物体表面上不同的样子,譬如说木头的木纹状。

2、贴图是图,最简单的形式是ps之类的软件做出来的一张图,这些图在3D中用来贴到物体的表面,用来表现物体的“纹理”。

3、材质主要是用来表现物体对光的交互(反射、折射等)性质的。譬如金属对光的反射和毛毯对光的反射性质完全不一样,那么对3D程序来说,这样的差别就通过材质这个属性来计算出不同的颜色。上面是最简单的说法。

对于2来说,在实际的3D程序中,贴图经过历史的演化,出现了很多的其他用作不同场合的种类,譬如有凹凸贴图用作计算物体表面的凹凸感,这个就不是严格意义上的纹理作用。对于3来说,程序员往往让“材质”这个东西包含贴图在内,也就是在程序里,材质就是(a)各种贴图和(b)物体对光的交互性质的集合。

参考自知乎:https://www.zhihu.com/question/25745472

程序部分

基本组成:

Scene(场景),类似于Flash中的stage,用于放置各种对象

GameObject,可以携带各种Component(每个GameObject至少带有Transform组件,所有的组件都可以从顶部菜单Component里面找到并添加给游戏对象)

Component组件,附加在GameObject上,不同的组件可以使GameObject具有不同的属性,Transform、碰撞器、刚体、渲染器等都是组件,脚本也是组件的一种,对象所表现出来的行为都是由组件实现的。

脚本语言

C#、Javascript、boo(前两者使用较为广泛,网上教程以前两者为主,个人推荐c#),一般的继承MonoBehaviour类的脚本都需要依附的场景中的对象上才能被执行。

用户图形界面部分(GUI)

用于制作按钮、文本显示、滚动条、下拉框等常用图形操作界面元素,使用GUISkin和GUIStyle可以自定义样式)

系统自带GUI

各类GUI插件,NGUI、EZGUI等。

(Prefab)预制

用于程序运行时,动态实例化对象的“母体”,比如,在射击类游戏中,子弹的生成就可以使用实例化预制的方式来实现,这就好比是Flash中的各种Display类,你可以定义它的各种属性方法,然后在使用的时候直接实例化一个实例。

在project面板右击选择Creat——Prefab新建一个预制,将Hierarchy面板中要制成预制的对象拖到这个新建预制上即可。

标签和层:

标签(tag)用于辨别物体,与name类似,使用对象的tag和name都可以找到对应的物体。

(GameObject.Find(“Name”)、 GameObject.FindWitnTag(“Tag”))
默认是Untagged,可以通过Inspector面板里面Tag的下拉菜单选择Add Tag项来添加新的标签,

层(layer),在使用某些功能的时候,可以通过层来过滤不需要运用该功能的对象,也就是把该功能运用到特定的层,比如,相机的Culling Mask属性,通过选择特定层可以实现只显示位于被选中的层的对象。层的添加也是在标签管理器中,Unity已经设置了8个层,你是不能对这8个层进行修改的,你可以从第9个(也就是user layer8)开始添加你定义的层。

资源:

.unitypackage格式的文件可以直接import到unity中,记住最好是在打开unity的情况下,在project面板里右击,然后在import packages中选中你要导入的资源。注:Unity不识别中文路径,因此要导入的资源千万不要放在中文目录下!!!还有你的工程也不要新建在中文目录下!!!(你新建工程的时候选择中文路径的话,也建不起来~)

也可以把你的场景打包,导出.unitypackage资源包,然后可以在其他项目中导入使用。(在project面板里右击, export package)

另外,利用工程面板(project)右键菜单中的import new assets可以导入其他形式的资源,如,模型、音频、视频等,当然也可以直接将外部文件夹中的资源拖到project中的方式完成导入。

物理引擎:

unity使用NVIDIA PhysX物理引擎

碰撞器:各种基本体的碰撞器(box、sphere、capsule、cylinder),网格碰撞器(mesh collider)、车轮碰撞器(Wheel collider)、地形碰撞器(terrain collider)——碰撞器组件在你选中对象的时候会以绿色线框显示。

碰撞检测:碰撞器碰撞检测、光线投射(射线)、触发器碰撞检测,通过碰撞检测可以得到与当前对象发生碰撞的对象信息,使用碰撞的相关函数OnCollisionEnter(碰撞器碰撞检测)、OnTriggerEnter(触发器碰撞检测)、Physics.Raycast(光线投射)获取。

刚体:模拟物体物理现象的基础,加了刚体组件才能模拟重力、阻力等。

力:作用于刚体,你只要通过添加各种力,就可以使刚体表现出跟现实中一样的受力情况。

粒子系统:

两种形式,一种以物体携带粒子系统组件的形式实现,另一种是直接使用粒子系统GameObject(3.5以后)

粒子系统GameObject:GameObject——Creat other——Particle system

粒子系统组件:粒子发射器(ParticleEmitter,有Ellipsoid Particle Emitter和Mesh Particle Emitter两种类型的粒子发射器,主要有粒子产生、数量、速度、大小、存活时间等参数设置)、粒子动画器(Particle Animator,主要负责粒子产生后直至粒子消亡的行为变化的控制,包括运动过程中的旋转、受力等)、粒子渲染器(Particle Renderer,主要是负责给予粒子的渲染,阴影、材质等设定)

相机(camera):

相机视角:透视(可以调整透视角度)、正交(没有透视效果)

Skybox:只在Game窗口可见,需要skybox类型的shader,以及附在其上的六面贴图纹理。

第一人称视角:角色不出现在视野中,相机看到的就像角色双眼看到的一样,如,常见的FPS射击类游戏。

第三人称视角:能在视野中看到角色,相机一直跟随者角色运动。(可以导入Unity自带的CharacterControllers资源包,里面有第一人称和第三人称的原型)

光照系统:

创建灯光GameObject——creat other

常用灯光类型:平行光(Directional light,无衰减,模拟太阳光)、聚光灯(spotlight,从一点向某一方向发射锥形光束,有衰减,聚光效果)、点光源(Pointlight,从一点向外辐射,有衰减)

烘焙:将静态光影效果渲染到纹理上,减少灯光和阴影带来的开销(free版的Unity不支持阴影,因此烘焙是free版实现阴影的方式)。

阴影:只有pro版才支持,分为hard shadows和soft shadows两种,前一种阴影比较重,后一种相对柔和。但是默认情况下,你会发现只要directional light类型的灯光才可以使用阴影,别急,咱们来改一个设置,让其他两种灯光也能使用阴影,打开edit-project settings-player,然后将rendering path改为deferredlighting(延迟光照),这下你的电光源和聚光灯也能产生阴影了~(要产生阴影,还需要将投射阴影的对象的Cast shadows(投射阴影)勾选,将接受阴影的对象的Receive shadows(接受阴影)勾选, BFQJU[8JN{DLRGY83DULG.jpg 举个例子,你要让树在地面上产生阴影,那就得让树投射阴影,然后让地面接受阴影才行)。

地形系统:

选择顶部菜单Terrain——creat terrain创建一个地形。

地形有一组地形工具用来绘制地形的高度、生成各种地貌,并且可以对地表运用纹理,还可以添加树、草等地表植被。当然在使用纹理绘制地形以及添加地表植被之前需要导入相关的纹理资源和植被资源,另外还可以导入unity自带的水的资源包,使用它里面的水面来模拟地形中的湖泊、河流等。

发布:

关于Player settings播放器设置的话这里暂且不多说,发布的时候通过player setting进行发布设置,每个平台都有对应的设置参数,根据需要来设置,主要是关于程序图标、分辨率、渲染等设置,大家可以自己试试(有些参数只有pro版才能设置)。

下面我们来看看build settings对话框,左侧是可发布的平台(Unity跨平台性很强大,4.0已支持发布至10种平台:IOS、Andriod、Windows、Mac、Linux、Webplayer、Flash、PS3、Xbox360、Wii u),右侧是对应平台的发布设置,一般初学的话,只要会发布单机版的和webplayer的就差不多了,这两个的话,右侧的发布选项按照默认的设置就可以,当然单机版要在Target Platform中选择对应的操作系统,webplayer的话这里我给大家介绍前两个参数,Streamed顾名思义就是在网络上下载的时候以流的形式,Offline Deployment,这个是可以在离线(断网)状态下本地运行你的webplayer程序(这里需要注意的是,默认情况下你每次打开webplayer程序的时候,浏览器都会自动去访问官网更新webplayer插件,如果你没勾选这个选项而又在没有联网的状态下运行webplayer的话是无法运行的)

学习平台:

提供些学习平台

http://unity3d.com/官网、http://china.unity3d.com/中文官网

http://unity3d.9ria.com/天地会Unity频道

http://bbs.9ria.com/forum-73-1.html天地会Unity3D版

http://game.ceeger.com/forum/index.php 圣典

—–

学习参考:http://bbs.9ria.com/thread-162941-1-1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: