目录
Unity3D学习笔记
3D的场景与操作
3D场景与2D场景:
3D场景中多了以下元素:
视图导航器Gizmo,网格,天空盒,光照,Z轴。均可以通过场景的顶部栏进行调整
快捷键:
Alt+左键:更改视位和角度;
右键:更改角度;
鼠标中键:更改视位;
方向键:视位前后左右移动;
滚轮:视位前后移动;
Alt+右键:视位前后移动;
Q键:切换成移动视位模式;
方向:
X轴正向:东方;
Y轴正向:上方;
Z轴正向:北方;
快捷定位游戏对象:
层级栏中选中游戏对象,然后鼠标移到场景栏按下F,即可将视角定位到指定游戏对象。
摄像机:
摄像机在层级栏中作为一个游戏对象存在,负责拍摄游戏最终画面,我们在左下角Game栏看到的画面就是主摄像机拍摄的画面。
做个比喻的话,场景栏是导演看到的,游戏栏是摄影师看到的。
选中摄像机,GameObject->AlignWithView,强制摄像机位置和视角移动到当前场景栏位置与视角。
摄像机属性中的Projection选项能控制摄像机显示方式,是透视模式还是正交模式,正交模式是2D情况下的默认镜头。
全局光照GlobalIllumination
观察场景中的游戏物体,创建的时候是纯白的,但是经由光照的影响,它会变成其他颜色。
Window->Rendering->LightingSetting可以生成当前场景的光照表单,点击GenerateLighting生成该场景的光照文件,在Scenes文件夹下作为SimpleScene的同名文件夹被存储。回到LightingSetting,InviromentLighting中拖动IntensityMultiplie(光照强度因数)来改变光照强度。InviromentReflection中拖动IntensityMultiplie(光照反射强度因数)来改变光照反射的强度。
3D物体的操作
原生3D物体
指Unity系统自带的一些简单3D建模(PrimitiveObject),白模,可用于简单的3D测试,它们的大小都与Unit单位长度有关。
四个基本物体:用途:度量和占位(模型未出而逻辑先行)
和两个水平和竖直的平面(由于另一面不需要被玩家看到,故不需要渲染)。
物体的操作
Q:移动视位 W:移动物体 E:旋转物体 R:缩放物体
多选物体情况下的操作
当一次多选了几个3D物体,移动,旋转和缩放操作便需要区分轴心(Pivot)和中心(Center)了,Pivot情况下,每个被选中的物体根据自己的轴心位置进行移动,旋转,缩放;Center情况下,所有被选中的物体根据它们共同的几何中心进行整体旋转。
增量移动操作
最简单的移动方式是计算两物体间距并手动赋值。增量移动操作可以确保手动拖拽的误差,按住Ctrl并拖动即可。
Edit->GridAndSnapSettings->IncrementSnap设定步长,可以让物体每次移动固定步长,保证两物体能严丝合缝而不缺漏或多余。
顶点对齐
顶点(Vertex)属于建模术语,不是指代一个四边形就有四个顶点,将场景栏的渲染模式切换成ShadedWireframe,可以查看模型的所有顶点
我们选中一个立方体,按住V可以按照顶点拖动它的整体,Unity不是建模软件,不要想着拖动顶点来改变物体形状。
点面重叠,这样也能保证两个物体严丝合缝。
网格与材质
网格
网格(mesh)用于定义一个物体的形状,网格是怎么定义一个物体的形状的:
1,所有物体都有自己的表面;
2,将表面分割为若干个三面体,成为一个面;
3,记录每个面的顶点(Vertex)和法线(Normal)等数据;
4,运行游戏时,由GPU渲染每个面的数据,显示为物体;
材质
材质(Material)用于规定一个物体的表面如何渲染,包括颜色,纹理,受光影响,突起/凹陷特征,一个好的材质可以让物体看起来不违和。在Assets文件夹下新建Materials文件夹,用于存放材质文件,新建材质文件(Material),这里面的参数用于调整这个材质的表现形式,例如Albedo(反照率)可以调整物体表面的颜色。给游戏对象的MeshRenderer组件赋值为新建的材质文件。
贴图
几种重要的贴图:
1,反照率贴图(Albedo):用于表现物体的表面颜色。
2,金属度贴图(Metallic):用于表现物体的哪些部位更有金属光泽。
3,法线贴图(NormalMap):用于表现物体表面的凹凸细节。
4,镜面贴图(Specular):用于表现镜面反射。
通过给Albedo赋予贴图(Texture)的方式定义物体表面显示的图片,这个图片应该是美术人员设计好的:
组件栏中的MeshFilter用于从模型文件中读取Mesh数据,绘制出物体的网格数据,得到形状。
而MeshRenderer用于将物体的形状显示出来,贴上表面材质,所以需要为它指定一个材质文件。
没有MeshRenderer的物体就没有实体,两组件缺一不可。
而且美术人员配套给出Model+Material+Texture。
我们可以发现任何一个材质的预览都是以球的形式出现的,这是因为物体的光照运算这一属性也被包含到了材质文件当中,使用球来做材质预览可以清楚的看到光对该物体每个面的影响,各种光照条件下的颜色表示(材质球)。
法线贴图用于定义一个物体的凹凸度:
贴图可以由美术人员绘制,而法线贴图是建模软件通过美术人员的雕刻自动生成的。
无法线贴图的铁块:
有法线贴图的铁块:
还可以通过调整它的金属度和光滑度来进行设置。
着色器
着色器是一种程序,一种算法,它渲染了画面上每一个物体的最终显示效果,通过材质给出的各种贴图,各种参数,加上环境光照的影响最终计算出一个物体的显示效果。如图,蓝色框选部分比较亮,而红色框选部分比较暗,这是因为着色器综合光照的强度,角度,颜色,以及物体的反照率贴图,法线贴图,金属度,光滑度从而计算出了物体表面的不同部位的不同颜色。当物体表面与光线方向垂直时,采光率最高;当物体表面与光线方向平行时,采光率最低。编写着色器语言可以达到不一样的美术效果。
除此以外,着色器还用于表示材质与顶点的对应关系,当我们将一个材质赋予一个物体的时候,着色器会根据模型的顶点参数,生成材质的显示办法。如图,正方体的面数明显小于球体的面数,但却需要6张材质来着色,而球体只用了1张。并且着色器还计算出球体的哪个面显示材质的哪一部分。
每个材质文件都会综合一个着色器算法,初始都是标准着色算法(Standard),除此以外还有其他着色算法可供选择,或者自己写一个。
模型与资源
资源的导入
我们可以将Unity项目中的各种资源打包,也可以将外部资源导入,资源的格式:*.unitypackage。
导入方式:将要导入的资源文件拖到Assets文件夹下完成导入,或右键项目栏,点击ImportPackage进行导入。
导出方式:右键项目栏,点击ExportPackage进行导出。
导出资源的标准:
Meshes/Models 模型;
Textures 贴图;
Materials 材质;
Prefabs 预制体;
Scenes 样例;
外部模型
Unity支持的模型文件:
3dsMax (*.max *.3ds)
Maya (*.ma)
Blender (*.blend)
Wavefront (*.obj)
模型被导入时转换形式变成FBX (*.fbx) 文件,是Unity的标准格式**(仅限Mesh网格;材质和贴图额外生成)**。
材质的标准保存格式:Material(*.mat)
各种贴图的标准保存格式:(*.tga)
贴图->材质->模型->3D对象
如果外部模型资源包含了预制体,则直接拖过来使用便可,如果不包含,则可以自己通过上述步骤拼接模型。
多个模型拼接而成的一个大模型被称为组合模型。
物体的运动
类似于2D中学过的,3D物体的运动也是需要脚本来控制的,方法基本相同
transform.Translate(x,y,z)让物体移动固定长度的方法3D中同样适用。
物体朝向的更改
3D情况下要想让一个物体朝向另一个,显然比2D中复杂,定义了两个对象Ammo和Target:
Transform target = transform.Find("/Target").transform;
Vector3 face = transform.forward;
Vector3 direction = (target.position - transform.position).normalized;
float angleX = Vector3.SignedAngle(face, direction, Vector3.right);
float angleY = Vector3.SignedAngle(face, direction, Vector3.up);
transform.Rotate(angleX, angleY, 0);
由于这个过程比较复杂,Unity有LookAt API来使用:
Transform target = transform.Find("/Target").transform;
transform.LookAt(target);
值得注意的是,LookAt指定朝向的默认方向是z轴。也就是说,使用LookAt的话物体的z轴朝向会正对目标。所以当物体的正面不是z轴正向的话,LookAt就不起作用。
默认情况下,三个轴的对应关系:
X轴:红轴:右right
Y轴:绿轴:上up
Z轴:蓝轴:前forward
原则上来说,模型应该在建模软件中被调整好后再导入Unity,被导入的模型应该有以下标准:
(Axis)模型默认朝向Z轴方向;
(Pivot)模型的轴心应该位于模型底部的中心(方便定位);
(Size)尺寸不应当再进行改变,模型大小应当基于真实比例大小(1Unit = 1meter)
练习:设计一枚追踪导弹
思路:目标自动向一个方向移动,子弹永远朝向目标,匀速移动
//目标
//Update内
float step = 2f * Time.deltaTime;
transform.Translate(0, 0, step);
//导弹
//Update内
Transform target = transform.Find("/Plane").transform;
transform.LookAt(target);
float step = 2.4f * Time.deltaTime;
transform.Translate(0, 0, step);
天空盒
我们在游戏栏和场景栏中看到的游戏背景是一种叫天空盒的材质,它的Shader方式为Skybox/6Sided。这个着色器下的材质需要六张正方形贴图来规定天空盒的六个面:Up,Down,Left,Right,Front,Rear。这6张图片尽量大,2048x2048 或 4096x4096都可。整个游戏都是在天空盒内部进行的。
在Window/Rendering/LightingSettings中可以将天空盒的材质拖入。
天空盒的手动创建
首先将六张贴图准备好,必须让六张图可以无缝衔接。将六张贴图的WrapMode改为Clamp(紧凑模式),新建天空盒材质并选择6Sided着色器模式。将图片拖入即可使用。除了六面型天空盒,还有其他种类的天空盒。
动画
一个物体的运动有两种实现方式,一个是代码,另一个就是动画(Animation),在Assets文件夹创建Anim文件夹存储动画文件,创建动画(Animation)。
将Inspector窗口改为**Debug(深度开发)模式,给Animation勾选Legacy,这个模式用于播放单一的动画文件。另外一种状态机动画(Animator)**适合播放复杂动画,例如人物移动,跑跳等。
将动画文件拖给游戏对象就可以实现挂载,游戏对象就可以根据动画的指示做出反应。
WrapMode中规定了动画的几个播放模式:Once,Loop,PingPong;
动画编辑
在Window/Animation中找到动画编辑器菜单,把它拖到方便的地方,选中要用编辑器操作的游戏对象,点击AddProperty,加入position,可以通过添加关键帧的方式,从时间角度控制物体的运动。
左边框信息视图,右边时间视图,使用滚轮缩放,鼠标中键拖动。
加入position,进入录制模式/编辑模式(红色圆圈),一切修改都必须在录制模式下才能自动保存。创建两个关键帧,修改当前的position信息,两个关键帧拥有不同的位置信息则动画建立完成,可以预览,退出录制模式,动画保存成功。
关键帧:在某一帧时游戏对象的状态,行为规定好后,动画在关键帧间的行动都会由插值算法自动计算,可以极大节省工作量。关键帧由菱形方块表示。
插值算法:给定两个时间点的两个值,通过不停计算两个值中间的值,得到平滑的位置曲线的算法。
动画曲线
使用Animation制作的移动动画不是匀速的,它有一个加速减速的过程,这个过程由动画曲线(Curves)来表示。曲线上的点表示所对应参数对应时间的值。