Animation动画窗口
老动画系统组件用Animation
代码控制:
animation.Play(“Clip名称”); // 直接播放
animation.CrossFade(“Clip名称”); // 过渡平滑播放
animation.PlayQueued(“Clip名称”); // 上一个播放完再播放
animation.CrossFadeQueued(“Clip名称”); // 上一个播放完再平滑播放
Animator动画状态机
新动画系统用Animator
有四种切换条件
int,float,bool,trigger
代码控制:
Set:
animator.SetFloat(”条件名“,1.2f);
Get:
animator.GetFloat(”条件名“)
直接切换状态(很少用):
animator.Play(“状态名”)
层级中的Sync为同步某个状态机层级复用,
比如下蹲就可以先同步站立的状态机后进行调整
Timing选项,开启时会根据权重来计算动画时长,关闭则直接套用母版动画时长
代码改变层级权重:
animator.SetLayerWeight(animator.GetLayerIndex(“Layer Name”));
例如下蹲时可以把下蹲层级权重改为1,起立则改回0
模型相关
Rig操作骨骼页签
四种Type:
None 无骨骼
Humanoid 人形模型
Generic 通用模型,非人形模型
Legacy 旧版动画类型3.x版本
Avatar骨骼相关:
Mapping:设置骨骼关节映射
Muscles & Settings:设置肌肉,限制各部位旋转角度
Animation动画页签
(Rotation,Position)的Bake Into Pose选项决定了动画动作是否会影响角色的Rotation或Position
Curves曲线
可以设置曲线和变量,变量显示在Animator有限状态机,其值会随着曲线设置结合动画来进行变化
Event事件*
Funtion参数名,下面的Float,int等为参数,当播放动画时会自动寻找挂载该动画的物体上的同名脚本调用,没找到会报错
Mask遮罩
可以设置哪些部位在运动时不受动作影响
2D混合树
1.2D Simple Directional 2D简单定向模式 运动表示不同方向时使用 比如向前、后、左、右走
2.2D Freeform Directional 2D自由形式定向模式 同上 运动表示不同方向时使用 但是可以在同一方向上有多个运动 比如向前跑和走
3.2D Freeform Cartesian 2D自由形式笛卡尔坐标模式 运动不表示不同方向时使用 比如向前走不拐弯 向前跑不拐弯 向前走右转 向前跑右转
4.Direct 直接模式 自由控制每个节点权重,一般做表情动作等
动画子状态机
可以选择出口为某个动画,或者某个状态机(从该状态机的Enter入口进入)
动画IK反向动力学
首先需要开启所在状态机层级中的IK Pass选项
相关函数需要写在OnAnimatorIK这个生命周期函数里
头部相关:
animator.SetLookAtWeight(1, 1f, 1f);
animator.SetLookAtPosition(pos.position);
其中前者为多重载,具体参数为(默认为0):
weight: LookAt全局权重0~1 bodyWeight: LookAt时身体的权重0~1 headWeight: LookAt时头部的权重0~1 eyesWeight: LookAt时眼镜的权重0~1clampWeight: 0表示角色运动时不受限制,1表示角色完全固定无法执行LookAt,0.5表示只能够移动范围的一半
其他部位相关:
animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1); animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1); animator.SetIKPosition(AvatarIKGoal.RightFoot, pos2.position); animator.SetIKRotation(AvatarIKGoal.RightFoot, pos2.rotation);
其中Weight表示权重,是在计算时的系数,1为正常值
动画目标匹配
例:跳跃,攀爬到某一指定位置
animator.MatchTarget()
参数一:目标位置 参数二:目标角度 参数三:匹配的骨骼位置 参数四:位置角度权重 参数五:开始位移动作的百分比 参数六:结束位移动作的百分比
animator.MatchTarget
(
targetPos.position,
targetPos.rotation,
AvatarTarget.RightFoot,
new MatchTargetWeightMask(Vector3.one, 1),
0.4f,
0.64f
);
调用匹配动画的时机有一些限制 1.必须保证动画已经切换到了目标动画上 2.必须保证调用时动画并不是处于过度阶段而真正在播放目标动画 如果发现匹配不正确,往往都是这两个原因造成的 3.需要开启Apply Root Motion
为满足条件,通常使用该API在动画切片的Event中,也就是开始跳跃动作时插入此Event
状态机行为脚本
1.新建一个脚本继承StateMachineBehaviour基类
2.实现其中的特定方法进行状态行为监听 OnStateEnter 进入状态时,第一个Update中调用 OnStateExit 退出状态时,最后一个Update中调用 OnStateIK OnAnimatorIK后调用 OnStateMove OnAnimatorMove后调用 OnStateUpdate 除第一帧和最后一帧,每个Update上调用 OnStateMachineEnter 子状态机进入时调用,第一个Update中调用 OnStateMachineExit 子状态机退出时调用,最后一个Update中调用
注意以上函数全部为虚函数,需要加上Override
状态机复用
创建Animator Controller Override进行复用
Character Controller 角色控制器
使用后不需要RigidBody和Collider
Slope Limit 坡度限制
Step Offset 台阶高度限制
Skin Width 两个碰撞体彼此穿透的最大皮肤宽度,值大减少抖动,较小会导致角色卡住,建议设置为半径的10%
相关函数:
cc.isGrounded 是否接触地面
cc.Move() 不受重力移动
cc.SimpleMove() 受重力移动
OnCollisionEnter 对角色控制器没用,取而代之的是 :
OnControllerColliderHit
OnTriggerEnter 正常使用
Navigation导航寻路
需要先导入AI Navigation包,在Window里找到AI – Navigation
需要选择所有路面方块,在Navigation窗口Object设置为static,后进行Bake
Bake参数:
Agent Radius 角色半径
Agent Height 角色高度
Max Slope 最大坡度
Step Height 台阶高度
Generated Off Mesh Links(在Object中开关)
Drop Height 下落高度
Jump Distance 跳跃距离
Advanced高级设置
Manual Voxel Size 手动设置立体像素大小(描述了导航网格表示场景集合体的精确程度),大小减半会使内存增大4倍,一般不修改这个值,除非需要极其精确的网格
Min Region Area 最小区域面积,小于的网格会被移除
Height Mesh 高度网格构建,不开启会自动把阶梯烘焙成斜坡,开启后更精确
Areas可以指定地面类型的Cost进行最短路计算,比如水路的Cost大于平路的Cost
Nav Mesh Agent导航网格寻路组件
常用:
agent.SetDestination() 设置目标点
agent.isStopped = true 停止寻路
不常用
变量
//关键变量
//1.面板参数相关 速度 加速度 旋转速度等等
print(agent.speed);
print(agent.acceleration);
print(agent.angularSpeed);
//2.其它重要属性
//2-1当前是否有路径
if( agent.hasPath )
//2-2代理目标点 可以设置 也可以得到
print(agent.destination);
//2-3是否停止 可以得到也可以设置
print(agent.isStopped);
//2-4当前路径
print(agent.path);
//2-5路径是否在计算中
if( agent.pathPending )
//2-6路径状态
print(agent.pathStatus);
//2-7是否更新位置
agent.updatePosition = true;
//2-8是否更新角度
agent.updateRotation = true;
//2-9代理速度
print(agent.velocity);
方法
//手动寻路
//计算生成路径
NavMeshPath path = new NavMeshPath();
if( agent.CalculatePath(Vector3.zero, path) )
//设置新路径
if(agent.SetPath(path))
//清除路径
agent.ResetPath();
//调整到指定点位置
agent.Warp(Vector3.zero);
Off Mesh Link 导航网格外连接组件
Cost Override 覆盖消耗值,<= 0时默认为Area消耗值,正数消耗值结果为Result = 正数 * Area消耗值
Bi Directional 双向连接
Auto Update Position 是否实时更新导航网格
Nav Mesh Obstacle导航动态障碍组件
用于动态障碍物
Carve :
关闭时,障碍物仅作为一个碰撞体,无法让代理选择新的路线
开启时,会将其当作静态物体,动态对路线进行计算
开启后出现的新参数:
Carve Only Stationary(仅静止时雕刻)
- 作用:优化
Carve功能的性能,仅当障碍物静止时才雕刻导航网格。 - 适用场景:适用于偶尔移动的障碍物(如推拉门),移动时暂时不更新导航网格,减少性能消耗。
Move Threshold(移动阈值)
- 作用:当
Carve Only Stationary勾选时,此参数定义障碍物移动多少距离后,暂时取消雕刻(恢复导航网格)。 - 数值意义:单位为米(m),例如设为 0.5 时,障碍物移动超过 0.5 米后,导航网格会暂时恢复其区域的可通行性。
Time To Stationary(静止时间)
- 作用:当
Carve Only Stationary勾选时,此参数定义障碍物停止移动后,经过多少秒重新雕刻导航网格。 - 数值意义:单位为秒(s),例如设为 0.2 时,障碍物静止 0.2 秒后,导航网格会再次 “挖空” 其所在区域。

评论(0)
暂无评论