Unity中的动画系统和Timeline(4) AvatarMask和IK动画
2024-08-29 10:48:50
AvatarMask(骨骼遮罩)
在前面角色动画的基础上,角色在奔跑过程中捡起一块木头,双手要抱着这块木头。如果使用前面的方法,直接切换动画,那么就只剩下抱木头的动画,其它动画就没了。这时我们要使用下面的方法。
在这里创建新的一层,在这个新的层上控制抱木头的动画。
这里层属性设置中,Weight表示占有权重,Mask表示骨骼遮罩,Blending表示混合类型(Override表示重写,Additive表示在此基础上添加)。其中,Additive适用于,每个层控制不同部位的动画。当混合类型为Override且权重为1时,角色的所有动画都将是本层的。
在上面的例子中,我们需要用这一层来控制角色抱木头的动画,用到的只有双手,而其它动画和原先一样。所以,我们需要在本层的Mask中添加一个骨骼遮罩。直接右键--Avator Mask可以创建
创建好后,在Humanoid中,点击各个部位,变红表示重写时不重写这部分,还是用以前的动画。这里双手是绿色的,表示在抱着木头后,双手的动画由本层控制,其它部位的动画还是和以前一样。
IK动画
在上面,我们虽然设置好了角色抱木头的动画,但是可能角色和木头之间位置是不匹配的,我们需要把角色的双手设置到木头上的两个位置点。这个时候就需要用到IK动画了。首先要打开IK Pass,会自动执行函数OnAnimatorIK,在这个函数中我们设置角色的手和位置点匹配。
private void OnAnimatorIK(int layerIndex)
{
// 说明当前是被Hold Log这一层调用
if (layerIndex == 1)
{
// 权重,只有在抱着木头的时候才为1
int weight = anim.GetBool(isHoldLogID) ? 1 : 0;
// 左手位置匹配
anim.SetIKPosition(AvatarIKGoal.LeftHand, leftHand.position);
// 左手旋转匹配
anim.SetIKRotation(AvatarIKGoal.LeftHand, leftHand.rotation);
// 设置权重
anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, weight);
anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, weight);
anim.SetIKPosition(AvatarIKGoal.RightHand, rightHand.position);
anim.SetIKRotation(AvatarIKGoal.RightHand, rightHand.rotation);
anim.SetIKPositionWeight(AvatarIKGoal.RightHand, weight);
anim.SetIKRotationWeight(AvatarIKGoal.RightHand, weight);
}
}
最新文章
- (function($){...}) (jQuery)
- IOS 消息机制(NSNotificationCenter)
- java字节流与字符流的区别
- 关于Split方法
- 关于J-LINK升级最新固件后无法连上的一点分析
- Android——AnimationDrawable 实现动画
- IntelliJ IDEA 15 创建maven项目
- php开发中的页面跳转方法总结
- Android应用程序进程启动过程的源代码分析
- Silk Mobile – 缩短移动应用的测试周期
- Intent用法
- jQuery动态生成不规则表格前后端
- RedHat Enterprise Linu…
- JavaEE介绍
- [Swift]LeetCode103. 二叉树的锯齿形层次遍历 | Binary Tree Zigzag Level Order Traversal
- JavaScript编程基础2
- cad2008 参照面板 在位编辑后无法使用
- android加密DESede/CBC/PKCS5Padding
- kail linux 系统下利用metaspolit工具渗透win7电脑
- python基础6--目录结构