72.Unity核心基础知识总结

  1. 72.总结
    1. 72.1 知识点
      1. 学习的主要内容
      2. 总结讲什么
      3. Unity核心中知识点的重要性
      4. 如何学好Unity?
      5. 强调
    2. 72.2 核心要点速览
      1. 图片纹理
        1. Unity支持的图片格式
        2. 纹理类型参数
        3. 纹理形状参数
        4. 纹理高级参数设置
        5. 纹理平铺拉伸参数
        6. 纹理平台打包相关参数
      2. SpriteEditor精灵编辑器
        1. Single 图片编辑功能
        2. Multiple 图集元素分割
        3. Polygon 多边形编辑
      3. Animator
        1. Animator 动画器组件参数说明
        2. Animator 动画器代码控制
        3. Animator 窗口中动画状态设置相关参数
        4. Animator 窗口中动画过渡设置相关参数
        5. 动画分层和遮罩
        6. 动画融合树
          1. 动画 1D 混合
          2. 动画2D 混合
      4. 模型导入
        1. Model模型页签
          1. Scene 场景相关设置
          2. Meshes 网格相关设置
          3. Geometry 几何体相关设置
        2. Rig操纵骨骼页签
          1. Animation Type(动画类型)
          2. Muscles&Settings(肌肉与设置)
      5. CharacterController角色控制器
        1. 角色控制器的概念
        2. 角色控制器的使用
        3. 角色控制器组件参数
        4. 角色控制器代码控制
        5. 碰撞和触发检测函数
      6. 导航寻路系统
        1. 导航网格生成
          1. Object 场景对象设置页签:设置参与寻路烘焙的对象。
          2. Bake 导航数据烘焙页签:设置寻路网格具体信息,点击烘焙后,场景中生成的蓝色部分为可行走区域,需设置有对象为导航静态才能烘焙成功。
          3. Areas 导航地区页签:设置对象的寻路消耗,配合 Object 页签使用。
        2. NavMeshAgent
          1. NavMeshAgent 组件参数
          2. Steering(转向 移动设置)
          3. Obstacle Avoidance(障碍躲避 避障设置)
          4. Path Finding(寻路 路径寻找规则)
          5. NavMeshAgent 代码控制
        3. OffMeshLink
        4. NavMeshObstacle

72.总结


72.1 知识点

学习的主要内容

总结讲什么

Unity核心中知识点的重要性

如何学好Unity?

强调


72.2 核心要点速览

图片纹理

Unity支持的图片格式

  • BMP:是Windows操作系统的标准图像文件格式,特点是几乎不进行压缩,占磁盘空间大。
  • TIF:基本不损失图片信息的图片格式,缺点是体积大。
  • JPG:一般指JPEG格式,属于有损压缩格式,能够让图像压缩在很小的存储空间,一定程度上会损失图片数据,无透明通道。
  • PNG:无损压缩算法的位图格式,压缩比高,生成文件小,有透明通道。
  • TGA:支持压缩,使用不失真的压缩算法,还支持编码压缩。体积小,效果清晰,兼备BMP的图像质量和JPG的体积优势,有透明通道。
  • PSD:是PhotoShop(PS)图形处理软件专用的格式,通过一些第三方工具或自制工具可以直接将PSD界面转为UI界面。
    此外,Unity还支持EXR、GIF、HDR、IFF、PICT等格式。其中,在Unity中最常用的图片格式是JPG、PNG和TGA三种。

纹理类型参数

纹理类型 描述 相关参数及解释
Default(默认) 大部分导入的模型贴图都是该类型 无特殊参数
sRGB(Color Texture)(sRGB颜色纹理) 启用可以将纹理存储在伽马空间中(对每一个像素做一次幂函数运算),一般勾选。
人眼看线性渐变的图片会感觉不是线性的,要用伽马控件校正,校正后的图片人眼看是线性渐变的
sRGB(Color Texture):一般勾选,用于伽马校正
Alpha Source(Alpha源):指定如何生成纹理的Alpha通道
- None:无论输入纹理是否有Alpha通道,导入的纹理都没有Alpha通道
- Input Texture Alpha:使用输入纹理中的Alpha通道
- From Gray Scale:从输入纹理RGB值的平均值生成Alpha,一般不用
Alpha Is Transparency(Alpha是透明的):启用可以避免边缘上的过滤瑕疵,一般启用
Normal map(法线贴图) 法线贴图格式:在原物体的凹凸表面的每个点上均作法线(法线是垂直于某个点的切线的方向向量)。
游戏中有时不使用高精度、多三角面片的模型(避免卡顿),记录高精度模型的各个点的法线做成法线贴图,在低精度模型中,通过法线贴图和一些着色器算法,在三角面片更少的低精度模型里能得到效果更好、看起来更高精度的效果
- Create From Grayscale:启用此属性可以从灰度高度贴图创建法线贴图
- Bumpiness:控制凹凸程度,值越大凹凸感越强
- Filtering:
- Sharp:生成比标准模式更锐利的法线贴图
- Smooth:使用标准算法生成法线贴图
Editor GUI and Legacy GUI(编辑器GUI和旧功能GUI) 一般在编辑器中或者GUI上使用的纹理 无特殊参数
Sprite(2D and UI)(精灵(2D和UI)) 2D游戏或者UGUI中使用的格式 - Sprite Mode:
- Single:按原样使用精灵图像,图片是一张图(非图集)就选这个选项
- Multiple:瓦片模式,如果是图集,使用该选项,可以在Sprite Editor编辑窗口自定义图片
- Polygon:网格精灵模式,如果图片或者图集是多边形可以选择这种模式
- Pixels Per Unit:世界空间中的一个距离单位(Unity中为一米)对应多少像素
- MeshType(只有Sprite模式是Single模式和Multiple模式才支持,因为Polygon模式可自定义多边形大小):
- Full Rect:创建四边形,将精灵显示在四边形上,若图片为三角形,渲染到3D引擎里会创建矩形做成两个三角面片来渲染
- Tight:基于像素Alpha值来生成网格,更加贴合精灵图片的形状,任何小于32*32的精灵都使用FullRect模式,即使设置成Tight模式也是,若图片为三角形,渲染到3D引擎里会把三角形切割成几个三角面片来渲染
- Extrude Edges:使用滑动条确定生成的网格中精灵周围留出的区域大小,可理解为三角形图片边的溢出渲染区域的大小
- Pivot(Single模式才有此选项):精灵图片的轴心点,对应九宫格布局的九个点,还可以自定义
- Generate Physics Shape(只有Single 和Multiple模式才可使用,因为Polygon是自己手动设置的):启用此选项,Unity会自动根据精灵轮廓生成默认物理形状,若图片要进行物理判断(如碰撞器或者物理检测),就勾选它
- Sprite Editor:编辑Sprite,需要安装2D Sprite包
Cursor(光标) 自定义光标,设置鼠标的图片 无特殊参数
Cookie(光源剪影格式) 用于设置光照类型的纹理形状 - Light Type:
- Spotlight:聚光灯类型,需要边缘纯黑色纹理,TextureShape纹理形状需设置为2D形状
- Directional:方向光,平铺纹理,需要设置TextureShape纹理形状为2D形状
- Point:点光源,需要设置TextureShape纹理形状为立方体形状
Lightmap(光照贴图) 光照贴图格式 - Single Channel:纹理只需要单通道的格式
- Channel:
- Alpha:使用Alpha通道,不允许进行压缩
- Red:使用红色通道

纹理形状参数

Texture Shape(纹理形状) 描述
2D 最常用设置,这些纹理将应用于模型和 GUI 元素上
Cube(立方体) 主要用于天空盒和反射探针
Mapping(贴图) 如何将纹理投影到游戏对象上,具体如下:
- Auto(自动):根据纹理信息创建布局。
- 6 Frames Layout(6 帧布局(立方体环境)):纹理包含以标准立方体贴图布局之一排列的六个图像。
- Latitude-Longitude Layout(纬度精度布局(立方体)):将纹理映射到 2D 维度/经度。
- Mirrored Ball(镜面球):将纹理映射到类似球体的立方体贴图上。
Convolution Type(卷积型) 纹理的过滤类型,具体如下:
- None(无):无过滤。
- Specular(镜面(光泽反射)):将立方体作为反射探针。
- Diffuse(漫反射(发光)):将纹理进行过滤表示辐照度,可作为光照探针。
Fixup Edge Seams(固定边缘对接处) 适用情况:当 Convolution Type 为 None 和 Diffuse 时才有用。
作用:解决低端设备上立方体贴图过滤错误的问题。

纹理高级参数设置

参数 描述 选项及说明
Non - Power of 2(非2次幂) 处理纹理尺寸非2的幂的情况。因图形学规则,纹理通常须是2的幂尺寸 None:纹理尺寸保持不变
ToNearest:将纹理缩放到最接近2的幂的大小(PVRTC格式要求纹理为正方形)
ToLarger:将纹理缩放到最大尺寸值的2的幂的大小
ToSmaller:将纹理缩放到最小尺寸值的2的幂的大小
Read/Write Enabled(读/写已开启) 启用后可使用Unity方法从纹理获取数据 一般在需要代码获取图片数据时开启,否则会占内存
Streaming Mipmaps(流式Mipmaps) 启用后可使用纹理串流 用于控制加载在内存中的Mipmap级别,减少Unity对纹理所需内存总量,用性能换内存
Mip Map Priority(Mipmap优先级) - Unity根据该优先级确定分配资源时优先考虑的Mipmap
Generate Mip Maps(生成MipMaps贴图) 允许生成MipMap 开启后可在下方图片栏滚动条调整MipMaps尺寸,2D游戏一般不启用,3D游戏视情况而定
Border Mip Maps(边框Mip贴图) - 启用可避免颜色向外渗透到较低MIP级别的边缘
Mip Map Filtering(Mip贴图过滤) 优化图像质量的过滤方法 Box:随着尺寸减小,级别更平滑
Kaiser:Mipmap尺寸下降时使用的锐化算法,适用于远处纹理模糊的情况
Mip Maps Preserve Coverage(MipMaps保留覆盖范围) - Mipmap的Alpha通道在Alpha测试期间保留覆盖率
Alpha Cutoff Value(Alpha修剪值) - 覆盖率参考值
Fadeout Mip Maps(交叉淡化Mip贴图) - 级别递减时使Mipmap淡化为灰色

纹理平铺拉伸参数

参数 描述 选项及说明
Wrap Mode(贴图间拼接模式) 平铺纹理时的方式。可通过创建四边形面片、材质,拖拽图片,修改平铺拉伸参数和材质的平铺 XY 及偏移来查看效果 Repeat(重复):在区块中重复纹理
Clamp(钳制):拉伸纹理的边缘
Mirror(镜像):在每个整数边界上镜像纹理以创建重复图案
Mirror Once(镜像一次):镜像纹理一次,然后将拉伸边缘纹理
Per - axis(每轴):单独控制如何在 U 轴和 V 轴上包裹纹理
Filter Mode(过滤模式) 纹理在通过 3D 变化拉伸时的过渡方式 Point(点):纹理在靠近时变为块状
Bilinear(双线性):纹理在靠近时变得模糊,一般常用此模式
Trilinear(三线性):与 Bilinear 类似,但纹理也在不同的 Mip 级别之间模糊
Aniso Level 以大角度查看纹理时提高纹理质量,但性能消耗高 -

纹理平台打包相关参数

参数 描述 选项及说明
Max Size(最大尺寸) 设置导入纹理的最大尺寸,可将美术提供的大尺寸图片限制在一定范围内,一般选择 2048 -
Resize Algorithm(重设大小算法) 当纹理尺寸大于指定的 Max Size 时,用于缩小纹理的算法 Mitchell:默认米切尔算法,是常用的尺寸缩小算法
Bilinear:使用双线性插值调整大小,对于细节重要的图片,比米切尔算法保留更多细节
Format(格式) 纹理格式,各平台支持的格式不同,若选择 Automatic,会根据平台使用默认设置 都支持的格式
移动端和网页端特有格式
iOS:选择默认的纹理压缩设置 (PVRTC) 可获得更大兼容性;若应用程序不包含 OpenGL ES 2 支持,可选择 ASTC 格式,该格式质量更好、灵活性更高且压缩速度比 PVRTC 快
Android:因安卓设备众多且标准不一,一般会根据不同设备标准制作多个安装包。
- 构建以 OpenGL ES 3 为目标的 APK:访问 Android 的 Player Settings(菜单:Edit > Project Settings >Player Settings,然后选择 Android 类别),向下滚动到 Graphics APIs 部分,确保 OpenGL ES 2 不在列表中,然后构建 APK(菜单:File > Build Settings,然后单击 Build)
- 构建以 OpenGL ES 2 为目标的单独 APK:访问 Android Player Settings,向下滚动到 Graphics APIs 部分,在列表中添加 OpenGL ES 2 并删除 OpenGL ES 3 和 Vulkan,然后构建 APK
Compression(压缩) 选择纹理的压缩类型,帮助 Unity 正确选择压缩格式,会根据平台和压缩格式的可用性进行压缩 None(无):不压缩纹理
Low Quality(低质量):以低质量格式压缩纹理
Normal Quality(法线质量):以标准格式压缩纹理
High Quality(高质量):以高质量格式压缩纹理,一般选择高质量
Use Crunch Compression(使用 Crunch 压缩) 启用后,使用 Crunch 压缩,Crunch 是一种基于 DXT 或 ETC 纹理压缩的有损压缩格式,特点是压缩时间长,解压速度快 -
Split Alpha Channel(拆分 Alpha 通道) Alpha 通道分离,可节约内存,会把一张图分成两张纹理,一张包含 RGB 数据,一张包含 Alpha 数据,渲染时再合并渲染 -
Override ETC2 fallback(覆盖 ETC2 回退) 在不支持 ETC2 压缩的设备上使用的格式 -

SpriteEditor精灵编辑器

Single 图片编辑功能

功能 描述
Sprite Editor 基础图片设置 Name:设置图片名称。
Position:调整图片在其中的偏移位置以及宽高。
Border:设定九宫格的 4 条边。
Pivot:确定轴心(中心)点的位置。
Pivot Unit Mode:
Normalized:标准化模式,取值在 0 至 1 之间。
Pixels:像素模式,显示当前轴心在图片中的像素位置。
Custom Pivot:自定义轴心点。
Custom Outline 自定义边缘线(决定渲染区域) 可自定义精灵网格的轮廓形状。默认在矩形网格上渲染,边缘外部透明区域会被渲染,存在性能浪费。通过自定义轮廓,可缩小透明区域,提升性能。
Snap 捕捉:使控制点贴近最近的像素,默认选择该选项。
Outline Tolerance:控制轮廓点的复杂性和准确性,取值范围 0 至 1,值越大,轮廓点越多,越准确。
Generate:生成网格轮廓,可手动编辑点,修改后需应用。
Custom Physics Shape 自定义物理形状(决定碰撞判断区域) 用于自定义精灵图片的物理形状,主要针对需要物理碰撞判断的 2D 图形,确定碰撞检测区域,其参数和操作与自定义边缘线基本相同。
Skinning Editor 皮肤编辑器 暂不讲解,后续涉及。
Secondary Textures 辅助纹理(为图片添加特殊效果) 可将其他纹理与该精灵图片关联。点击加号添加关联图片作为辅助纹理并命名,着色器可利用这些辅助纹理进行效果处理,赋予精灵其他效果。

Multiple 图集元素分割

当图片资源为图集时,需将模式设为 Multiple,借助 Sprite Editor 进行图集元素分割:

操作 描述
切片操作 在 Sprite Editor 窗口中,选中要删除的切片按 Delete 键删除;也可按住鼠标左键用选择框进行切片。若 Delete 键无法删除,可将框移至空白处,点击 Trim 剪裁来删除。
切片设置 选中切片可设置其信息,与 Single 模式下图片编辑类似,设置好后可抠出切片图使用。编辑参数后选择切片进行切割,若切割不准确可手动调整,切割后可通过下拉按钮查看切割后的图,可用于制作动画帧图。
分割参数讲解 Slice Type 切片类型:
Automatic 自动分割:
Pivot 轴心:设置单张图片轴心点位置。
Custom Pivot 自定义轴心点:自定义轴心点。
Method 方法:
Delete Existing 删除现有:替换已选的任何矩形。
Smart 聪明:尝试创建新矩形并保留或调整现有矩形。
Safe 安全:添加新矩形而不改变已存在的矩形。
Grid By Cell Size 按单元格大小分割:仅适用于规范矩形图集。
Pixel Size 像素大小:设置单元格宽高。
Offset 偏移:设置左上角偏移位置。
Padding 填充:设置与边缘的偏移位置以及矩形间的偏移缝隙。
Keep Empty Rects:决定是否保留空矩形,一般不勾选。
Grid By Cell Count 按单元格数量分割:设置 Column & Row(行列数)。
Trim 剪裁:选中切片单元格,可自动去除单元格上多余的透明部分。

Polygon 多边形编辑

若使用的资源是多边形资源,可将模式设为 Polygon,在 Sprite Editor 中进行快捷设置,但实际开发中较少使用:

操作 描述
多边形编辑参数 点击更改形状,可设置边数,范围在 3 至 128 之间。自定义边缘线会自动生成渲染范围,仅显示圈定的图形。需注意,设置为 Polygon 多边形后再改回 Single 模式,需重新选择自定义边缘线生成,否则会保留上次的边缘线。

Animator

Animator 动画器组件参数说明

参数 描述 选项及说明
Controller(控制器) 对应的动画控制器(状态机) -
Avatar(替身) 对应的替身配置信息(在讲解 3D 模型时详细讲解) -
Apply Root Motion(应用根运动) 是否启用动画位移更新 若启用,动画中的位移信息会更新物体的位置;若不启用,物体位置不受动画位移影响
UpdateMode(更新模式) 一般不修改该参数 Normal(正常更新):按照正常的游戏更新循环进行动画更新
Animate Physics(物理更新):与物理系统同步更新动画,适用于动画与物理交互的场景
Unscaled Time(不受时间缩放影响):动画更新不受 Time.timeScale 的影响,即使游戏时间被缩放,动画仍按正常速度播放
Culling Mode(裁剪剔除模式) - Always Animate(始终播放动画):无论物体是否在屏幕内,动画都会持续播放,不会被剔除
Cull Update Transforms(裁剪更新变换):当摄像机没有渲染该物体时,停止对物体位置、IK(反向运动学)的写入操作,但动画本身可能仍在运行
Cull Completely(完全裁剪):当摄像机没有渲染物体时,整个动画被完全禁用,不进行任何计算和更新

Animator 动画器代码控制

获取 Animator 组件

// 我们用代码控制状态机切换主要使用的就是Animator提供给我们的API
// 我们知道一共有四种切换条件 int float bool trigger
// 所以对应的API也是和这四种类型有关系的
Animator animator = this.GetComponent<Animator>();

Animator.SetXXX 方法:通过状态机条件切换动画

// 通过状态机条件切换动画

// 设置动画参数状态
// 设置浮点数类型的动画参数
animator.SetFloat("条件名", 1.2f); 
// 设置整数类型的动画参数
animator.SetInteger("条件名", 5); 
// 设置布尔类型的动画参数
animator.SetBool("条件名", true); 
// 设置触发类型的动画参数
animator.SetTrigger("条件名"); 

Animator.GetXXX 方法:获得动画参数状态

// 获得动画参数状态
// 获取浮点数类型的动画参数值
animator.GetFloat("条件名"); 
// 获取整数类型的动画参数值
animator.GetInteger("条件名"); 
// 获取布尔类型的动画参数值
animator.GetBool("条件名"); 

// 直接切换动画(除非特殊情况,不然一般不使用)
// 注意:状态名和动画名不一样,动画名拖进来默认名字就是状态名,但是可以修改得和动画名不一样
animator.Play("状态名"); 

Animator 窗口中动画状态设置相关参数

参数 描述 选项及说明
Motion(运动) 分配给此状态的动画剪辑 -
Speed(速度) 动画的默认速度 -
Multiplier(乘数) 控制速度的乘数,需勾选 Parameter 选中配合的 float 类型参数才能使用 -
Motion Time(运动时间) 运动的时间,需勾选 Parameter 选中配合的 float 类型参数才能使用,一般是 0 - 1 的数字。使用该参数后动画不会自动播放,需设置参数值才会动,如设置成 0.1,动画就卡在进度播放到 0.1 的位置,在 Update 中不断加大参数值可一帧一帧播完动画 -
Mirror(镜像) 是否为状态生成镜像,仅适用于人形动画,若配合参数使用需选中旁边的 Parameter 关联 bool 类型参数 -
Cycle Offset(周期偏移) 循环偏移时间,若配合参数使用需选中旁边的 Parameter 关联 float 类型参数。如填 0.5,动画就会从中间位置开始播放 -
Foot IK(脚步反向动力学) 是否遵循 Foot IK,适用于人形动画 -
Write Defaults(写入默认值) AnimatorStates 是否为其运动执行未动画化的属性写回默认值,默认勾选 -
Solo(单独播放) 仅播放该过渡,条件都满足的动画优先切换选择了 Solo 的动画 -
Mute(静音) 禁用过渡,就算条件满足也不切换,Solo 和 Mute 一起选择时,Mute 优先执行 -
Add Behaviour(添加行为) 添加状态机行为脚本,之后会专门讲解 -

Animator 窗口中动画过渡设置相关参数

参数 描述 选项及说明
连线名 为动画过渡改名,若不改对应的名字就是”某一状态名”->”某一状态名”,一般不改 -
Has Exit Time(是否有退出时间) 若勾选,当切换动画时,动画一定是播放到下方的 Exit Time(百分比)的时间时才过渡到下一个动画;若希望立刻切换动画,可不勾选该选项 -
Exit Time(退出时间) 当选择上方的 Has Exit Time 时,该值决定了过渡生效的确切时间。该值可以大于 1,若小于 1,比如 0.85,表示当动画播放到了 85%的动画时,就会过渡;若大于 1,比如 4.5,那么动画将循环 4.5 次后过渡到下一个动画 -
Fixed Duration(固定持续时间) 选中后,下方的 Trnaition Duration 过渡持续时间将以秒为单位解读过渡时间;若不选中,则以百分比解读过渡时间 -
Transition Duration(s/%)(过渡持续时间) 从该状态切换到下一状态的过渡动画持续的时间,对应下方两个蓝色箭头包裹区域 -
Transition Offset(过渡偏移) 过渡到目标状态的起始播放的时间偏移。如果是 0 则从要切换到的目标状态开头开始播放,如果是 0.5 则从要切换到的目标状态的一半开始播放,可理解为切入下一个状态的切入点 -
Interruption Source(中断源) 该过渡中断的情况:
None:不在添加任何过渡
Current State:将当前状态过渡排队
Next State:使下一个状态的过渡进行排队
Current State Then Next State:将当前状态过渡和下一个状态过渡依次排队
Next State Thne Current State:将下一状态过渡和当前状态过渡依次排队
-
Ordered Interruption(有序中断) 当前过渡是否可在不考虑顺序的情况下被其它过渡中断:
选中时,找到有效过渡或当前过渡时,会中断
不选中时,找到有效过渡,会中断
-
Conditions(过渡条件) 如果没有过渡条件,只会考虑 Exit Time -
Can Transition To self(是否可以过渡到自己) 是否可以过渡到自己,一般取消勾选 -
Preview source state(预览源状态) 预览各种过渡状态,可以查看从任意状态切换到当前状态的过渡效果 -

动画分层和遮罩

参数 描述 选项及说明
Weight(权重) 当动画同时播放且为叠加状态时,根据权重决定叠加的比例 -
Mask(动画遮罩) 该层动画全部受此遮罩影响,需创建遮罩文件并赋值给该参数。遮罩文件可设置不受影响的区域,动画播放时该区域无效果,类似模型文件 Animation 页签下的选项效果,但只影响这一层 -
Blending(混合方式) Override:覆盖方式,播放该层动画时忽略其他层信息
Additive:叠加方式,会和其它层动画叠加播放
-
Sync(是否同步其它层) 主要用于直接从另一个层复制状态过来并在该层中修改。适用于正常状态和受伤状态等动作改变的情况。选择后会多一个 Source Layer 表示要复制哪一层的状态,如复制普通层 1 并修改动画选项为蹲下的待机和走路,调大这一层的权重就会播放蹲下的待机和走路 -
Timing(源层) 当选中 Sync 同步其它层时激活。
选中:采用折中方案调整同步层上的动画时长(基于权重计算)
不选中:动画时长将使用原始层做为母版
-
IK Pass(IK 处理) 反向动力学 -

动画融合树

动画 1D 混合
参数 描述 选项及说明
Parameter(参数) 用于控制混合的参数,在参数列表中的参数。蓝色图像可控制 n 个动画的阈值,调整红色指针可在预览窗口查看动画混合情况 例如,调整代表 Speed 参数数值的红色指针,0 时动画完全是默认,0.25 是走路和默认结合,0.5 是完全走路,0.75 是走路和跑步结合各一半,1 是完全跑步
Motion(关联的动画列表) 可使用鼠标改变顺序 -
Threshold(对应动作的临界阈值) 当等于这个值时动作权重最大(完全播放该动作),数值范围不定,需取消勾选 Automate Thresholds 才能手动设置 -
控制动作的播放速度 - -
是否镜像动作 - -
Automate Thresholds(是否自动设置阈值) 会在取值范围内平均分,一般取消勾选以手动控制更准确 -
Compute Thresholds(计算阈值的方式) 从动画剪辑的根运动中获取数据,包括 Speed(速度)、Velocity X、Y、Z(xyz 上的分速度)、Angular Speed(Rad 、Deg)(角度或者弧度表示的角速度) 例如,动画剪辑行走动画时 Speed 速度是 1.5 个单位每秒,慢跑是 2.3 个单位每秒,快跑是 4 个单位每秒,阈值就会根据这些值来进行设置进行混合
Adjust Time Scale(调整时间刻度) Homogeneous Speed:均匀速度
Reset Time Scale:重置时间刻度
-
动画2D 混合
种类 描述 使用场景
2D Simple Directional(2D 简单定向模式) 运动表示不同方向时使用 比如向前、后、左、右走,若只有一个动作用此模式
2D Freeform Directional(2D 自由形式定向模式) 运动表示不同方向时使用,可在同一方向上有多个运动 比如向前跑和走,若一个方向上有走路和跑步用此模式
2D Freeform Cartesian(2D 自由形式笛卡尔坐标模式) 运动不表示不同方向时使用 比如向前走不拐弯、向前跑不拐弯、向前走右转、向前跑右转
Direct(直接模式) 自由控制每个节点权重 一般用于做表情动作等

2D 混合的使用:大体上和 1D 混合相似,只是多关联了一个参数,关联的动画也多设置了一个预制。拖动蓝色框上的红点(类似 1D 混合的红色指针)或混合树的进度条可修改参数值查看效果。

模型导入

Model模型页签

Scene 场景相关设置
参数 描述 选项及说明
Scale Factor(缩放系数) 当模型比例不符合项目预期时,修改此值可改变模型全局比例。Unity 物理系统希望游戏世界 1 米在导入模型文件中为 1 个单位 -
Convert Units(转换单位) 启用后可将模型文件定义的比例转换为 Unity 的比例 不同格式比例:
- .fbx、.max、.jas = 0.01
- .3ds = 0.1
- .mb、.ma、.lxo、.dxf、.blend、.dae = 1
Import BlendShapes(导入 BlendShapes) 是否允许 Unity 随网格导入混合形状,导入含混合形状的网格时用 Skinned MeshRenderer 组件 注意:
- 导入混合形状需 FBX 文件有平滑组
- 若导入有法线的混合形状,需将 Blend Shape Normals 属性设为 Import 用 FBX 法线信息,或设为 Calculate 让 Unity 计算法线
Import Visibility(导入可见性) 是否导入可见性,开启可从 FBX 文件读取可见性属性 一些 3D 建模软件对可见性属性有限制,需根据软件决定是否勾选,一般可不勾选
Import Cameras(导入相机) 是否导入 FBX 文件中的摄像机,Unity 支持部分摄像机属性 一般不勾选
Import Lights(导入灯光) 是否导入光源,支持多种光源类型和属性 一般不使用
Preserve Hierarchy(保持层次结构) 始终创建一个显示预制体根 若多个 FBX 文件含同一层级空根对象,勾选可保留它们,避免层级不匹配影响动画播放
Sort Hierarchy By Name(按名称对层级视图排序) 在层级窗口根据名字排序子物体 不启用则保留 FBX 文件定义的层级顺序
Meshes 网格相关设置
参数 描述 选项及说明
Mesh Compression(网格压缩) 设置压缩比减小网格文件大小,提高压缩比降低网格精度 - Off:不压缩
- Low:低压缩比
- Medium:中等压缩比
- High:高压缩比
Read/Write Enabled(读/写已启用) 是否开启读写网格信息 开启:Unity 传网格数据给 GPU 后,CPU 保留可寻址内存,可通过代码访问处理;关闭:传数据给 GPU 后,删除 CPU 可寻址内存中网格数据。开启场景:
- 需要在代码中读写网格数据
- 需要运行时合并网格
- 需要使用网格碰撞器
- 需要运行时用 NavMesh 构建组件烘焙 NavMesh 等
Optimize Mesh(优化网格) 确定三角形在网格中列出的顺序以提高 GPU 性能 - Nothing:无优化
- Everything:对顶点及多边形顶点索引重新排序
- Polygon Order:仅对多边形重新排序
- Vertex Order:仅对顶点重新排序
Generate Colliders(生成碰撞器) 启用后自动附加网格碰撞器导入网格 建议不移动的环境几何体开启,移动的几何体不开启
Geometry 几何体相关设置
参数 描述 选项及说明
Keep Quads(保留四边形) 启用后,Unity 不将 4 个顶点的多边形转为三角形 使用曲面细分着色器时可能需启用,顶点数超四的多边形始终转为三角形。有四边形和三角形的网格,Unity 会创建两个子网格分离它们
Weld Vertices(焊接顶点) 合并空间中共享相同位置且属性相同的顶点 开启可减少网格顶点计数优化网格,除非想保留重复顶点用于代码处理,一般开启
Index Format(索引格式) 网格索引缓冲区的大小 一般选 16bits,Auto 可能默认选 16bits,必要时用 32bit,16bits 通用且节约内存
Legacy Blend Shape Normals(旧版混合形状法线) 启用后基于 Smoothing Angle 值计算法线 -
Normals(法线) 定义如何计算法线 - Import:从文件导入法线,文件无则用 Calculate 模式计算
- Calculate:根据 Normals Mode、Smoothness Source 和 Smoothing Angle 属性计算
- None:不计算法线
Blend Shape Normals(混合形状法线) 定义如何为混合形状计算法线,仅当 Legacy Blend Shape Normals 禁用时出现 -
Normals Mode(法线模式) 计算法线的模式,仅当 Normals 设为 Import 或 Calculate 时出现 - Unweighted Legacy:2017.1 版本前计算法线的方式,之前导入的 FBX 模型默认设置
- Unweighted:法线不加权重
- Area Weighted:法线按图面面积加权重
- Angle Weighted:法线按每个图面上的顶角加权重
- Area And Angle Weighted:法线按图面面积和顶角加权重,默认选项
Smoothness Source(平滑度源) 确定平滑的方式,仅当 Legacy Blend Shape Normals 禁用时出现 - Prefer Smoothing Groups:尽可能用模型文件中的平滑组
- From Smoothing Groups:仅用模型文件中的平滑组
- From Angle:用 Smoothing Angle 值确定平滑边
- None:不拆分硬边的任何顶点
Smoothness Angle(平滑角度) 控制是否为硬边拆分顶点,值越大顶点越少 仅当 Normals 设为 Calculate 时可用,仅用于非常光滑或复杂的模型,否则建议在 3D 建模软件中手动平滑后导入
Tangents(切线) 定义如何导入或计算顶点切线,仅当 Normals 设为 Calculate 或 Import 时可用 - Import:Normals 为 Import 时,从 FBX 文件导入顶点切线,无切线则无法用法线贴图着色器
- Calculate Legacy:用旧版算法计算切线
- Calculate Legacy With Split Tangents:用旧版算法计算切线并在 UV 图表上拆分,网格接缝影响法线贴图光照时使用
- Calculate Mikktspace:用米克特空间计算切线
- None:不导入顶点切线,无切线则无法用法线贴图着色器
Swap UVs(交换 UVs) 在网格中交换 UV 通道,漫反射纹理使用光照贴图中的 UV 时使用 -
Generate Lightmap UVs(生成光照贴图 UVs) 为光照贴图创建第二个 UV 通道 -

Rig操纵骨骼页签

Animation Type(动画类型)
类型 描述
None(不存在动画) 主要用于环境静态模型,如石头等。
Humanoid(人形模型) 一般有头和四肢(一个头、两条腿、两只手)的模型视为人形模型,需要使用 Avatar 化身系统,绑定人体主要关节的映射关系。
- Avatar Definition(选择获取 Avatar 定义的位置):
- No Avatar:没有化身系统信息。
- Create From This Model:根据此模型创建 Avatar 化身信息。
- Copy from Other Avatar:指向另一个模型上设置的 Avatar 化身信息,需指定 Source(复制另一个具有相同骨架的 Avatar 化身信息以导入其动画剪辑)。
- Skin Weights(蒙皮权重):设置影响单个顶点的最大骨骼数量。
- Standard(4 Bones)标准:使用最多 4 个骨骼产生影响,出于性能考虑,建议使用此设置。
- Custom 自定义:可设置自定义的最大骨骼数,选择后会出现以下选项:
- Max Bones/Vertex:定义每个顶点的最大骨骼个数,值越大性能消耗越大。
- Max Bone Weight:设置考虑骨骼权重的最低阈值,权重计算时将忽略小于此值的内容。
- Optimize Game Objects(优化游戏对象):在 Avatar 化身系统和 Animator 动画组件中删除和存储所导入角色的游戏对象骨骼层级信息。启用后会出现 Extra Transforms to Expose 选项,角色将使用 Unity 动画系统的内部骨架,可提高动画角色的性能,一般不勾选。
- Extra Transforms to Expose(要暴露的额外变换):要公开的骨骼层级,可在下方打钩公开该骨骼层级信息。有放大镜(通过名称搜索对应骨骼信息)、Toggle All(全选或者反选)、Collapse All(全部折叠)、Expand All(全部展开)等操作。
Generic(通用模型,非人形模型) 不是标准的人形模型,形状任意,如可能有 8 只腿、两个头等。这种模型主要需要设置骨骼根节点。Root Node(根节点):选择用于此 Avatar 的根节点的骨骼(仅当选择 Create From This Model 才会出现)。
Legacy(旧版动画类型) 与 Unity3.x 及更早版本导入和使用动画,一般不使用。
Muscles&Settings(肌肉与设置)
  • Muscle Group Preview(肌肉群预览):可预览不同姿势的旋转变化,观察之前的关联映射关系是否合理,主要起预览作用,可拖拽关节点查看关节旋转效果。
  • Per - Muscle Settings(肌肉设置):用于设置各骨骼在旋转时的范围限制,避免在极限角度出现奇怪效果,可单独设置限制范围。
  • Additional Settings(高级设置):可以设置手脚的扭转和伸展值,一般不修改。其中 Translation DoF 比较重要:
    • 如果启用,将启用人形角色的移动动画,可进行骨骼的位置移动,但可能导致其他骨骼拉长。
    • 如果禁用,Unity 仅使用旋转对骨骼进行动画化。启用后会提升性能消耗,因为动画需要执行额外步骤来重定向人形动画,除非动画包含角色某些骨骼的动画式移动,否则一般禁用。
  • Muscles 肌肉下拉框:可重置所有设置。

CharacterController角色控制器

角色控制器的概念

角色控制器是一种用于控制角色的组件,它使角色受制于碰撞,但不会像刚体那样产生一些奇怪的表现。例如,使用刚体判断碰撞时,角色可能在斜坡上往下滑动,或者在碰撞时被撞飞等,而角色控制器能让角色表现得更加稳定。Unity 提供了专门的角色控制器组件来实现这一功能。

注意:添加角色控制器后,无需再添加刚体,并且它能检测碰撞函数和触发器函数。

角色控制器的使用

使用角色控制器时,建议取消 Animator 组件上的根运动,以避免与角色控制器的控制产生冲突,确保角色运动的稳定性和可控性。

角色控制器组件参数

参数 描述 说明
Slope Limit(斜度限制) 坡度度数限制,大于该值的斜坡角色无法上去 -
Step Offset(每步偏移量) 台阶偏移值,单位为米,低于这个值的台阶角色才能上去,且该值不能大于角色控制器的高度 -
Skin Width(蒙皮宽度) 皮肤的宽度,即两个碰撞体可以穿透彼此的最大宽度。较大的值可减少抖动,较小的值可能导致角色卡住,建议设置为半径的 10%,通俗理解为角色可以和刚体穿模的程度 -
MinMoveDistance(最小移动距离) 大多数情况下为 0,可用于减少抖动 -

角色控制器代码控制

CharacterController.isGrounded 变量:用于判断在上次移动期间 CharacterController 是否接触地面。

// CharacterController中的isGrounded变量 是否接触了地面
// 在上次移动期间 CharacterController 是否接触地面?
if (characterController.isGrounded)
{
    print("接触地面了");
}

CharacterController.SimpleMove 方法:使角色受重力作用进行移动,以指定的速度移动角色。

// CharacterController中的SimpleMove方法 受重力作用的移动
// 以 speed 移动该角色。
characterController.SimpleMove(Vector3.forward * 10 * Time.deltaTime);

CharacterController.Move 方法:让角色进行不受重力作用的移动,为 GameObject 的移动提供附加的 CharacterController 组件。

// CharacterController中的Move方法 不受重力作用的移动
// 为 GameObject 的移动提供附加的 CharacterController 组件。
characterController.Move(Vector3.forward * 10 * Time.deltaTime);

碰撞和触发检测函数

OnControllerColliderHit 函数:当角色控制器与别的碰撞器产生碰撞时调用该函数。

// 当角色控制器想要判断和别的碰撞器产生碰撞时 使用该函数
private void OnControllerColliderHit(ControllerColliderHit hit)
{
    print("角色碰撞器发生碰撞" + hit.collider.gameObject.name);
}

OnCollisionEnter 方法:对于角色控制器无效,不会被调用。

// OnCollisionEnter方法对角色控制器没用 
// private void OnCollisionEnter(Collision collision)
// {
//     print("碰撞触发");
// }

OnTriggerEnter 方法:角色控制器可以检测触发器,当进入触发器时该方法会被调用。

private void OnTriggerEnter(Collider other)
{
    print("触发器触发");
}

导航寻路系统

导航网格生成

Object 场景对象设置页签:设置参与寻路烘焙的对象。
参数 描述 选项及说明
Sceme Filter(场景过滤器) 配合 Hierarchy 窗口使用,筛选对象 All:显示场景上所有对象
MeshRenderers:显示挂载的网格渲染器的对象
Terrains:显示挂载了地形脚本的对象
Navigation Static(导航静态物体开关) 若想对对象进行地形数据生成,需打开此选项,打开对象上的这个开关实际是打开静态下的导航静态 -
Generate OffMeshLinks(生成网格连接点开关) 用于两个地形断开但想实现跳跃过去的情况,打开对象上的这个开关实际是打开静态下的网格连接静态 -
Navigation Area(导航区域选择) 配合 Areas 页签使用 -
Bake 导航数据烘焙页签:设置寻路网格具体信息,点击烘焙后,场景中生成的蓝色部分为可行走区域,需设置有对象为导航静态才能烘焙成功。
参数 描述 说明
Agent Radius(代理半径) 决定烘焙边缘精确度,控制平台可行走区域和边缘可行走区域,可理解为人物半径 半径越小,烘焙出来能走的地方越多
Agent Height(代理高度) 决定烘焙高度精确度,控制拱桥是否可以穿越,可理解为人物高度 高度越小,能穿过的拱桥越多,烘焙出来能走的地方越多
Max Slope(最大坡度) 斜坡度数,决定斜坡是否可以行走,影响斜坡的烘焙 若场景里的斜坡大于最大坡道,角色将无法上去
Step Height(步高) 最小楼梯高度,决定台阶是否可以行走,影响台阶的烘焙 若场景里的台阶高度大于步高,角色将无法上去
Generated off mesh Links(生成分离网格链接) 生成非网格连接,用于两个分开的网格之间的连接相关设置,需在 Object 场景对象设置页签中打开 Generate OffMeshLinks 生成网格连接点开关,且注意下面两个变量也要设置,否则可能不生成 -
Drop Height(掉落高度) 角色可以从这个高度掉下来 -
Jump Distance(跳跃距离) 决定不同平面上的跳跃距离,小于这个距离内角色可以跳过 -
Advanced(高级) Manual Voxel Size(手动设置立体像素大小):开启后可设置立体像素大小,控制烘焙的准确度,立体像素大小描述了生成的导航网格表示场景几何体的准确程度。注意立体像素大小减半会使内存使用量增加 4 倍,构建时间也增加 4 倍,一般情况下不需要修改,除非想要极其准确的导航网格
Voxel Size(像素大小):配合 Manual Voxel Size 使用
Min Region Area(最小区域面积):当面积小于此处值的导航网格区域会被移除
Height Mesh(高度网格构建开关):主要用来解决楼梯烘焙为斜坡时,希望在楼梯表面的位置准确放置在楼梯平面上,而不是斜坡上,启用它会增加烘焙时间
-
Areas 导航地区页签:设置对象的寻路消耗,配合 Object 页签使用。
参数 描述 说明
Name(区域名字) 区域的名称 -
Cost(成本 寻路消耗) 寻路消耗,可以自己新加一个导航区域,然后去 Object 页签选择 调高寻路消耗成本会影响寻路结果,例如将水的寻路消耗调高,对象就会绕着水路走
  • Agent Type(代理类型):配合 Agents 页签使用。
  • Base Offset(基础偏移值):相对对象轴心点的高度偏移,即改变圆柱体位置。
Steering(转向 移动设置)
参数 描述 说明
Speed(寻路时的最大移动速度) 寻路时的最大移动速度(世界单位/秒) -
Angular Speed(寻路时转身的最大旋转速度) 寻路时转身的最大旋转速度(度/秒) -
Acceleration(最大加速度) 最大加速度(世界单位/平方秒) -
Stopping Distance(停止距离) 当靠近目标点多少距离时,停止运动 -
Auto Braking(自动制动) 启用后,当到达目标时将减速,若存在连续移动(如巡逻移动)建议不要开启该选项 -
Obstacle Avoidance(障碍躲避 避障设置)
参数 描述 说明
Radius(半径) 用于计算障碍物和其它寻路对象之间的碰撞 -
Height(高度) 通过头顶障碍物时用于计算高度间隙使用 -
Quality(障碍躲避品质) 越高躲避障碍越准确,但性能消耗较大。若不想主动避开其它动态障碍,可设置为无,则只会解析碰撞 -
Priority(优先级) 0~99,避障时,数字较小的障碍物表示较高的优先级,优先级低的会忽略避障 -
Path Finding(寻路 路径寻找规则)
参数 描述 说明
Auto Traverse OffMesh Link(自动通过分离网格连接) 是否开启自动遍历网格外的其它网格连接,若要自定义判断,则关闭此功能 -
Auto Repath(自动重新寻路) 是否开启自动重设路线,开启后,当到达路径后段时会再次尝试寻路,当没有到达目标的路径时,会生成一条到达与目标位置最近的可达点,默认勾选 -
Area Mask(寻路时考虑的区域) 若寻路时不想考虑某些区域,则取消选中,常见于塔防游戏 -

常用内容

方法/变量 描述 代码示例
NavMeshAgent.SetDestination 方法 自动寻路设置目标点,传入 Vector3 变量,设置或更新目标,从而触发新路径计算 navMeshAgent.SetDestination(targetPosition);
NavMeshAgent.isStopped 变量 停止寻路,此属性持有导航网格代理的停止或恢复条件 navMeshAgent.isStopped = true;

不常用内容

方法/变量 描述 代码示例
NavMeshAgent.speed 变量 遵循路径时的最大移动速度 print(navMeshAgent.speed);
NavMeshAgent.acceleration 变量 代理遵循某一路径时的最大加速度,以单位/秒² 表示 print(navMeshAgent.acceleration);
NavMeshAgent.angularSpeed 变量 遵循路径时的最大回转速度(以 deg/ s 为单位) print(navMeshAgent.angularSpeed);
NavMeshAgent.hasPath 变量 代理当前是否有路径(只读) if (navMeshAgent.hasPath) { ... }
NavMeshAgent.destination 变量 代理目标点,可以设置也可以得到,获取代理在世界坐标系单位中的目标或尝试设置代理在其中的目标 Vector3 target = navMeshAgent.destination;
NavMeshAgent.path 变量 获取和设置当前路径的属性 NavMeshPath currentPath = navMeshAgent.path;
参数 描述 选项及说明
Start(起始点) 连接的起始位置 -
End(结束点) 连接的结束位置 -
Cost Override(成本覆盖) 覆盖消耗值。若为负数或 0,则使用所属 Area 区域中的消耗值,即两岸上烘焙区域的寻路成本;若为正数,则使用 Area 区域寻路消耗值乘以该正数作为该连接点的寻路消耗,可自定义连接点的寻路消耗 主要用于解决当存在“步行”路径和连接点都能到达某一目标时的路径选择问题。例如有两个连接桥,可通过比较该参数,优先选择成本消耗更低的路径
Bi Directional(双向) 是否开启双向连接点。开启后连接可从 Start 到 End,也能从 End 到 Start;关闭时则只能从 Start 到 End -
Activated(已激活) 是否启用该连接点。若关闭,自动寻路时该连接点相当于失效 -
Auto Update Positions(是否自动更新位置) 如果启用,当开始和结束位置改变时,导航网格也将更新;如果不启用,即使改变了开始和结束位置,仍会按照刚开始的位置进行计算,主要用于运行时修改路径 -
参数 描述 选项及说明
Shape(动态障碍的形状) 动态障碍物的形状类型 Capsule:胶囊
Box:盒装
Carve(切割 是否开启雕刻功能) 是否开启雕刻功能。开启后,障碍物会在导航网格中挖一个孔,生成对应的网格信息,使该区域被认为无法前往;若动态障碍物是固定不动的,建议开启,如门、木桶、栅栏等;若动态障碍物是频繁移动的,建议不开启,如汽车和玩家 -
Move Threshold(移动阈值) 当障碍物移动超过该距离时,会被认为处于移动状态,进而更新移动的孔 -
Time To Stationary(静止时间) 障碍物作为静止状态需要等待的时间,单位为秒。当静止时间超过该值,才会被认为真正静止 -
Carve Only Stationary(仅在静止时切割) 只有在障碍物处于静止状态时才会计算孔 -


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏