这篇文章作为B站史上最全Unity3D教程自学笔记,此篇笔记内容摘自up视频中ppt,致敬up,如有侵权行为,请联系删除,谢谢!
Unity知识点学习笔记
- 一、unity基础知识
-
- I. 主要面板及作用
- II. 常用快建键
- I. Scene场景
- II. GameObject游戏对象
- III. Component组件
-
- i. Transform
- ii. Mesh Filter网格过滤器
- iii. Mesh Renderer网格渲染器
- IV. Material材质
-
- V. Camera摄像机
-
- VI. SkyBox天空盒
- VII. InstantOC
-
- i. 渲染管线
- ii. Occlusion Culling即时遮挡剔除
- iii. LOD多细节层次
- VIII. 光照系统
-
- i. Global Illumination全局光照
- ii. 实时GI
- iii. 烘焙GI
- iv. General GI
- v. 光源侦测 Light Probes
- IX. 声音
- X. Prefab 预制件
- XI. Animation 动画
-
- i. Animation View 动画视图
- ii. 创建动画片段
- iii. 时间线
- iv. 录制动画片段
- v. 常用API函数
- 二、脚本
-
- I. 脚本生命周期
-
- i. 初始阶段
- ii. 物理阶段
- iii. 游戏逻辑
- iv. 输入事件
- v. 场景渲染
- vi. 结束阶段
- II. 调试
-
一、unity基础知识
I. 主要面板及作用
面板 |
作用 |
Scene |
游戏制作过程中看到的游戏场景 |
Game |
玩家视角看到的游戏过程场景 |
Hierarchy |
游戏制作过程场景中的资源列表 |
Project |
当前项目游戏制作者拥有的资源 |
Inspector |
显示当前物体的基本配置和挂件信息 |
工具栏下方有多种功能选择,分别对应场景移动、物体移动、物体旋转、物体缩放、矩形缩放、多功能、添加的编辑工具、轴心位置、坐标模式切换、播放、暂停、逐帧播放
II. 常用快建键
- 按下鼠标滚轮拖动场景,滑动滚轮缩放场景。
- 鼠标右键可旋转场景,点击后可通过左键移动场景。
- 按下右键同时按下W/S/A/D/Q/E键可实现场景漫游。
- 在Scene面板选中物体后按F键,或在Hierarchy面板双击
物体,可将物体设置为场景视图的中心。
- 按住alt键同时通过鼠标左键围绕某物体旋转场景,鼠标右
键缩放场景。
- Ctrl+D:复制所选物体。
- 按下v键,鼠标选中物体移动到目标物体让两个物体贴合在一起。
- 按下Ctrl,鼠标选中物体移动,每次移动固定距离。
- 选中某个物体,按下Ctrl+Shift+F将物体设定到当前视角位置
I. Scene场景
一组相关联的游戏对象的集合,通常游戏中每个关卡就是一个场景,用于展现当前关卡中的所有物体。
II. GameObject游戏对象
运行时出现在场景中的游戏物体,例如∶人物、地形、树木…,是一种容器,可以挂载组件。在Hierarchy面板中,将一个物体拖拽到另外一个物体中构成父、子物体关系,子物体将继承父物体的移动,旋转和缩放属性,但子物体不影响父物体。
III. Component组件
是游戏对象的功能模块,每个组件都是一个类的实例。
i. Transform
Transform的英文释义为转换,可以理解为在unity中每一个Object都是由实物物体和虚拟形态组成,每一个Object的移动、旋转等都是通过Transform的改变来实现的,而实物物体的作用就是让玩家能够通过视觉的直观感受看到Object所作出的一系列动作。
Transform含有三个参数Position、Rotation、Scale分别代表Object所在位置的坐标、旋转角度和缩放大小,每个参数都是用三维坐标控制。
Position:xyz坐标是根据Object所在的根场景所确定的,比如一个Object以整个世界为根场景,那么Position对应的就是Object所在的世界坐标,而如果以一个房子为根场景,那Position就是Object对应这个房子所在的坐标位置
Rotation:改变xyz的大小对应以xyz为旋转轴产生相应的旋转角度
Scale:改变xyz的值修改对应xyz方向的缩放大小
ii. Mesh Filter网格过滤器
用于从资源中获取网格信息,决定物体形状
iii. Mesh Renderer网格渲染器
从网格过滤器中获得几何形状,再根据变化组件定义的位置进行渲染,改变物体外观。
网格过滤器与网格渲染器联合使用,使模型显示到屏幕上。
IV. Material材质
物体的质地,指色彩、纹理、光滑度、透明度、反射率、折射率、发光度等。实际就是Shader的实例。
- Shader着色器:专门用来渲染3D图形的技术,可以使纹理以某种方式展现。实际就是一段嵌入到渲染管线中的程序,可以控制GPU运算图像效果的算法。
- Texture 纹理:附加到物体表面的贴图
给材质添加纹理:将纹理拖拽到材质的Albedo前的方框中。
给物体添加材质:将材质拖拽到Mesh Renderer组件的Material-Element中。
- 渲染模式
– Opaque不透明,默认选项。
– Transparent 透明,用于半透明和全透明物体,如玻璃。
–Cutout镂空,用于完全透明或完全不透明物体,如栅栏。
– Fade渐变,用于需要淡入淡出的物体。
- Main Maps
Albedo基础贴图:决定物体表面纹理与颜色。
Metallic金属:使用金属特性模拟外观。
Specular 镜面反射:使用镜面特性模拟外观。
Smoothness光滑度︰设置物体表面光滑程度
Normal Map 法线贴图:描述物体表面凹凸程度。
Emission自发光:控制物体表面自发光颜色和贴图。
– None不影响环境
– Realtime实时动态改变
– Backed 烘焙生效
Tiling平铺:沿着不同的轴,纹理平铺个数。
Offset偏移∶滑动纹理。
i. 玻璃的制作
新建一个正方体调整大小,新建材质,将材质的Rendering Mode改为Tansparent,然后点击Albedo后的颜色选择,调节A(alpha)的大小,值越小越透明。
ii. 渐变效果
将Randering Mode改为Fade,操作同玻璃的制作。
V. Camera摄像机
附加了摄像机camera组件的游戏对象,向玩家捕获和显示世界的设备,场景中摄像机的数量不受限制
- 自带组件
Transform变换组件
Camera 摄像机∶向玩家捕获和显示世界
Flare Layer耀斑层:激活可显示光源耀斑
GUI Layer:激活可渲染二维GUI元素
Audio Listener音频监听器:接收场景输入的音频源AudioSource并通过计算机的扬声器播放声音。
- 属性
Clear Flags清除标识︰决定屏幕的空白部分如何处理
Skybox天空盒:空白部分显示天空盒图案
Solid Color纯色:空白部分显示背景颜色
Depth Only仅深度:画中画效果时,小画面摄像机选择该项可清除屏幕空部分信息只保留物体颜色信息。
Don’t Clear不清除:不清除任何颜色或深度缓存。
Background 背景:所有元素绘制后,没有天空盒的情况下,剩余屏幕的颜色。
Culling Mask选择遮蔽层:选择要照射的层Layer 。
Projection投射方式:
Perspective透视:透视图,物体具有近大远小效果。
Orthographic正交:摄像机会均匀地渲染物体,没有透视感,通常小地图使用。
Size大小(正交模式)∶摄影机视口的大小
Field of view视野(透视模式)∶设置相机视野的远近距离
Field of view裁剪面︰相机到开始和结束渲染的距离
Near近:绘制的最近点。
Far远:绘制的最远点。
Viewport Rect 视口矩形∶标明这台相机视图将会在屏幕上绘制的屏幕坐标。
X:摄像机视图的开始水平位置。
Y:摄像机视图的开始垂直位置。
W宽度:摄像机输出在屏幕上的宽度。
H高度:摄像机输出在屏幕上的高度。
Depth深度:相机在渲染顺序上的位置。具有较低深度的摄像机将在较高深度的摄像机之前渲染。
i. 小地图的制作
方法一:
在Project面板中添加一个摄像机,命名为MapCamera,移除MapCamera的Audio Listener组件,并调整摄像机位置及旋转角度,使得摄像机可以观察到整个地图(如果要制作跟随主角移动的小地图,可以将摄像机设置为主角的子物体)。
将MainCamera->Camera->Depth数值设置为0,将MapCamera的Depth设置为1,此时通过观察Game面板观察,通过改变MapCamera->ViewPort Reset->X、Y、W、H的值来调节MapCamera的显示大小和位置。
一般小地图都是2D显示,所以将Projection修改为Orthographic,然后将Size大小调节到合适的值,但是当场景的形状不是规则时,就会多出一些除场景外的空白区域,这时选中MapCamera,将Clear Flags改为Depth only,这样空白区域就消失了。
接着需要给玩家和怪物添加标识,让他们在地图上以一个小圆点或者三角形显示。新建一个Plane,命名为Mark,将其作为玩家的子物体,把它放置在人物的头顶,调节到合适的大小,然后可以从网上下载圆形或者三角形的透明图片,将其拖拽到Project面板中,接着新建一个Material,将图片拖拽到材质的Albedo前的方框中,并把Rendering Mode改为Cutout,将材质拖拽到Mark->Mesh Renderer->material->Element中,这样地图的人物标识就做完了。
但是在MainCamera中也看的到Mark,所以需要将Mark设置为仅MapCamera可见,这时就需要用到Layer,选中Mark,点击Layer右侧,点击最下方Add Layer,添加一个MapMark,然后再次选中Mark,再次点击Layer右侧,勾选新添加的MapMark,接着选中MainCamera,将Camera->Culling Mask的MapMark取消勾选,而在MapCamera中则需要勾选MapMark,这样Mark就只在MapCamera中显示了,至此小地图的制作完成。
但是在实际的游戏制作当中,如果使用这种方法,存在两个摄像机对同一个场景进行拍摄,这样就会使得渲染工作加倍,所以优化的做法是在场景下方放置一个Plane,然后将从场景正上方拍摄到的情况做成一场图片,然后给到这个Plane,同样使用Layer,使得MapCamera只可以看见场景的图片和Mark,这就解决了存在两个摄像机需要重复渲染的问题。
VI. SkyBox天空盒
围绕整个场景的包装器,用于模拟天空的材质,天空盒材质种类:6 Sided,Procedural,Cubemap。
-
使用天空盒
设置摄像机 Clear Flags属性为Skybox。
方式一:摄像机添加组件Skybox
skybor
custom Skybox
None (Material)
方法二∶光照窗口
Window - Lighting -Environment Lighting – Skybox
可作为反射源将天空色彩反射到场景中物体。
-
6 Sided属性
Tint Color色彩
Exposure亮度
Rotation旋转
-
Procedural属性
Sun太阳模式
– None没有.
– Simple简单
– Hight Quality高质量
Atmoshpere Thickness大气层厚度
Ground地面颜色
如果为Environment Lighting的Sun属性设置一个平行光,场景中会根据平行光角度自动创建太阳,并且位置随平行光旋转而改变。如果不设置,系统将默认选择场景中最亮的平行光。
VII. InstantOC
i. 渲染管线
- 顶点处理:接收模型顶点数据,坐标系转换。
- 图元装配组装面:连接相邻的顶点,绘制为三角面。
- 光栅化:计算三角面上的像素,并为后面着色阶段提供合理的插值
- 参数。
像素处理:对每个像素区域进行着色,写入到缓存中。
- 缓存:一个存储像素数据的丙存块,最重要的缓存是帧缓存与深度缓存。
帧缓存:存储每个像素的色彩,即渲染后的图像。帧缓存常常在显存中,显卡不断读取并输出到屏幕中。
深度缓存z-buffer:存储像素的深度信息,即物体到摄像机的距离。光栅化时便计算各像素的深度值,如果新的深度值比现有值更近,则像素颜色被写到帧缓存,并替换深度缓存。
ii. Occlusion Culling即时遮挡剔除
即时遮挡剔除Instant Occlusion Culling
遮挡剔除:当物体被送进渲染流水线之前,将摄像机视角内看不到的物体进行剔除,从而减少了每帧渲染数据量,提高渲染性能。
- 步骤
1.创建层
2.为游戏物体指定层(将参与遮挡剔除)与标签(将自动附加
IOClod脚本)
3.物体添加碰撞器Collider组件
4.摄像机附加脚本IOCcam
- 属性
Layer mask :参与遮挡剔除的游戏对象层。
IOC Tag :将为指定标签的游戏对象自动添加IOClod脚本对象。
Samples :每帧摄像机发射的射线数目。数量多剔除效果好,但性能开销大。通常在150- 500之间。
Rays FOV :射线视野,应大于摄像机视野Field of View。
View Distance :视图距离,射线长度。将影响摄像机Clipping Planes -Far数值。
Hide Delay :延迟隐藏,当物体被剔除时延迟的帧数,建议50- 100之间。
PreCull Check :检查采集信息,建议勾选,可以提高剔除效率。
Realtime Shadows :实时阴影,如果场景需要实时阴影,建议启用,确保剔除物体显示正常的阴影。
iii. LOD多细节层次
多细节层次Levels of Detail
LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
- 步骤
1.创建层
2.创建空物体并将模型添加到其中,命名为: Lod 0
Lod1Lod2
3.为父物体指定层与标签
4.父物体或子物体添加碰撞器组件
5.摄像机附加脚本IOCcam
- 属性
Lod 1 distance :摄像机到物体距离小于当前距离时,使
用Lod_ 0模型。
Lod 2 distance :摄像机到物体距离大于Lod1且小于当前
距离时,使用Lod_ 1模型,大于当前值使用Lod 2模型。
Lod Margin : LOD边缘,如果物体在LOD各阶段过渡时发
生闪烁,尝试提高当前值。
VIII. 光照系统
i. Global Illumination全局光照
简称GI ,即全局光照。能够计算直接光、间接光、环境光以及反射光的光照系统。通过G算法可以使渲染出来的光照效果更为真实丰富。
- 属性
Range范围:光从物体的中心发射的范围。仅适用于点光源和聚光灯。
Spot Angle聚光角度:灯光的聚光角度。只适用于聚光灯。
Color颜色:光线的颜色。
Intensity强度:光线的明亮程度。
Culling Mask选择遮蔽层:选择要照射的层L ayer.
Shadow Type阴影类型: Hard 硬阴影、Soft 软阴影
Strength硬度:阴影的黑暗程度。
Resolution分辨率:设置阴影的细节程度。
Bias偏移: 物体与阴影的偏移。
通过Mesh Renderer组件启用禁用阴影
Cast / Receive Shadows当前物体是否投射/接收阴影。
Off不投射阴影, On投射阴影,Two Sided双面阴影,Shadows Only隐藏物体只投射阴影
阴影剔除:设置显示阴影的距离
Edit- > Project Settings-> Quality- > Shadows Disdance
- 直接光照
从光源直接发出的光,通过Light组件实现。
Type类型:灯光对象的当前类型
Directional Light平行光:平行发射光线,可以照射场景里所有物体,用于模拟太阳。
Point Light点光源:在灯光位置上向四周发射光线,可以照射其范围内的所有对象,用于模拟灯泡。
Spot Light聚光灯:在灯光位置上向圆锥区域内发射光线,只有在这个区域内的物体才会受到光线照射,用于模拟探照灯。
Area Light区域光:由一个面向一个方向发射光线,只照射该区域内物体,仅烘焙时有效,用在光线较为集中的区域。
- 环境光照
作用于场景内所有物体的光照,通过Environment Lighting中Ambient控制。
Ambient Source环境光源
Skybox通过天空盒颜色设置环境光照
Gradient梯度颜色
Sky天空颜色、Equator 地平线颜色、Ground 地面颜色
Ambient Color纯色
Ambient Intensity环境光强度
Ambient GI环境光GI模式
Realtime实时更新,环境光源会改变选择此项。
Backed烘焙,环境光源不会改变选择此项。
- 反射光照
根据天空盒或立方体贴图计算的作用于所有物体的反射效果,通过Environment Lighting中Reflection 控制。
Reflection Source反射源
Skybox天空盒
Resolution分辨率Compression 是否压缩
Custom自定义
Cubemap立方体贴图
Reflection Intensity 反射强度
Reflection Bounces使用Reflection Probe后允许不同游
戏对象间来回反弹的次数。
- 间接光照
物体表面在接受光照后反射出来的光。
通过Light组件中Bounce Intensity反弹强度控制。
可以通过Scene面板Irradiance模式查看间接光照。
注意:
只有标记 Lightmaping Static的物体才能产生间接反弹光照。
ii. 实时GI
Realtime GI
所谓"实时"是指在运行期间任意修改光源,而所有的变化可以立即更新。正是由于Unity 5引入了行业领先的实时全局光照技术,Enlighten系统,才可以在运行时产生间接光照,使场景更为真实丰富。
- 操作步骤:
1.游戏对象设置为Lightmaping Static
2.启用Lighting 面板的Precomputed Realtime GI
3.点击Build按钮(如果勾选Auto编辑器会自动检测场景的改动修复光照效果)
- Precomputed Realtime GI
Realtime Resolution :实时计算分辨率。
CPU Usage : CPU利用率,值越大实时渲染效率越高。
iii. 烘焙GI
烘焙Lightmap
当场景包含大量物体时,实时光照和阴影对游戏性能有很大影响。使用烘焙技术,可以将光线效果预渲染成贴图再作用到物体上模拟光影,从而提高性能。适用于在性能较
低的设备上运行的程序。
- Baked GI
Baked Resolution :烘焙光照贴图分辨率,建议比实时GI分辨率高10倍。
Baked Padding :光照贴图中各形状间距,取值2到200。
Compressed :是否压缩光照贴图,压缩则提高性能,缩小容量,但画质会降低。
iv. General GI
常规GI设置,同时适用于实时GI与烘焙GI。
- Directional Mode定向模式:
Non - Directional无定向模式,使用1种光照贴图存储光照信息。
Directional定向模式,使用2种光照贴图存储光照信息,相比之下效果更好,但空间占用更大。
Direction Specular定向反射模式,使用4种光照贴图存储光照信息,效果最好,但占用空间最大。
- 除无定向模式外必须运行在GL ES2.0与SM2.0以上的设备。GLES指OpenGL ES针对移动端,从iPhone5s开始支持;SM指Shader Model针对PC端,目前大部分显卡支持。
Indirect Intensity最终间接光照、反射光照的强度。1为默认强度,小于1则减低强度,大于1则增大强度。
Bounce Boost增强间接光照。
Default Parameters高级GI参数。
Default默认
Default - HighResolution高分辨率
Default - LowResolution低分辨率
Default - VeryL owResolution非常低的分辨率
v. 光源侦测 Light Probes
由于LightMapping只能作用于static物体,所以导致运动的物体与场景中的光线无法融合在一起,显得非常不真实。而Light Probes组件可以通过Probe收集光影信息,然后对运动物体邻近的几个Probe进行插值运算,最后将光照作用到物体上。
- 步骤
1.创建游戏对象Light Probe Group.,
2.添加侦测小球Add Probe.
3.点击Build按钮。( 如果勾选Auto编辑器会自动检测
场景的改动修复光照效果)
4.勾选需要侦测物体的MeshRenderer组件的Use Light
Probes属性。
IX. 声音
- Unity支持的音频文件格式:mp3,ogg,wav,aif,mod,it,s3m,xm。
- 声音分为2D、3D两类
3D声音:有空间感,近大远小。
2D声音:适合背景音乐。
- 在场景中产生声音, 主要依靠两个重要组件:
Audio Listener音频监听器:接收场景中音频源AudioSource发出的声音,通过计算机的扬声器播放声音。
Audio Source音频源
- Audio Source音频源:
Audio Clip音频剪辑:需要播放的音频资源。
Mute静音:如果启用,播放音频没有声音。
Play On Awake唤醒播放:勾选后场景启动时自动播放。
Loop循环:循环播放音频。
Volume音量:音量大小
Pitch音调:通过改变音调值调节音频播放速度。1是正常播放。
Stereo Pan : 2D声音设置左右声道。
Spatial Blend : 2D与3D声音切换。
- 3D Sound Settings
3D声音设置
Volume Rolloff音量衰减方式
Min Distance开始衰减距离
Max Distance结束衰减距离
X. Prefab 预制件
- 一种资源类型,可以多次在场景进行实例。
- 优点:对预制件的修改,可以同步到所有实例,从而提高开发效率。如果单独修改实例的属性值,则该值不再随预制件变化。
- Select键:通过预制件实例选择对应预制件。
- Revert键:放弃实例属性值,还原预制件属性值。
- Apply键:将某实例的修改应用到所有实例。
XI. Animation 动画
i. Animation View 动画视图
- 通过动画视图可以直接创建和修改动画片段(AnimationClips)。
- 显示动画视图: Window- Animation。
ii. 创建动画片段
- 为物体添加Animation组件。
- 在动画视图中创建片段。
iii. 时间线
- 可以单击时间线上的任何位置预览或修改动画片段。
- 数字显示为秒数和帧数。
例如:1:30表示1秒和30帧
- 使用按钮跳到上一个或下一个关键帧,也可以键入特定数直接跳到该帧。
iv. 录制动画片段
- 点击录制按钮,开始录制动画。
- 添加关键帧Add Property,选择组件类型。
- 选择关键帧,调整时间点。
- 在Scene或Inspector面板设置属性。
- 点击录制按钮,结束录制动画。任何组件以及材质的属性都可进行动画处理,即使是自定义脚本组件的公共变量。
v. 常用API函数
- bool isPlay= animation.isPlaying;
- bool isPlay= animation.IsPlaying(动画名");
- animation.Play(“动画名”);
- animation.PlayQueued(动画名);
- animation.CrossFade (“动画名”);
- animation[“动画名”].speed = 5;
- animation[“动画名”].wrapMode= WrapMode PingPong;
- animation[“动画名”.length;
- animation[“动画名”].time;
二、脚本
修改新建脚本初始化模板:
Unity\Editor\Data\Resources\ScriptTemplates,用Visual Studio 打开进行修改后保存。
在Unity中通过菜单设置修改默认的脚本编辑器:
Edit-Preferences-External Tools-External Script Editor
I. 脚本生命周期
Unity脚本从唤醒到销毁的过程。
消息:当满足某种条件Unity引擎自动调用的函数。
必然事件:http://docs.unity3d.com/Manual/ExecutionOrder.html
i. 初始阶段
Awake唤醒:当物体载入时立即调用1次;常用于在游戏开始前进行初始化,可以判断当满足某种条件执行此脚本this, enable=true。
OnEnable当可用:每当脚本对象启用时调用。
Start开始:物体载入且脚本对象启用时被调用1次。常用于数据或游戏逻辑初始化,执行时机晚于Awake.
ii. 物理阶段
FixedUpdate固定更新:脚本启用后,固定时间被调用,适用于对游戏对象做物理操作,例如移动等。
设置更新频率: “Edit” --> “Project Setting” - “Time” -->"Fixed Timestep"值,默认为0.02s。
OnCollisionXXX碰撞:当满足碰撞条件时调用。
OnTriggerXXX触发:当满足触发条件时调用。
iii. 游戏逻辑
Update更新:脚本启用后,每次渲染场景时调用,频率与设备性能及渲
染量有关。
LateUpdate延迟更新:在Update函数被调用后执行,适用于跟随逻辑。
iv. 输入事件
OnMouseEnter鼠标移入:鼠标移入到当前Collider时调用。
OnMouseOver鼠标经过:鼠标经过当前Collider时调用。
OnMouseExit鼠标离开:鼠标离开当前Collider时调用。
OnMouseDown鼠标按下:鼠标按下当前Collider时调用。
OnMouseUp鼠标抬起:鼠标在当前Collider上抬起时调用。
v. 场景渲染
OnBecameVisible 当可见:当Mesh Renderer在任何相机上可见时调用。
OnBecameInvisible 当不可见:当Mesh Renderer在任何相机上都不可见时调用。
vi. 结束阶段
OnDisable当不可用:对象变为不可用或附属游戏对象非激活状态时此函数被调用。
OnDestroy当销毁:当脚本销毁或附属的游戏对象被销毁时被调用。
OnApplicationQuit当程序结束:应用程序退出时被调用。
II. 调试
i. 使用Unity编辑器
将程序投入到实际运行中,通过开发工具进行测试,修正逻辑错误的过程。
- 控制台调试
Debug.Log(变量);
print(变量);
- 定义共有变量,程序运行后在检测面板查看数据
ii. 使用VS
准备工作:
(1)安装vs2019工具
(2)在Unity项目面板中导入: Visual Studio 2019 Tools
调试步骤:
(1)在可能出错的行添加断点
(2)启动调试
(3)在Unity中Play场景