记录一下unity考试前整理的笔记。
Chapter3 Unity编辑器
3.2 界面布局
- Scene View
场景视图:设置游戏场景以及放置游戏对象,是构造游戏场景的地方 - Game View
游戏视图:用于实时展示游戏运行的画面,处于播放模式的时候会被激活 - Hierarchy View
层级视图:展示当前场景中的所有游戏对象 - Project View
项目视图:显示整个工程项目中所有可用的资源 - Inspector View
检视视图:查看当前所选择对象的属性和相关的一些信息
3.3 工具栏
3.3.1 Transform Tools(变换工具)
- 手形工具(Q)
可以在Scene视图中按鼠标左键平移整个场景 - 移动工具(W)
在Scene视图中选择某个对象之后,在该游戏对象上出现3个方向的箭头代表物体的三维坐标,通过拖动箭头可以改变游戏对象在某一个轴上的位置。 - 旋转工具(E)
可以在Scene视图中按任意角度旋转所选中的游戏对象。 - 缩放工具(R)
可以在Scene视图中缩放选中的游戏对象,蓝色方块代表沿Z轴缩放,红色X轴,绿色Y轴。中间的灰色方块可以将对象在3个坐标轴上进行统一的缩放。 - 矩形工具(T)
是允许用户查看和编辑2D或者3D游戏对象的矩形手柄。对于2D游戏对象,可以按住shift键进行等比例缩放。 - 移动旋转缩放三合一工具(Y)
包含W、E、R这三个快捷键代表的功能的整合工具。
在Scene视图中按住alt键配合鼠标左键可以以当前轴心点来旋转编辑视角,配合鼠标右键可以缩放编辑视角(拉进或拉远)
3.3.2 Transform Gizmo Tools(变换辅助工具)
- Pivot:该游戏对象(不包括子对象)的中心。
Center:该游戏对象(包括子对象)的中心。 - Global:世界坐标
Local:对象自身的坐标
3.3.3 Play(播放控制)
- 开始播放:command/Ctrl + P
- 暂停播放:shift + command/Ctrl + P
- 逐帧播放:option/alt + command/Ctrl + P
3.3.4 Layers(分层下拉列表)
控制游戏对象在Scene中的显示。下拉菜单中为显示状态的层级的物体(有眼睛图标)被显示在Scene视图中。
3.3.5 Layout(布局下拉列表)
用于切换,删除,保存的界面布局列表。
3.4 菜单栏
- File(文件)菜单主要包括场景和工程的创建、保存、输出等功能。
- Edit(编辑)菜单主要包括对场景一些列的编辑以及编辑器的设置等功能。
Snap Setting 设置每次最小移动、缩放、旋转的单位 - Assets(资源)菜单提供游戏资源的管理功能,用于建立各种资源,导入和导出资源管理包。
- GameObject(游戏对象)菜单,用于创建游戏对象。
- Component(组件)菜单是用来添加到GameObject(游戏对象)上的一组相关属性,本质上每个组件都是一个类的实例。
- Window(窗口)菜单可以控制编辑器的页面布局,打开各种视图。
- Help(帮助)菜单包含unity相关的一些功能帮助,论坛、服务以及更新和其他的一些相关功能。
3.5 常用工作视图
3.5.1 Project
搜索过滤:t: 代表类型过滤,l: 代表标签过滤
3.5.2 Scene
按住鼠标的滚轮键,可以像使用快捷键Q一样移动场景。
-
Flythrough:按住鼠标右键配合WAS/D键切换到该模式
该模式下,以第一人称视角在Scene中飞行浏览,按住shift键可以加速移动 -
Scene Gizmo工具:快速切换摄像机视角
Top/Bottom/Back/Front
可以鼠标单击该工具中间的方块或者下方文字,切换正交模式和透视模式- Isometric Mode 正交模式:
无透视效果,物体不会随着距离的调整而缩小,主要用于等距离场景效果以及GUI和2D游戏
- Perspective Mode 透视模式:
模拟一个真实的三维空间,物体会随着距离的调整而缩放
- 锁定视角:单击Scene Gizmo右上角的小锁,可以锁定,锁定后视角无法旋转,按住鼠标右键变成手形工具平移。
-
Scene View Control Bar 场景视图控制栏
- 可以改变摄像机查看场景的方式
- 绘图模式
- 2D/3D
- Shaded模式
控制对象的绘制方法,默认为Shaded,不会改变游戏的最终实现方式(仅作用于Scene) - 灯光开关
- 切换天空球、雾效、光晕的显示与隐藏(P31)
- Gizmos:同Game视图中的Gizmos,可以单击三角符号,实现显示或隐藏场景中用到的光源、声音、摄像机等对象的图标
- 搜索栏:搜索物体的名称,会在Scene中带颜色突出显示,其他物体以灰色的方式显示,同时搜索结果也会在Hierarchy视图中显示出来
3.5.3 Game视图
显示游戏最终运行效果的预览窗口,无法编辑
Game View Control Bar:设置目标显示,分辨率,屏幕缩放等等
3.5.4 Inspector视图
展示选中游戏对象的一些信息和他带有的组件,常用的组件显示如下
- Transform
可以修改游戏对象的Position,Rotation,Scale。该组件是游戏对象的基础组件,每一个游戏对象都有这个组件。 - Mesh Filter
网格过滤器,用于从对象中获取网格信息,并将网格信息传递到网格渲染器。 - Mesh Render
网格渲染器,从网格过滤器中获得几何形状,根据游戏对象的Transform组件中定义的信息还有光照进行渲染。 - Rigidbody
刚体组件,可以使得物体能够感受力的作用,具有物理特性。 - Materials
设置游戏对象的 Shader,颜色,贴图等等
3.5.5 Hierarchy层级视图
- 为游戏对象建立Parenting关系
- 让用户对大量对象的移动和编辑操作更加精确和方便
- 任何游戏对象可以拥有多个子对象,但是只能拥有一个父对象
- 对父对象进行的操作会影响到他所有的子对象,即子对象会继承父对象的数据,但是子对象可以进行独立的编辑操作。
3.5.6 Console控制台视图
在Console控制台视图中可以双击错误信息,即可打开代码编辑器自动定位有问题的脚本代码位置。
Chapter4 游戏对象、组件和Prefabs
4.1 创建游戏对象和组件
- 菜单栏 GameObject -> 3D Object -> Cube/Sphere
- 创建完成的对象会在Hierarchy栏中显示,被称为游戏对象
- 选中Cube游戏对象,可以看到他的4个组件
- Transform
- Cube(Mesh Filter)
- Box Collider
- Mesh Render
- 给游戏对象添加组件
- 选中要添加组件的游戏对象
- 点击菜单栏中的component,弹出组件列表选中要添加的组件即可
Hierarchy -> GameObject -> Component -> Physics -> Rigidbody
4.2 常用游戏对象
重命名物体的几种方式:
- 在Hierarchy中选中物体后,再次单击
- 在Hierarchy中选中物体后,按下F2(mac按下回车键)
- 在Hierarchy中选中物体后,鼠标右键点击后选择Rename
4.2.2 Camera相机
可以在场景中拥有无数相机,可以为其设置任意顺序,在屏幕上的任何位置,或者仅仅在屏幕的某些部分进行渲染
参数列表:
-
Depth Buffer:
一个辅助的内存区域,大小与ColorBuffer相同,为图像的每个像素提供额外的深度信息,用于深度测试,对用户来说不可见。
相机会将实时计算出来深度先缓存在一个表中,保留该值代表相机会先将实时计算的Depth Buffer在第一帧时存在表中,然后下一帧再读取表中的DepthBuffer,而不是相机实时计算出来的Buffer。这样后面的相机如果也有DepthBuffer,就会覆盖前一台相机的DepthBuffer,这个参数会影响到Clipping planes。 -
ColorBuffer:
图像输出的内存区域,GPU把最后处理的颜色写入这个区域,对应输出设备的像素点,向用户展示最终的显示效果,用户可见。
相机会将实时计算出来的ColorBuffer在第一帧先存入表中,然后下一帧在读取表,这样后面的相机如果也有ColorBuffer就会覆盖掉前一个相机的ColorBuffer值。这里同DepthBuffer。 -
Clear Flags:
决定是否清除前面全部相机的ColorBuffer和DepthBuffer- Solid Color:
清空前面全部相机的DepthBuffer和ColorBuffer,使用Background属性的颜色代替
- Skybox:
清空前面全部相机的DepthBuffer和ColorBuffer,使用天空盒代替
- Depth Only:
清空前面全部相机的DepthBuffer和ColorBuffer
- Don’t Care:
不清空前面全部相机的DepthBuffer和ColorBuffer
-
BackGround:
当Clear Flag不是Skybox时,相机渲染的背景色 -
Culling Mask:
用于进行可选择性的渲染视图Scene,当GameObject的layerMask和cullingMask为0时,这个游戏对象在该相机下不可见 -
Projection:
- Perspective:以透视方式渲染
- Orthographic:以正交模式渲染
- Size:正交模式下,相机的视口大小
- Field of View:透视模式下的相机视场角
-
Clipping Planes:
相机从开始到停止渲染的距离- Near:相机从开始到停止渲染的最小距离
- Far:相机从开始到停止渲染的最大距离
-
ViewPort Rect:
相机渲染的位置和大小,在视口坐标中测量(0~1)- X:
- Y:
- W:
- H:
-
Depth:
相机渲染的顺序,值大的会在值小的上面 -
Rendering Path:
定义相机渲染的方法 -
Target Texture
将相机渲染的画面输出到一个Render Texture纹理上
4.2.3 Light灯光
- Directional Light 方向光源
可以被放置在无穷远处的位置,影响场景中的一切游戏对象,类似自然界中的日光,是最节约图形处理器资源的一种光源。 - Point Light 点光源
类似电灯,从一个位置向四面八方发出光线,影响其范围内的所有对象。比较耗费图形处理器资源。 - Spot Light 聚光灯
类似射灯的照明效果,处于锥形区域内的对象会受到光线的照射。比较耗费图像处理器资源。 - Area Light 区域光/面光源
无法应用于实时光照,仅适用于光照贴图烘焙。
4.3.2 Mesh组件
Mesh组件有4种类型
- Mesh Filter
网格过滤器。 - Text Mesh
文本网格 - Mesh Renderer
网格渲染器 - Skinned Mesh Renderer:
蒙皮渲染器,用于呈现骨骼动画。
4.4 Prefabs预制体
可以理解为一个游戏对象及其组件的集合,目的是使游戏对象以及资源能够重复使用。
Chapter5 构建3D场景
- Terrain
用于构建地形- 设置地形分辨率
在Hierarchy视图中选中Terrain,然后在Terrain的Inspector视图中,点击Terrain下的齿轮设置按钮,修改Resolution下的Terrain Width(地形宽度),Terrain Length(地形长度), Terrain Height(地形高度)。 - 抬高地形,增加山脉,向下刷深度(shift+鼠标左键)
喷涂地形高度时,可以通过点击喷涂选项下的Flatten按钮直接将地形统一抬高。 - 添加纹理
绘制地形的首层纹理,在Terrain的Inspector视图中,单击Terrain下的Paint Texture按钮,然后单击Edit Texture按钮,Add Texture,选择需要使用的纹理材质绘制。 - 添加树木和植被
在Terrain的Inspector视图中,单击Terrain下的Paint Trees按钮,将要添加的Tree材质添加进去,然后绘制。
按住Shift键,然后单击场景中种好的树,可以将其移除。
按住Ctrl键,在场景中可以移除范围内与选中类型相同的树。
添加植被类似(P52),刷草时需要把视窗拉到刷草的地形上,距离太远的话花草不会展示在视窗上面,可以通过设置Detail Distance参数来调节。 - Wind Setting for Grass
- Speed:风吹过草的速度
- Size:风吹过草地时的涟漪大小
- Bending:草被风吹后的弯曲程度
- Grass Tint:设置草对象的整体色调
- Heightmap(高度图)
导入或者导出Raw格式的地形高度图 - Lighting(全局光照)P56
- 设置地形分辨率
- 光源与阴影
-
Mode
- realtime
每一帧实时计算照明(运行时计算),可以根据玩家动作或者场景中发生的事件变化而变化。
- mixed
可在运行时更改transform和视觉效果(照亮静态环境),运行时计算。
- baked
不在运行时计算,主要用于增加黑暗区域的亮度而无需调整场景中的照明。
在动态对象上不能发出镜面照明,不能随着玩家动作和场景中的事件变化而变化,即是说没有动态的光照响应。动态游戏对象无法再与其他动态游戏对象上投射阴影。
-
- 第一人称控制器
- 控制器的高度应该高于其放置处的地向高度,否则会陷入地面,并且一直向下掉落。
- 播放后通过 W A S D 控制移动,且播放时图标会被隐藏,可以使用快捷键结束播放,按esc会显示鼠标。
- 可以通过将controller组件中的mouse look下的lock cursor参数取消勾选的方式,实现在播放时显示鼠标的功能。
- 添加天空盒
Window -> Lighting -> Settings,然后在打开的Lighting视图的Scene选项卡中,在Skybox Material选择需要使用的天空盒材质。 - 添加音效
- 添加BGM
将bgm音频文件拖入Hierarchy视图中,然后在该bgm对象的Inspector视图中,勾选Loop。 - 添加音效
将对应的音频文件拖入Hierarchy视图中,然后在该对象的Inspector视图中,将Loop勾选,然后把Spatial Blend设置为1(这使得声音变成空间3D混合),Volume Rolloff(音量衰减)设置为Linear Rolloff(线性衰减),Max Distance能够覆盖掉需要的区域即可。
- 添加BGM
Chapter8 3D数学基础
8.1 3D坐标系
unity中使用的是左手坐标系,其中 $x$ 轴代表水平方向,$y$ 轴竖直方向,$z$ 轴代表深度,即垂直纸面向里的方向。
unity中的游戏对象的坐标信息是放在一对括号中的,依次按照 $x、y、z$ 轴顺序的格式来写。
8.1.1 全局坐标系
在Scene中创建的物体,均以Global坐标系确定位置。
8.1.2 局部坐标系
- 每个物体都有独立的物体坐标系,随物体进行移动或者旋转
- 父子物体的坐标系相关联,子物体会以父物体的某一坐标点为自身的坐标原点
即是说,存在父物体时,position显示局部坐标系,无父物体时,position显示全局坐标。
8.1.3 相机坐标系
根据观察位置和方向建立的坐标系,方便判断物体是否存在于该相机的视野中,以及判断物体的先后遮挡顺序。
8.1.4 屏幕坐标系
建立在屏幕上的二维坐标系,描述像素在屏幕上的位置。原点位置 $(0, 0)$ 在屏幕的左下角,最大坐标在屏幕的右上角
8.2 向量
用于描述具有大小和方向两个属性的物理量,如物体运动的速度、加速度、摄像机的观察方向,刚体受到的力等等都是向量。
在数学中,既有大小又有方向的量就是向量。在几何中,向量可以用一段有方向的线段来表示。
8.2.1 向量的运算
- 加减
- 数乘
向量与一个标量相乘称为数乘。数乘可以对向量的长度进行缩放,如果标量>0,向量进行数乘运算后的方向不变;若<0,反向。 - 点乘
两个向量点乘得到一个标量。数值等于两个向量长度相乘后再乘以二者夹角的余弦值。
$a · b = |a| |b| cosθ$ - 叉乘
两个向量的叉乘得到一个新的向量。新向量垂直于原来的两个向量,并且长度等于原来向量长度相乘后再乘夹角的正弦值。
8.2.2 Vector3类
- 计算两个向量之间的距离
Vector3.Distance(obj1.position, obj2.position)
- 使物体缓动到新的位置
Vector3.Lerp(obj1.position, target.position)
8.3 矩阵
-
平移
平移矩阵$$
Tp=\left[
\begin{matrix}
1 & 0 & 0 & 0 \
0 & 1 & 0 & 0 \
0 & 0 & 1 & 0 \
Px & Py & Pz &1 \
\end{matrix}
\right]$$
与 $v$ 相乘后
$vT = (Vx + Px, Vy + Py, Vz + Pz, 1)$
即实现 $v$ 沿 $v$ 方向平移 $(Px, Py, Pz)$ 距离’ -
旋转
旋转矩阵$$
X(\theta)=\left[
\begin{matrix}
1 & 0 & 0 & 0 \
0 & cos\theta & sin\theta & 0 \
0 & -sin\theta & cos\theta & 0 \
0 & 0 & 0 &1 \
\end{matrix}
\right]$$
$X(\theta)$ 与 $v$ 相乘,可以使得向量 $v$ 沿 $x$ 轴旋转 $\theta$ 角。
-
缩放
缩放矩阵$$
S(q)=\left[
\begin{matrix}
qx & 0 & 0 & 0 \
0 & qy & 0 & 0 \
0 & 0 & qz & 0 \
0 & 0 & 0 &1 \
\end{matrix}
\right]$$
$S(q)$ 与 $v$ 相乘,可以使 $v$ 在 $x, y ,z$ 的分量分别缩放 $qx, qy, qz$ 倍。
-
组合
现在有向量 $v$, 平移举证 $T$, 旋转矩阵 $R$, 缩放矩阵 $S$, 另有组合矩阵 $M=SRT$, 则有:
$vSRT=vM$
向量 $v$ 乘以矩阵 $M$ 相当于依次对 $v$ 进行缩放、旋转和平移。
8.4 齐次坐标
在3D数学中,齐次坐标就是吧三维向量 $(x, y ,z)$ 用四维向量 $(wx, wy, wz, w)$ 来表示。
引入齐次坐标的目的
- 更好的区分向量和点
坐标点: $(x, y, z, 1)$
向量: $(x, y, z, 0)$ - 统一用矩阵乘法表示平移、旋转、缩放变换
如果用3×3矩阵,矩阵乘法只能表示旋转变换和缩放变换,无法表示其次变换。 - 当分量 $w=0$ 时可以表示无穷远处的点。
8.5 四元数
四元数包含一个标量分量和一个三维向量分量,四元数 $Q$ 可以记作: $Q=[w, (x, y, z)]$
用四元数表示对于三维空间内旋转轴为 $n$, 旋转角度为 $\alpha$ 的旋转:
$$
w = cos(\alpha/2)\
x = sin(\alpha/2)cos(\beta x)\
y = sin(\alpha/2)cos(\beta y)\
z = sin(\alpha/2)cos(\beta z)\
$$
其中 $cos(\beta x)、cos(\beta y)、cos(\beta z)$ 分别为旋转轴的 $x, y, z$ 分量。
使物体一直朝向 target 目标
Vector3 relativePos = target.position - transform.position;
transform.rotation = Quaternion.LookRotation(relativePos);
8.6 坐标变换原理
8.6.1 世界坐标与局部坐标的变换
- 局部坐标->全局坐标
Transform.TransformPoint
- 全局坐标->局部坐标
Transform.InverseTransformPoint
- 向量的全局坐标和局部坐标转换
Transform.TransformDirection
Transform.InverseTransformDirection
8.6.2 世界坐标与屏幕坐标转换
(以相机为媒介)
- 世界坐标->屏幕坐标
screenPos = Camera.main.WorldToScreenPoint(transform.position);
- 屏幕坐标->世界坐标
Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);
Chapter10 信息输入管理
10.1 Input Manager
Input类的部分成员变量
变量名 | 作用 |
---|---|
anyKey | 是否有按住 |
anyKeyDown | 是否有按下 |
compass | 罗盘 |
backButtonLeavesApp | 是否按下退出按钮退出APP |
compensateSensors | 是否需要根据屏幕方向补偿感应器 |
compositionCursorPos | 当前IME组合字符串的光标位置 |
gyro | 返回默认的陀螺仪 |
Input类的部分成员函数
函数名 | 作用 |
---|---|
GetAccelerationEvent | 返回上一帧期间发生的特定加速度测量 |
GetAxis | 根据名称得到虚拟输入轴的值 |
GetAxisRaw | 根据名称得到虚拟坐标轴的未使用平滑过滤的值 |
GetButton | 指定名称按钮按住时,返回true |
GetButtonDown | 指定名称按钮按下时,返回true |
GetButtonUp | 指定名称按钮松开时,返回true |
GetTouch | 返回指定的触摸数据对象(不临时分配变量) |
GetJoystickNames | 返回当前连接的所有摇杆的名称数组 |
类似的几个Input类的成员函数
- GetKey
- GetKeyDown
- GetKeyUp
- GetMouseButton
- GetMouseButtonDown
- GetMouseButtonUp
10.2 鼠标输入
mousePosition | 获取当前鼠标指针位置的像素位置(只读) |
GetMouseButtonDown | 鼠标按键按下的第一帧返回true |
GetMouseButton | 鼠标按键按住期间一直返回true |
GetMouseButtonUp | 鼠标按键松开的第一帧返回true |
GetAxis("Mouse X") | 得到第一帧内鼠标在水平方向的移动距离 |
GetAxis("Mouse Y") | 得到第一帧内鼠标在垂直方向的移动距离 |
GetMouseButtonDown
、GetMouseButton
、GetMouseButtonUp
需要传入参数来指定判断哪个鼠标按键:0对应左键,1对应右键,2对应中键
10.3 键盘输入
键盘输入有些需要配合KeyCode编码来使用
一些例子
GetKey("up")
GetKey(KeyCode.DownArrow)
GetKeyDown(KeyCode.Space)
GetKeyUp(KeyCode.Space)
GetAxis("Horizontal")
和 GetAxis("Vertical")
: 用方向键或者W、A、S、D键来模拟-1到1的平滑输入。
10.6 自定义输入
创建虚拟按键: Edit -> ProjectSetting -> Input
virtual button 是输入轴的一种特殊情况
Chapter11 物理系统
11.1 概述
unity中有两个独立的物理引擎,一个3D物理引擎,一个2D物理引擎。俩物理引擎之间的概念是相同的(除了额外的3D维度),但是它们使用的是不同的组件来实现的。
11.2 物理系统相关组件
11.2.1 刚体组件
Rigidbody(刚体)组件,包括Rigidbody和Rigidbody 2D
作用:
- 使游戏对象在物理系统的控制下进行运动
- 接受外力和扭矩力 => 保证游戏对象像在真实世界中移动
- 使游戏对象受到重力印象
- 作用力:通过NVIDIA物理与其他游戏对象的互动的运算,都需要添加Rigidbody
如何添加Rigidbody
- 方法一:
选中待添加刚体组件的对象
点击 Component -> physics -> Rigidbody - 方法二:
选中待添加刚体组件的对象
在Inspector中,单击下方Add Component,搜索Rigidbody添加
Rigidbody的属性
-
Mass 质量
同一Scene中,不同obj的质量之比不要超过100倍 -
Drag 阻力
obj游戏对象进行受力运动时受到的空气阻力 -
Angular Drag 角阻力
当游戏对象受到扭矩力旋转时受到的控制阻力 -
Use Gravity 使用重力
-
Is Kinematic 是否开启动力学
开启后,不再受到物理引擎的影响,只能通过Transform来操作,适用于模拟平台的移动或者带有铰链关节链接刚体的动画。 -
Interpolate 插值
用于控制刚体运动的抖动情况- None 无
- Interpolate 内插值,基于前一帧的Transform来平滑此次的Transform
- Extrapolate 外插值,基于下一帧的Transform来平滑此次的Transform
-
Collision Detection 碰撞检测
避免高速运动的物体穿过其他的游戏对象而且未发生碰撞情况。- Discrete
离散碰撞检测。
游戏对象与场景中其他的所有物体进行碰撞检测,默认值。- Continuous
连续碰撞检测。检测游戏对象obj与动态碰撞体的碰撞。
可检测obj与网格碰撞体(没有Rigidbody)的碰撞。适用于要采用连续动态碰撞检测的物件。
特点: 对物理性能有很大影响,如果不需要对快速运动的游戏对象进行碰撞检测,就使用Discrete。- Continuous Dynamic
连续动态碰撞检测
主要用于检测obj与采用连续动态碰撞或连续碰撞的对象的碰撞
也可以用于检测没有Rigidbody的静态网格碰撞体
可以用于检测快速运动的游戏对象 -
Constraints 约束
- Freeze Position 冻结位置,使刚体在这个勾选轴方向上的移动无效。
-
Freeze Rotation 冻结某个轴的旋转,是刚体在勾选轴方向上的旋转无效
11.2.2 角色控制器
Character Controller(角色控制器)主要用与对第一人称或者第三人称游戏主角的控制,并不使用刚体的物理效果。
Character Controller组件属性面板
- Slope Limit
坡度限制。游戏对象只能爬上小于或者等于该参数值的斜坡。 - Step Offset
台阶高度。游戏对象只能迈上小于或等于该值高度的台阶。 - Skin Width
皮肤厚度。该参数决定了两个碰撞体可以相互渗入的深度。
较大 -> 产生抖动现象
较小 -> 导致被控对象obj被卡住
合理值: Radius的10% - Min Move Distance
最小移动距离。如果被控对象的移动距离小于该值,则游戏对象不会移动。
目的是为了防止抖动。大多数情况下把该值设为0。 - Center
决定胶囊碰撞体与所控制obj的游戏对象的相对位置。不影响所控制obj的中心坐标。 - Radius
Capsule碰撞体的半径。 - Height
Capsule碰撞体的高度。
注意:
- 角色控制器不会对施加给它的作用力作出反应,也不会作用于其他刚体
- 可以在
OnControllerColliderHit()
函数中,为与其碰撞的对象施加上一个作用力 - 如果想要让Character Controller 受力作用,可以使用刚体替代
11.2.3 碰撞体组件
作用
- 要与刚体一起添加到游戏对象上,才能发生碰撞
- 在物理引擎中,没有添加碰撞体的两个物体会彼此相互穿过
碰撞体类型
-
Box Collider 盒碰撞体
- Edit Collider 编辑碰撞体。点击后可以在Scene编辑碰撞体形状
- Is Trigger 触发器。勾选后,该碰撞体可以用于触发事件,且将被物理引擎忽略
- Material 材质。采用不同材质的碰撞体和其他对象交互的形式不同。
- Center 中心。碰撞体在局部坐标中的位置
- Size 大小。碰撞体在 x, y, z 方向上的大小
-
Sphere Collider 球形碰撞体
- Edit Collider
- Is Trigger
- Material
- Center
- Radius 半径
-
Capsule Collider 胶囊碰撞体
unity角色控制器中通常内嵌了Capsule Collider- Edit Collider
- Is Trigger
- Material
- Center
- Radius
- Height 高度。控制胶囊体中圆柱的高度。
- Direction 方向。在对象的局部坐标中胶囊的纵向所对应的坐标轴。
-
Mesh Collider 网格碰撞体
与基础碰撞体相比,Mesh Collider更加精细,也更加占用资源。
只有在开启了Convex参数的网格碰撞体才能与其他的网格碰撞体发生碰撞。- Convex 凸起。
- Is Trigger
- Material
- Mesh 网格
Mesh Collider根据所附加对象的Transform来设定碰撞体的位置和大小比例。使Collider的形状与GameObject的可见网格形状完全相同。正因为如此,所以开销比较大,尽量少用。
碰撞网格 :碰撞网格使用了背部消隐的方式。如果一个obj与一个背部消隐的Mesh在是视觉上发生碰状态,他们并不会在物理上碰撞。
网格碰撞体限制:- 通常两个Mesh Collider之间不会碰撞。
- Mesh Collider可以与基本的碰撞体发生碰撞。
- 只有网格碰撞的Mesh中三角形数量少于255时,Convex才能生效。
-
Wheel Collider 车轮碰撞体
针对地面车辆,内置碰撞检测,车轮物理系统,有滑胎摩擦的参考体- Mass 质量
- Radius 半径
- Wheel Damping Rate 车轮阻尼率
- Suspension Distance 悬挂距离
用于设置车轮碰撞体悬挂的最大伸长距离,按照局部坐标计算。
悬挂总是通过其局部坐标的y轴进行延伸。 - Force APP Point Distance 力作用点距离。
预计为从车轮静止位置沿悬架行进方向的距离。更好的车辆将力应用于略低于车辆质心的位置。 - Center 中心。
设置车轮碰撞体在对象局部坐标中的位置。 - Suspension Spring 悬挂弹簧。
设置车轮碰撞体通过添加弹簧和阻尼外力使得悬挂达到目标位置- Spring 弹簧。弹簧力度越大,悬挂达到目标位置的速度也越快。
- Damper 阻尼器。数值越大,悬挂弹簧移动速度越慢。
- Target Position 目标位置。悬挂沿着方向上静止时的距离。值为0,完全伸展状态;值为1,完全压缩状态。默认0.
- Forward Friction 前向摩擦力。
- Extremum Slip 滑动极值
- Extremum Value 极限值
- Asymptote Slip 滑动渐进值
- Asymptote Value 渐进值
- Stiffness 刚性因子。为极限值与渐进值的乘数(默认为1,表示刚度变化的摩擦程度。设置为0禁用所有的车轮摩擦。通常在运行时脚本修改来模拟各种地面材料)
- Side Friction 侧向摩擦力
- Extremum Slip
- Extremum Value
- Asymptote Slip
- Asymptote Value
- Stiffness
-
Terrain Collider 地形碰撞器
- Material 材质
- Terrain Data 地形数据
- Enable Tree Colliders 开启树的碰撞体
11.2.4 物理材质
添加方式
Assets -> Create -> Physics Material。然后将物理材质从Project项目视图拖放到场景中的碰撞体上即可。
属性列表
- Dynamic Friction 动摩擦系数 通常值 $\mu\in[0, 1]$
- Static Friction 静摩擦系数 通常值 $[0, 1]$
- Bounciness 弹力系数 0不会反弹,1会反弹且无能量损失
- Friction Combine 两个碰撞体摩擦的组合方式
- Average 平均值
- Minimum 最小值
- Maximum 最大值
- Multiply 乘积
- Bounce Combine 两个碰撞体弹性的组合方式,具体方式类型同上摩擦的组合方式
注意: 组合方式的优先级 : Average < Minimum < Multiply < Maximum
11.2.5 布料组件
布料组件可以模拟类似布料的行为状态。
包括:
- Skinned Mesh Renderer 蒙皮网格渲染器
- Cloth
其中 Cloth 和 Skinned Mesh Renderer 要协同工作。即是说 Cloth 只适用于蒙皮网络。
将 Cloth 组件添加到非蒙皮网格时,unity会自动移除非蒙皮网格渲染器并添加蒙皮网格。
Skinned Mesh Renderer 参数:
-
Quality 品质。在蒙皮时每个顶点使用的骨骼的最大数量,设置为自动时,以使用质量设置的混合权重值。
-
Update When Offscreen 蒙皮网格更新。启用后,即使所有Camera都不可见,Skinned Mesh也会更新。禁用后,当GameObject不在屏幕上时,动画本身会停止运行。
-
Mesh 网格。
-
Root Bone 骨骼根节点。
-
Bounds 限制范围
- Center 网格中心位置
- Extents 网格的范围
-
Lighting 光线参数 P175
- Light Probes 基于光照探头的内插模式
- Reflection Probes 如果启用且反射探头出现在场景中,反射纹理会从这个游戏对象和构建着色器设置的变量中获取到。
- Anchor Override 用于设置光照探头或者反射探头系统时内插文职的Transform
- Cast Shadows 投射阴影
off 关闭投射阴影
on 开启透射阴影
Two Sided 开启双面阴影
Shadows Only 只投射阴影- Receive Shadow 接受阴影
- Motion Vector 用于设置运动矢量的渲染模式
- Material 材质列表
- Dynamic Occluded 动态遮挡
Cloth 参数 P175
- Stretching Stiffness 拉伸刚度。用于设置抗拉伸程度,值越大越不容易拉伸。
- Bending Stiffness 弯曲强度。用于设置抗弯曲程度,值越大越不容易弯曲。
…
特点
布料不会对Scene中的碰撞体做出反应,也不会是施加力量,可以为布料添加碰撞体来模拟反应,但是始终无法施加力,若不添加,世界与布料互不识别。
11.2.6 关节组件
- Hinge Joint 铰链关节
由两个刚体组成,关节对刚体进行约束, 适用于门,模型链,钟摆
属性
属性名 | 作用 |
---|---|
Edit Joint Angular Limit | 编辑关节角度的限制 |
Connected Body | 连接刚体(为关节指定Body),不指定则连接世界 |
Anchor | 锚点(位置应用于局部坐标系) |
Axis | 轴,定义刚体摆动方向(局部坐标) |
Auto Config Connected Anchor | 自动连接锚点,默认开启 |
Connected Anchor | 链接锚点,Auto开启时默认开启,Auto关闭时手动连接 |
Use Spring | 使用弹簧->使刚体与连接主体形成特定角度 |
Spring | 弹簧 Spring 弹簧力, Damper 阻尼, Target Position 目标角度 |
Use Motor | 使用马达,使对象rotate Target Velocity 目标速度, Force 作用力, Free Spin 自由转动 |
Use Limits | 使用限制->勾选后铰链角度将被限定区间 |
Limits | Min/Max 铰链能达到的最小/大角度, Min/Max Bounce 最小/大反弹(铰链对象接触到最小值的反弹值), Max Bounce |
Break Force | 断开力 |
Break Torque | 断开扭矩 |
Enable Collision | 激活碰撞(关节间) |
Enable Preprocessing | 启用预处理(禁用有助于稳定无法执行的配置) |
Mass Scale | 质量缩放值 |
Connected Mass Scale | 连接刚体的质量缩放值 |
- Fixed Joint 固定关节
使用固定关节的对象自身要有一个刚体。适用于某些obj要暂时或者永久的连接在一起。
特点:不需要通过脚本来修改层级结构就能实现
- Spring Joint 弹簧关节
参数:
- Spring 弹簧强度
- Damper 阻尼
- Min Distance 弹簧启用的最小距离
- Max Distance 弹簧启用的最大距离
其余参数同Hinge Joint
- Character Joint 角色关节
参数P182:
- Swing Axis 摆动轴,设置角色关节摆动轴
- Twist Limit Spring 弹簧的扭曲限制: Spring/Damper
- Low Twist Limit
- Limit 扭曲下限
- Bounciness 扭曲下限反弹值
- Contact Distance 为了避免抖动限制的接触距离
- 可配置关节
11.2.7 力场组件
为刚体快速添加恒定作用力,适用于火箭发射这类,游戏对象在起初时没有很大的初速度,但不断加速的
11.3 可视化物理调试
允许用户快速检查 Scene中的几何碰撞体,提供了ojbs应该和不应该相撞的可视化情况
window -> Physics Debugger