《Unity2017从入门到精通》复习笔记(一)

记录一下unity考试前整理的笔记。

Chapter3 Unity编辑器

3.2 界面布局

3.3 工具栏


3.3.1 Transform Tools(变换工具)

  1. 手形工具(Q)
    可以在Scene视图中按鼠标左键平移整个场景
  2. 移动工具(W)
    在Scene视图中选择某个对象之后,在该游戏对象上出现3个方向的箭头代表物体的三维坐标,通过拖动箭头可以改变游戏对象在某一个轴上的位置。
  3. 旋转工具(E)
    可以在Scene视图中按任意角度旋转所选中的游戏对象。
  4. 缩放工具(R)
    可以在Scene视图中缩放选中的游戏对象,蓝色方块代表沿Z轴缩放,红色X轴,绿色Y轴。中间的灰色方块可以将对象在3个坐标轴上进行统一的缩放。
  5. 矩形工具(T)
    是允许用户查看和编辑2D或者3D游戏对象的矩形手柄。对于2D游戏对象,可以按住shift键进行等比例缩放。
  6. 移动旋转缩放三合一工具(Y)
    包含W、E、R这三个快捷键代表的功能的整合工具。

在Scene视图中按住alt键配合鼠标左键可以以当前轴心点来旋转编辑视角,配合鼠标右键可以缩放编辑视角(拉进或拉远)


3.3.2 Transform Gizmo Tools(变换辅助工具)


3.3.3 Play(播放控制)


3.3.4 Layers(分层下拉列表)

控制游戏对象在Scene中的显示。下拉菜单中为显示状态的层级的物体(有眼睛图标)被显示在Scene视图中。


3.3.5 Layout(布局下拉列表)

用于切换,删除,保存的界面布局列表。

3.4 菜单栏

3.5 常用工作视图


3.5.1 Project

搜索过滤:t: 代表类型过滤,l: 代表标签过滤


3.5.2 Scene

按住鼠标的滚轮键,可以像使用快捷键Q一样移动场景。


3.5.3 Game视图

显示游戏最终运行效果的预览窗口,无法编辑

Game View Control Bar:设置目标显示,分辨率,屏幕缩放等等


3.5.4 Inspector视图

展示选中游戏对象的一些信息和他带有的组件,常用的组件显示如下


3.5.5 Hierarchy层级视图


3.5.6 Console控制台视图

在Console控制台视图中可以双击错误信息,即可打开代码编辑器自动定位有问题的脚本代码位置。

Chapter4 游戏对象、组件和Prefabs

4.1 创建游戏对象和组件

  1. 菜单栏 GameObject -> 3D Object -> Cube/Sphere
  2. 创建完成的对象会在Hierarchy栏中显示,被称为游戏对象
  3. 选中Cube游戏对象,可以看到他的4个组件
    • Transform
    • Cube(Mesh Filter)
    • Box Collider
    • Mesh Render
  4. 给游戏对象添加组件
    • 选中要添加组件的游戏对象
    • 点击菜单栏中的component,弹出组件列表选中要添加的组件即可
      Hierarchy -> GameObject -> Component -> Physics -> Rigidbody

4.2 常用游戏对象

重命名物体的几种方式:


4.2.2 Camera相机

可以在场景中拥有无数相机,可以为其设置任意顺序,在屏幕上的任何位置,或者仅仅在屏幕的某些部分进行渲染

参数列表:


4.2.3 Light灯光


4.3.2 Mesh组件

Mesh组件有4种类型

4.4 Prefabs预制体

可以理解为一个游戏对象及其组件的集合,目的是使游戏对象以及资源能够重复使用。

Chapter5 构建3D场景

  1. 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
  2. 光源与阴影
    • Mode

      • realtime

      每一帧实时计算照明(运行时计算),可以根据玩家动作或者场景中发生的事件变化而变化。

      • mixed

      可在运行时更改transform和视觉效果(照亮静态环境),运行时计算。

      • baked

      不在运行时计算,主要用于增加黑暗区域的亮度而无需调整场景中的照明。
      在动态对象上不能发出镜面照明,不能随着玩家动作和场景中的事件变化而变化,即是说没有动态的光照响应。动态游戏对象无法再与其他动态游戏对象上投射阴影。

  3. 第一人称控制器
    • 控制器的高度应该高于其放置处的地向高度,否则会陷入地面,并且一直向下掉落。
    • 播放后通过 W A S D 控制移动,且播放时图标会被隐藏,可以使用快捷键结束播放,按esc会显示鼠标。
    • 可以通过将controller组件中的mouse look下的lock cursor参数取消勾选的方式,实现在播放时显示鼠标的功能。
  4. 添加天空盒
    Window -> Lighting -> Settings,然后在打开的Lighting视图的Scene选项卡中,在Skybox Material选择需要使用的天空盒材质。
  5. 添加音效
    • 添加BGM
      将bgm音频文件拖入Hierarchy视图中,然后在该bgm对象的Inspector视图中,勾选Loop。
    • 添加音效
      将对应的音频文件拖入Hierarchy视图中,然后在该对象的Inspector视图中,将Loop勾选,然后把Spatial Blend设置为1(这使得声音变成空间3D混合),Volume Rolloff(音量衰减)设置为Linear Rolloff(线性衰减),Max Distance能够覆盖掉需要的区域即可。

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 向量的运算


8.2.2 Vector3类

8.3 矩阵

  1. 平移
    平移矩阵

    $$
    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)$ 距离’

  2. 旋转
    旋转矩阵

    $$
    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$ 角。

  3. 缩放
    缩放矩阵

    $$
    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$ 倍。

  4. 组合
    现在有向量 $v$, 平移举证 $T$, 旋转矩阵 $R$, 缩放矩阵 $S$, 另有组合矩阵 $M=SRT$, 则有:
    $vSRT=vM$
    向量 $v$ 乘以矩阵 $M$ 相当于依次对 $v$ 进行缩放、旋转和平移。

8.4 齐次坐标

在3D数学中,齐次坐标就是吧三维向量 $(x, y ,z)$ 用四维向量 $(wx, wy, wz, w)$ 来表示。

引入齐次坐标的目的

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 世界坐标与局部坐标的变换


8.6.2 世界坐标与屏幕坐标转换

(以相机为媒介)

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类的成员函数

10.2 鼠标输入

mousePosition 获取当前鼠标指针位置的像素位置(只读)
GetMouseButtonDown 鼠标按键按下的第一帧返回true
GetMouseButton 鼠标按键按住期间一直返回true
GetMouseButtonUp 鼠标按键松开的第一帧返回true
GetAxis("Mouse X") 得到第一帧内鼠标在水平方向的移动距离
GetAxis("Mouse Y") 得到第一帧内鼠标在垂直方向的移动距离

GetMouseButtonDownGetMouseButtonGetMouseButtonUp需要传入参数来指定判断哪个鼠标按键: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

作用:

如何添加Rigidbody

Rigidbody的属性

11.2.2 角色控制器

Character Controller(角色控制器)主要用与对第一人称或者第三人称游戏主角的控制,并不使用刚体的物理效果。

Character Controller组件属性面板

注意:


11.2.3 碰撞体组件

作用

碰撞体类型

  1. Box Collider 盒碰撞体

    • Edit Collider 编辑碰撞体。点击后可以在Scene编辑碰撞体形状
    • Is Trigger 触发器。勾选后,该碰撞体可以用于触发事件,且将被物理引擎忽略
    • Material 材质。采用不同材质的碰撞体和其他对象交互的形式不同。
    • Center 中心。碰撞体在局部坐标中的位置
    • Size 大小。碰撞体在 x, y, z 方向上的大小
  2. Sphere Collider 球形碰撞体

    • Edit Collider
    • Is Trigger
    • Material
    • Center
    • Radius 半径
  3. Capsule Collider 胶囊碰撞体
    unity角色控制器中通常内嵌了Capsule Collider

    • Edit Collider
    • Is Trigger
    • Material
    • Center
    • Radius
    • Height 高度。控制胶囊体中圆柱的高度。
    • Direction 方向。在对象的局部坐标中胶囊的纵向所对应的坐标轴。
  4. Mesh Collider 网格碰撞体
    与基础碰撞体相比,Mesh Collider更加精细,也更加占用资源。
    只有在开启了Convex参数的网格碰撞体才能与其他的网格碰撞体发生碰撞。

    • Convex 凸起。
    • Is Trigger
    • Material
    • Mesh 网格

    Mesh Collider根据所附加对象的Transform来设定碰撞体的位置和大小比例。使Collider的形状与GameObject的可见网格形状完全相同。正因为如此,所以开销比较大,尽量少用。
    碰撞网格 :碰撞网格使用了背部消隐的方式。如果一个obj与一个背部消隐的Mesh在是视觉上发生碰状态,他们并不会在物理上碰撞。
    网格碰撞体限制:

    • 通常两个Mesh Collider之间不会碰撞。
    • Mesh Collider可以与基本的碰撞体发生碰撞。
    • 只有网格碰撞的Mesh中三角形数量少于255时,Convex才能生效。
  5. 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
  6. Terrain Collider 地形碰撞器

    • Material 材质
    • Terrain Data 地形数据
    • Enable Tree Colliders 开启树的碰撞体

11.2.4 物理材质

添加方式

Assets -> Create -> Physics Material。然后将物理材质从Project项目视图拖放到场景中的碰撞体上即可。

属性列表

注意: 组合方式的优先级 : Average < Minimum < Multiply < Maximum


11.2.5 布料组件

布料组件可以模拟类似布料的行为状态。

包括:

其中 Cloth 和 Skinned Mesh Renderer 要协同工作。即是说 Cloth 只适用于蒙皮网络。

将 Cloth 组件添加到非蒙皮网格时,unity会自动移除非蒙皮网格渲染器并添加蒙皮网格。

Skinned Mesh Renderer 参数:

Cloth 参数 P175

特点
布料不会对Scene中的碰撞体做出反应,也不会是施加力量,可以为布料添加碰撞体来模拟反应,但是始终无法施加力,若不添加,世界与布料互不识别。


11.2.6 关节组件

  1. 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 连接刚体的质量缩放值
  1. Fixed Joint 固定关节

使用固定关节的对象自身要有一个刚体。适用于某些obj要暂时或者永久的连接在一起。

特点:不需要通过脚本来修改层级结构就能实现

  1. Spring Joint 弹簧关节

参数:

其余参数同Hinge Joint

  1. Character Joint 角色关节

参数P182:

  1. 可配置关节

11.2.7 力场组件

为刚体快速添加恒定作用力,适用于火箭发射这类,游戏对象在起初时没有很大的初速度,但不断加速的

11.3 可视化物理调试

允许用户快速检查 Scene中的几何碰撞体,提供了ojbs应该和不应该相撞的可视化情况

window -> Physics Debugger