一、认识模型的制作过程
1、建模
美术同学通过建模软件(3Dmax或Maya等等用一个个的面片像捏泥人一样将模型制作出来
面片:3点构成一个面,面的最小单位是三角形建模时可以使用3点以上的面但是建议都使用三角面
网格信息:一般指的就是模型的这些顶点面片信息
说人话:建模其实就是用三角面组装拼凑捏泥人
2、展UV
UV是纹理贴图坐标的简称,它有U轴和V轴类似空间中的xyz轴。纹理坐标中的每一个点都和3D模型上的位置信息是相互联系的
展UV就好像是把做好的3D模型平铺到一张2D图片上,并且把这张图片上对应位置的信息和3D模型上位置信息对应起来,为之后给模型上色做准备
说人话:展UV就好像把一张纸做的立方体拆开变成一张纸
3、材质和纹理贴图
纹理: 一张2D图片
贴图: 把纹理通过UV坐标映射到3D物体表面
纹理贴图: 代指模型的颜色信息、UV信息等等
材质: 模型的表现,通过纹理贴图提供的信息使用不同的着色器算法,呈现出不同的表现效果比如:金属、塑料、玻璃、透明等等效果
着色器: Shader就是着色器,它决定了材质的表现效果
4、骨骼绑定
完成前三步后,模型就制作完成了接着如果想让模型能够栩栩如生的动起来首先要进行骨骼绑定
骨骼绑定就是为模型定义骨骼信息定义骨骼控制哪些网格信息
5、动画制作
骨骼绑定完成后我们就可以利用这些骨骼的旋转来制作3D动画了在一条时间轴上,制作关键帧的位置,通过一些规则决定从上一关键帧到这一关键帧的变化应该如何过渡不停的制作关键帧就可以制作出最终的动画效果
6、总结
美术工种--建模
第一步:建模--三角面片拼凑模型
第二步:展UV--展开模型的网格到平面上产生映射关系
第三步:材质和纹理贴图-使用UV信息画贴图选择材质出效果
美术工种--动作
第四步:骨骼绑定--对模型进行骨骼关联
第五步:动画制作--利用模型骨骼制作动画
二、图片导入相关
1、Unity支持图片格式
unity支持的图片格式有很多
BMP:是windows操作系统的标准图像文件格式,特点是几乎不进行压缩,占磁盘空间大
TIF:基本不损失图片信息的图片格式,缺点是体积大
JPG:一般指JPEG格式,属于有损压缩格式,能够让图像压缩在很小的存储空间,一定程度上会损失图
PNG:无损压缩算法的位图格式,压缩比高,生成文件小,有透明通道
TGA:支持压缩,使用不失真的压缩算法,还支持编码压缩。体积小,效果清晰,兼备BMP的图像质量和JPG的体积优势,有透明
PSD:是Photoshop(Ps)图形处理软件专用的格式,通过一些第三方工具或自制工具可以直接将PSD界面转为UI界面
其它还支持
EXR、GIF、HDR、IFF、PICT等等
其中unity最常用的图片格式是
JPG、PNG、TGA三种格式
2、参数设置-纹理类型
①、Default:默认纹理,大部分导入模型都是该类型。
SRGB(Color Texture):启用可以将纹理存储在伽马空间中(对每一个像素做一次幂函数运算)
Alpha Source:指定如何生成纹理的Alpha通道
{
None:无论输入纹理是否有Alpha通道,导入的纹理都没有Alpha通道
Input Texture Alpha:输入纹理中的Alpha
From Gray Scale:从输入纹理RGB值的平均值生成Alpha
}
Alpha ls Transparency:启用可以避免边缘上的过滤瑕疵
②、Normal map法线贴图格式:
③、Editor GUl and Legacy GUl一般在编辑器中或者GUI上使用的纹理
④、Sprite (2D and Ul)2D游戏或者UGUI中使用的格式
⑤、cursor 自定义光标
设置为鼠标图片
⑥、Cookie光源剪影模式
⑦、光照贴图格式
⑧、Single Channel 纹理只需要单通道格式
3、参数设置-纹理形状
4、参数设置-高级设置
5、参数设置-平铺拉伸
6、平台相关
三、Sprite Editor
1、SpriteEditorSingle图片编辑
①、Sprite Editor介绍
//顾名思义,spriteEditor就是 精灵图片编辑器
//它主要用于编辑2D游戏开发中使用的sprite精灵图片
//它可以用于编辑 图集中提取元素,设置精灵边框,设置九宫格,设置轴心(中心)点等等功能
②、安装2D Sprite
在【窗口】-【包管理器】中-搜索【2D】-选择【2D Sprite】
③、图片编辑功能
//1.Sprite Editor
基础图片设置(右下角窗口)
主要用于设置单张图片的基础属性
//2.custom outline(决定渲染区域)
自定义边缘线设置,可以自定义精灵网格的轮廓形状
默认情况下不修改都是在矩形网格上渲染,边缘外部透明区域会被渲染,浪费性能
使用自定义轮廓,可以调小透明区域,提高性能
//3.Custom Physics shape(决定碰撞判断区域)自定义精灵图片的物理形状,主要用于设置需要物理碰撞判断的2D图形
它决定了之后产生碰撞检测的区域
//4.Secondary Textures(为图片添加特殊效果)
次要纹理设置,可以将其它纹理和该精灵图片关联
着色器可以得到这些辅助纹理然后用于做一些效果处理
让精灵应用其它效果
编辑模式说明:
编辑模式示例图:
④、自定义边缘线功能(Custom OutLine)
注意一定要这些功能改变后点击应用
⑤、自定义物理形状功能(Custom Physics Shape)
与自定义边缘线类似,但是作用于物理检测方面。
⑥、Secondary Textures(次级纹理图片)
目前阶段仅作了解
2、Multiple 图集元素分割
前提操作:纹理类型选择【Sprite(2D和UI)】,Sprite模式选择多个,点击sprite Editor后,可见以下内容:
①、自动生成
②、按单元格大小分割
③、按行列数分割
④、总结
常用:按照自动分割-手动调整框大小位置-点击Trim修剪掉不需要的区域。就能达到最终效果。
3、Polygon 多边形编辑
用于在处理多边形图案时,快速设置。
上图设置边的数量。
4、Sprite Renderer 精灵渲染器
①、精灵渲染器介绍
顾名思义,Sprite Renderer是精灵渲染器所有2D游戏中游戏资源(除UI外)都是通过spriteRenderer让我们看到的
它是2D游戏开发中的一个极为重要的组件
②、2D对象的建立
使用前提:将纹理类型改为Sprite(2D 和 UI)
建立3种方式:
1、直接拖入(需要经过精灵编辑)
2、右键创建(使用右键创建一个Sprite类型,并向其精灵组件添加图片)
3、创建空物体(需要添加Sprite Renderer组件,并向其添加图片)
③、参数讲解
5、SpriteCreate 精灵创造者
在project面板中右键创建-2D-Sprite中各种多边形。
6、SpriteMask 精灵遮罩
①、遮罩使用简介
精灵遮罩是用于游戏中遮挡其他物体,或只让物体在遮罩范围内显示的。
需要创建一个Sprite Mask对象和正常的Sprite对象,并将Sprite对象的Mask Interaction更改。如:
一个是只能在遮罩内显示,另一个是只在遮罩外显示。
②、遮罩参数介绍
对于遮罩层级只要图片大于遮罩Back所属层的显示数,并且小于Front层的显示数就可以显示。
7、Sorting Group 组排序
使用:给对象添加Sorting Group组件来使用,用于区分不同层级的对象。如背景、人物等。
8、打图集
打图集是为了提高游戏性能
①、设置打开打图集功能
开启打图集,在Unity左上角-Edit-Project Settings-Editor中找到Sprite Packer调整下面的模式即可。
②、打图集面板相关
在Project窗口中创建2D-Sprite-Sprite Atlas
③、观察DrawCall数量
在game窗口的stats中观察Batches数量即可。
④、代码控制
四、2D物理系统
1、刚体
①、刚体简介
刚体是2D物理系统中用于模拟碰撞时力的作用。
2D物理系统中刚体只会在XY平面中移动。
碰撞产生条件:两个物品都有碰撞器(Box Collider),其中至少一个含有刚体(Rigidbody)。注:如果是2D则在对应组件后面加上2D。
②、参数
Dynamic:动态类型,受重力和力的影响移动和旋转。
Kinematic:运动学类型
Static:静态类型
③、如何选择不同类型刚体
2、碰撞器
①、碰撞器作用
碰撞器是用来表示物理系统中物体体积的(形状和范围)
刚体通过碰撞器的范围来检测是否接触,接触就会模拟力的效果产生速度和旋转
②、碰撞器类型
1、圆形碰撞器。
2、盒状碰撞器。
3、多边形碰撞器。
4、边界碰撞器。
5、胶囊碰撞器。
6、复合碰撞器。
3、物理材质
①、什么是物理材质
物理材质是发生碰撞时,物体之间的摩擦和弹性表现的。
②、参数
使用材质优先级:碰撞器>刚体>Edit-ProjectSetting-Physics2D中的默认材质>Unity默认系数计算
4、恒定力
①、什么是恒定力
②、参数
5、2D效应器
①、什么是?
②、不同效应器的使用
使用效应器需要添加碰撞器并且勾选上【是触发器】和【使用效应器】
1、区域效应器
施加力角度是逆时针,0是方向x轴。
2、浮力效应器
3、点效应器
4、平台效应器
5、表面效应器
五、Spriteshape
1、Spriteshape Profile
Spriteshape是用来制作2D游戏地形和背景的。
2、精灵形状渲染器和精灵形状控制器
①、精灵形状渲染器
②、精灵形状控制器
生成碰撞器
六、瓦片地图
1、瓦片资源
①、什么是瓦片地图
如何导入? 在左上角Windows-package Manager中找到2D Tilemap Editor并导入。
②、如何创建瓦片资源
瓦片调色板在windows-2D-Tile Palette
③、瓦片参数
2、瓦片调色器
①、调色器参数
②、操作调色器
步骤1:打开Edit(编辑)一般是
这个笔的形状
第一个是选择工具,第二个是拖动(可以在编辑开启时),第三个画笔工具一般和吸管工具连用用于先吸管吸住图片再用画笔工具填充。第四个是框填工具,同样可以在吸取图片后群体填充。
③、编辑瓦片地图
在等距瓦片中想要处于同一平面需要设置setting-graphics设置
3、瓦片地图关键脚本和碰撞器
①、瓦片地图参数
Grid参数
tilemap参数:
tile渲染器
②、练习题,控制一个角色移动和跳跃并具有转向
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Animations;
public class PlayController : MonoBehaviour
{
public float v = 3;
private float h = 0;
private Rigidbody2D rigidbody2D;
private SpriteRenderer sr;
// Start is called before the first frame update
void Start()
{
rigidbody2D = this.GetComponent<Rigidbody2D>();
sr = this.GetComponent<SpriteRenderer>();
}
// Update is called once per frame
void Update()
{
h = Input.GetAxis("Horizontal");
rigidbody2D.velocity = new Vector2(h * v, this.rigidbody2D.velocity.y);
if (h < 0)
sr.flipX = true;
else if (h > 0)
sr.flipX = false;
if (Input.GetKeyDown(KeyCode.Space))
{
rigidbody2D.AddForce(Vector2.up * 260);
}
}
}
4、瓦片扩展包
①、拓展包下载和导入
在类似于github.com/Unity-Techn… 中的网址中下载对应版本的包,如:
下载完毕后,解压并拖入Unity中即可。
但你自己如果之前安装过额外的版本的话就需要 通过 Git URL 安装:
- 点击Windows-包管理
- 点击
+号 →Add package from git URL... - 输入:
https://github.com/Unity-Technologies/2d-extras.git#2.2.2
②、不同瓦片
规则瓦片
动画瓦片
管道瓦片
随机瓦片
从设置的图片中随机一个
地形瓦片
权重随机瓦片
不同权重随机瓦片
覆盖规则瓦片
与关联的规则瓦片相同规则,但图片设置可以不同。这样就不用每次都重新设置规则了。
高级覆盖规则瓦片
与覆盖规则瓦片,不仅可以覆盖还能自己决定改变和是否运用规则。
③、不同笔刷
5、代码控制
①、不同类型及作用
②、重要API
七、动画窗口
1、认识Animation窗口
如何打开动画窗口:Windows-Animation-Animation
作用:
①、关键字说明
②、参数
2、创建编辑动画
①、创建动画
②、创建面板后
左侧面板变化:
右侧面板变化:
③、动画控制器参数
3、代码控制动画(老动画系统)
使用老动画系统需要先去给物体挂载Animation组件。
①、Animation组件参数
②、老动画中Animator参数
③、代码控制
想要控制需要先得到Animation组件
④、事件
事件还能传入参数甚至是游戏对象。
八、动画状态机
1、有限状态机概念
①、什么是有限状态机?
②、有限状态机意义
③、简单实现(Switch)
2、动画控制器(状态机)
添加动画:
添加连线:
在矩形(动画)上右键-点击Make Transition。
3、代码控制状态机切换
Animator参数
Animator中的API
九、2D动画
1、2D序列帧动画
实现原理
直接创建动画
2、2D骨骼动画
什么是?
删除骨骼信息
将图片储存位置中后缀为meta的文件删除掉。
制作骨骼动画
骨骼相关
蒙皮相关
权重相关
使用骨骼
将带有骨骼的图片拖入Hierarchy中,在添加SpriteSkin组件
3、图集骨骼编辑
事先准备
制作
与单张图片类似,但需点击每张图片后单独制作骨骼。另外制作完成后使用时需要额外创建空物体来控制层级。
4、psb图片骨骼编辑
什么是PSB?
非2D项目使用前需要先导入 2D PSD Importer
使用PSB
PSB文件参数
骨骼编辑
当生成权重后如果觉得有不想要的骨骼影响了,可点击权重影响后在右下方去掉影响的骨骼。
5、反向动力学IK
什么是IK?
安装
对于绝大多数在 Unity 2022 中制作 2D 骨骼动画的需求,你其实不需要单独安装这个“2D IK”包。
从 Unity 2022.1 开始,2D Animation 包(版本 8.0 及以上)已经直接内置了 IK 功能
IK参数
在添加IK点后出现物体的参数:
6、换装
同一文件下换装
生成骨骼等相关信息后,可以在右侧点击sprite按钮,并设置组信息
如何换装
不同问价下换装
可以在制作好的骨骼中点击上方copy进行复制,并在对象身上点击粘贴。
复制后与同一文件夹下不同,需要
总结
7、Spine
Spine了解
导入Spine
在官网找到Unity运行库,然后下载对应版本,并拖入Unity中。
不清楚可以使用AI进行学习。
spine骨骼动画使用
文件夹信息:
使用:
Spine参数相关
骨骼数据相关参数
骨骼动画脚本组件参数
Spine代码控制
动画播放:
转向:
动画事件:
快捷事件:
在变量上方设置后,在Unity中就能设置,方便快捷准确得到名称。
获取骨骼、设置插槽附件:
在UI中使用:
十、模型导入相关设置
1、模型导入概述
Unity中的模型
导入模型的基本流程
如何设置模型相关内容
2、(Model)模型页签
模型页签设置什么
3、Rig操作页签
主要设置骨骼和替身信息。对于人型角色模型,需要分配或创建Avatar(替身信息),非人型需要在骨骼中确定根骨骼。对于静态物体选择None
化身系统
就是人型对于骨骼的复用,通过设置人型的关节与骨骼对应,来达到复用效果。
3、动画页签
基础信息设置
分为包含动画的模型和不包含动画的模型。
重要参数:
Import Animation:从此资源导入动画如果禁用下面的都没有,并且不会导入任何动画
Anim.Compression:导入动画时使用的压缩类型
Off:禁用动画压缩,在导入时Unity不会减少关键帧数量,效果做好性能较低,文件较大,运行时内存占用也大。通常不建议使用
Keyframe Reduction:减少冗余关键帧,仅适用于Generic通用动画类
Keyframe Reduction and Compression:减少关键帧并在文件中存储动画 时压缩关键帧,会影响文件大小,但是内存大小和KeyframeReduction相同,仅适用于Legacyl旧版动画类型
Optimal:让Unity决定如何压缩,仅使用Generic通用和Humanoid人形动画类型
动画剪辑属性基础设置
LoopTime:管理是否循环播放相关
Root Transform Rotation:管理是否旋转相关
下面是管理y轴和xz轴是否有移动
动画剪辑其他设置
Curves:曲线,可以设置变量值随动画播放改变值,方便结合Animator使用。
Events:动画事件,方便设置动画播放某一时刻时触发事件。
Mask:遮罩,排除动画播放时哪一部分排除在外。
4、材质标签
材质创建模式:定义希望Unity如何生成或导入材质。
下面是设置命名等,不需要额外过多设置的内容。
十一、3D动画
1、3D动画使用
1、将模型拖入场景
2、添加Animator组件
3、创建动画状态机
4、拖入动画,控制条件
5、代码控制
状态参数功能:动画状态机种的状态可以调整不同的参数如控制播放速度等。
连线参数功能:更改连线名称、是否退出时间及其相关设置。
任意连线:需要特别注意是否包含自己,大部分会取消勾选。
2、动画分层
使用步骤:
1、新建一个动画层(在动画状态机左侧)
2、设置动画层参数
3.在该层中设置状态机(注意:结合遮罩使用时默认状态 为Null状态)
4.根据需求创建动画遮罩
每一层可以点击设置图标进行权重设置,覆盖方式,复制其他层。
animator =this.GetComponent<Animator();
animator.SetLayerWeight(animator.GetLayerIndex("MyLayer2"), 1);
3、动画1D混合
什么是动画混合:允许合并多个动画来使动画平滑混合
如何进入混合树:在Animator Controller窗口 右键->Create State->From New Blend Tree->双击进入
inspector窗口中参数管理:名称,混合类型,使用参数,动作,阈值,速度,是否镜像,自动管理阈值,计算阈值的方式,调整时间刻度。
如何使用:可以通过控制混合树自动创建参数来控制变化。
4、动画2D混合
什么是2D混合:使用两个参数来控制混合,可以看做2D平面中的2维。
2D混合有不同的种类,根据美术来决定使用哪一种,最后一种直接模式一般是表情使用。
设置界面中蓝点代表不同动画,红点代表当前状态动画,通过设置变量值控制红点位置切换状态。
5、动画子状态机
什么是子状态机:状态机中还有一个状态机,作用是处理由多个动作状态组合成一个状态
如何创建:在Animator Controller窗口中右键->Create Sub-State Machine
注意:在子状态机中处理完状态后,需要连线到返回上一层状态机某一状态或直接返回到状态机默认状态。
6、动画IK控制
IK:反向动力学。
如何进行IK控制:
1、在动画状态机-层级设置中打开IK Pass
2.继承MonoBehavior的类中
Unity定义了一个IK回调函数:OnAnimatorIK
我们可以在该函数中调用Unity提供的IK相关API来控制IK
3.Animator中的IK相关API
SetLookAtWeight 设置头部IK权重
SetLookAtPosition 设置头部IK看向位置
SetIKPositionWeight 设置IK位置权重
SetIKRotationWeight 设置IK旋转权重
SetIKPosition 设置IK对应的位置
SetIKRotation 设置IK对应的角度
AvatarIKGoal枚举 四肢末端IK枚举
7、动画目标匹配
使用API:animator.MatchTarget()
参数一:目标位置
//参数二:目标角度
//参数三:匹配的骨骼位置
//参数四:位置角度权重
//参数五:开始位移动作的百分比
//参数六:结束位移动作的百分比
如果出现问题:
//调用匹配动画的时机有一些限制
//1.必须保证动画已经切换到了目标动画上
//2.必须保证调用时动画并不是处于过度阶段而真正在播放目标动画
//如果发现匹配不正确,往往都是这两个原因造成的
//3.需要开启Apply Root Motion
8、状态机行为脚本
如何使用状态机脚本
建一个脚本继承stateMachineBehaviour基类
实现其中的特定方法进行状态行为监听
OnStateEnter 进入状态时,第一个update中调用
OnStateExit 退出状态时,最后一个update中调用
OnStateIK OnAnimatorIK后调用
OnStateMove OnAnimatorMove后调用
OnStateUpdate 除第一帧和最后一帧,每个update上调用
OnStateMachineEnter 子状态机进入时调用,第一个update中调用
OnStateMachineExit 子状态机退出时调用,最后一个update中调用
处理对应逻辑
9、状态机复用
//1.在Project窗口右键Create->Animator Override Controller
//2.为Animator Override Controller文件在Inspector窗口关联基础的Animator Controller文件
//3.关联需要的动画
十二、角色控制器
在对模型添加好动画控制后,取消【应用根运动】不然动画自带位移生效,添加Character Controller。
是否接触了地面 if( cc.isGrounded ) print("接触地面了");
关键方法
受重力作用的移动 cc.SimpleMove(Vector3.forward * 10 * Time.deltaTime);
不受重力作用的移动 cc.Move(Vector3.forward * 10 * Time.deltaTime);
十三、导航寻路系统
概述
什么是导航寻路系统
//unity中的导航寻路系统是能够让我们在游戏世界当中
//让角色能够从一个起点准确的到达另一个终点
//并且能够自动避开两个点之间的障碍物选择最近最合理的路径进行前往
//unity中的导航寻路系统的本质
//就是在A星寻路算法的基础上进行了拓展和优化
导航网格生成
打开导航网格窗口
//window一>AI一>Navigation 打开unity内置的导航网格生成窗口
四个页签
//1.object页签一设置参与寻路烘焙的对象
//2.Bake页签一导航数据烘焙页签,设置寻路网格具体信息
//3.Areas页签一导航地区页签,设置对象的寻路消耗
//4.Agents页签一代理页签,设置寻路代理信息
导航网格寻路组件
作用:导航网格寻路组件帮助角色在地形准确运动起来。
本质:根据烘焙出的寻路网格信息通过基于A*算法计算出行进路线。
组件名:Nav Mesh Agent
常用API://自动寻路设置目标点
//agent.SetDestination()
//停止寻路
//agent.isStopped = true;
网格外连接组件
如何添加:在起始点物体添加Off Mesh Link组件。
导航网格动态障碍组件
添加:在障碍物体上添加 NavMeshObstacle 组件。