Unity3D学习笔记

本文详细介绍了Unity3D的学习笔记,包括3D场景与操作、3D物体的操作、网格与材质、动画系统、物体运动控制、天空盒、物理系统、碰撞检测和关节。文中还提供了多个实践练习,帮助读者深入理解和掌握Unity3D的各个关键概念和技术。
摘要由CSDN通过智能技术生成

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)来表示。曲线上的点表示所对应参数对应时间的值。

学习Unity3D时,以下是一些重要的笔记: 1. Unity3D基础知识: - 游戏对象(Game Objects)和组件(Components):了解游戏对象的层次结构和组件的作用。 - 场景(Scenes)和摄像机(Cameras):学会如何创建场景并设置摄像机视角。 - 材质(Materials)和纹理(Textures):掌握如何创建和应用材质和纹理。 - 动画(Animations):学习如何创建和控制游戏对象的动画。 2. 脚本编程: - C#语言基础:了解C#语言的基本语法和面向对象编程概念。 - Unity脚本编写:学习如何编写脚本来控制游戏对象的行为和交互。 - 常见组件和功能:掌握常见的Unity组件和功能,如碰撞器(Colliders)、刚体(Rigidbodies)、触发器(Triggers)等。 3. 游戏开发流程: - 设计游戏关卡:了解如何设计游戏场景和关卡,包括布局、道具、敌人等。 - 游戏逻辑实现:将游戏规则和玩家交互转化为代码实现。 - UI界面设计:学习如何设计游戏中的用户界面,包括菜单、计分板等。 - 游戏优化和调试:优化游戏性能,解决常见的错误和问题。 4. 学习资源: - Unity官方文档和教程:官方提供了大量的文档和教程,逐步引导你学习Unity3D。 - 在线教程和视频教程:网上有很多免费和付费的Unity教程和视频教程,可根据自己的需求选择学习。 - 社区论坛和博客:加入Unity开发者社区,与其他开发者交流并获取帮助。 通过系统地学习这些内容,你将能够掌握Unity3D的基础知识并开始开发自己的游戏项目。记得不断实践和尝试,不断提升自己的技能!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值