摘要:在游戏中,经常有这种情况:角色的手或者脚需要在特定时间放在特定的位置。比如角色需要用手撑着跳过一个石头或一堵墙,或者跳起抓住房梁。Target Match就是让动画的特定片段去匹配特定的位置。

洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。

小新:“大智,我有一个需求,感觉可以用IK去实现,但是使用IK会有问题,我就不知道怎么办了。”

大智:“具体是什么需求呢?”

小新:“绝地求生里面人物可以双手撑墙跳过一个堵墙或者窗户,我想让角色的双手能恰好放到墙上,这个应该怎么做呢?”

Target Matching(目标点匹配)

大智:“这种需求其实可以使用Target Matching的技术。在游戏中,经常有这种情况:角色的手或者脚需要在特定时间放在特定的位置。比如角色需要用手撑着跳过一个石头或一堵墙,或者跳起抓住房梁。Target Match就是让动画的特定片段去匹配特定的位置。”

小新:“那具体怎么用呢?”

大智:“API是Animator.MatchTarget,你可以先去看看文档”

小新:“好嘞”

API:Animator.MatchTarget

下面是小新的笔记:

Animator.MatchTarget的方法原型为:

public void MatchTarget(Vector3 matchPosition, Quaternion matchRotation, AvatarTarget targetBodyPart, MatchTargetWeightMask weightMask, float startNormalizedTime, float targetNormalizedTime = 1);

这个方法用来自动调节GameObject的位置和旋转。

参数的作用:
matchPosition 匹配的位置
matchRotation 匹配的旋转
targetBodyPart 身体的部位,从AvatarTarget枚举中选择。
weightMask 设置位置和旋转匹配的权重
startNormalizedTime 开始匹配的时间,注意是单位化时间(动画开始位置是0,结束位置是1)。如果开始时间已经超过了当前动画的播放时间,会匹配下一次符合的时间。比如:startNormalizedTime传入0.2,但是当前已经播放到0.3,会匹配下一次循环的0.2的位置。
targetNormalizedTime 最终匹配到的单位化时间。如果值大于1,可以设置特定循环数后的位置。比如2.3代表第2次循环的30%位置。

Unity会自动调整GameObject的位置和旋转来保证到特定时间时角色的特定部位能达到指定的位置和旋转。Target matching只能对Base Layer(index 0)生效。同一时间只能有一个match target生效,后续一个的match target需要等待前面的执行完成,再后续的match target会被忽略。

参数详解

小新:“大概知道这个方法是什么了,那对于跳跃这个动画,如何应用呢?”

大智:“其实只要对这几个参数多研究一下,就知道怎么用了。首先前两个参数是匹配的位置和旋转,这个不用多说吧?”

小新:“嗯嗯,比如我要匹配墙上,那就是墙上的位置,旋转就是让手的角度贴合墙,应该可以用调IK的方式来调。

大智:“没错。targetBodyPart的类型是一个枚举,可以用来匹配对应的位置,比如说匹配左手,那就应该传入左手。weightMask是一个结构体,可以同时设置位置和旋转的权重,这个权重的概念我们已经接触很多次了,如果为1就是完全匹配到对应的位置和旋转。

小新:“嗯,这几个参数没什么问题,就是最后两个参数有些难搞清楚”

大智:“最后两个参数是开始匹配和完全匹配上的时间。比如你想在特定的时间匹配到对应的位置,那么肯定不能到那个时间点一下子把动画拉过去,是吧?”

小新:“对,那样太突兀了”

大智:“是的,我们动画中很多的混合都是为了让动画看起来更平滑,更自然。所以除了这个匹配到的特定时间,也就是targetNormalizedTime,我们还需要一个开始匹配的时间startNormalizedTime。开始时间到了就开始去进行匹配混合,到targetNormalizedTime时正好精确的到达匹配的位置。”

小新:“那我大概明白了,我得去亲手实践一下”

大智:“还要注意Target Matching只能对Base Layer生效”

小新:“好我记住了”

动画重定向

小新:“我突然想起来一个也叫什么Retargeting的东西,和这个好像啊,你顺便给我讲讲呗”

大智:“你说的应该是动画重定向,也就是Retargeting,比如将角色A的动画应用到没有动画的角色B上面,实现动画的重用。”

小新:“对对,就是这个”

大智:“其实要想重用动画不一定要用到Retargeting系统。如果两个角色的骨骼结构一样,那么动画其实是可以直接重用的。

小新:“哦,那为啥还要这个Retargeting系统呢?”

大智:“虽说两个角色的骨骼结构一样,动画是可以直接重用。但是要求很严格,包括骨骼的命名、骨骼的数量、骨骼的父子结构等等要求一模一样。这种情形一般只会出现在同一个动画师手里。如果骨骼稍微有些差别,那就没办法直接重用了。”

小新:“确实,如果我找到一个特别好的人物角色模型,但是却没办法用其他已有的动画,那是多么的折磨啊”

大智:“是的,这时候就需要用到Retargeting系统了,但是需要注意的是**Retargeting系统只能用于人形动画。**重定向相当于将不同的骨骼结构都映射到了Unity的Avatar上面。之前我们配置过AvatarMask,和那个有点像。配置的位置就是在模型导入设置的Rig标签里”

点击Configure可以进入配置界面,Unity会自动创建一个新场景用于Avatar的配置。

在Mapping页面下,可以将模型的骨骼节点映射到Unity的Avatar上面对应的骨骼节点。在Musule & Settings页面下可以设置每个骨骼节点可以旋转的范围,避免出现不合常理的骨骼旋转。

大智:“Retargeting系统就相当于将模型A和模型B的骨骼都映射到了一个Unity Avatar上面,这样最终都是用这个同一个Avatar来控制动画,达到重用的目的。”

小新:“明白了,相当于用了一个中间件,将两个不同的东西匹配了起来。”

大智:“没错。在设置模型的Rig的时候,需要注意的是,Avatar Definition除了Create From This Model这个选项之外,还有一个选项是Copy From Other Avatar,如果两个模型的骨骼结构是一致的,可以直接使用这个Copy From Other Avatar将Avatar复制过来,就不需要再重新设置一遍了,也能节省内存。”

总结

小新:“看来这两个东西里面虽然都有Target,但是其实是两个不同的东西。Target Matching用来匹配动画到特定的位置,Retargeting系统是用来重用动画,让骨骼结构不同的动画可以复用。”

大智:“说的没错”

今日思考题

大智:“给你布置个作业,去用Target Matching把跳跃的动画好好调一调”
“收到!我去也!”
“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”

扩展阅读

  • Unity动画系统详解1:在Unity中如何制作动画?
  • Unity动画系统详解2:如何导入使用外部的动画?
  • Unity动画系统详解3:如何播放、切换动画?
  • Unity动画系统详解4:如何用代码控制动画?
  • Unity动画系统详解5:BlendTree混合树是什么?
  • Unity动画系统详解6:如何做好角色的移动动画?(Root Motion详解)
  • 【建议收藏】找不到免费的角色动画?来试试mixamo

【扩展学习】在洪流学堂公众号回复动画可以阅读本系列所有文章,更有视频教程等着你!


呼~ 今天小新絮絮叨叨的真是够够的了。没讲清楚的地方欢迎评论,咱们一起探索。

我是大智(微信:zhz11235),你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

Unity动画系统详解9:Target Matching是什么?相关推荐

  1. Unity动画系统详解10:子状态机是什么?

    摘要:除了使用Layer还有没有更好的组织状态的方式呢?感觉一个Layer里面状态多的时候,还是很显得很乱. 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这是复(yu)习( ...

  2. Unity动画系统详解5:BlendTree混合树是什么?

    摘要:"Animator中有一个功能,用来解决多个动画之间的混合,经常用于移动动画之间的混合,这个功能叫做BlendTree,混合树." 洪流学堂,让你快人几步.你好,我是跟着大智 ...

  3. Unity动画系统详解4:如何用代码控制动画?

    摘要:通过上一篇咱们知道了播放动画需要使用Animator,那么如何用代码控制动画呢? 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统 ...

  4. Unity动画系统详解8:IK是什么?

    摘要:IK是Inverse Kinematic的缩写,也就是反向动力学.是根据骨骼的终节点来推算其他父节点的位置的一种方法.比如通过手的位置推算手腕.胳膊肘的骨骼的位置. 洪流学堂,让你快人几步.你好 ...

  5. Unity动画系统详解6:如何做好角色的移动动画?(Root Motion详解)

    摘要:Root Transform是body transform在Y平面上的投影,并且是运行时计算的.每一帧Root Transform的变化实时计算.然后Transform的变化会被应用到GameO ...

  6. Unity动画系统详解3:如何播放、切换动画?

    摘要:[长文预警,建议先收藏]有了模型和多个动画以后,在Unity中如何控制它们的播放和切换呢?本文带你一站式解析Unity的Animator模块. 洪流学堂,让你快人几步.你好,我是跟着大智学Uni ...

  7. Unity动画系统详解7:Layer是什么?

    摘要:使用Layer可以用来管理角色的不同身体部位.比如下半身用于行走或跑步,上半身用于射击或投掷物体. 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu) ...

  8. Unity动画系统详解2:如何导入使用外部的动画?

    摘要:在Unity中只能制作比较简单的动画,要想要复杂的动画,比如人物跳舞的动画,那就得在外部的软件中制作并且导入到Unity中使用,那这个过程是什么呢? 洪流学堂,让你快人几步.你好,我是跟着大智学 ...

  9. Unity动画系统详解1:在Unity中如何制作动画?

    摘要:在场景中加入动态的物体,可以让整个场景更加生动.真实.Unity场景中的物体可以通过制作动画,让物体动起来.简单的动画如物体的移动.旋转(比如旋转的风扇.闪烁不定的灯泡等),复杂的动画如游戏中角 ...

最新文章

  1. python image stiching_Python自然语言处理,词云图生成
  2. PHP框架性能不权威对比
  3. 数字加密c语言程序_国外程序员整理的 C++ 资源大全
  4. Google正在失去DeepMind?
  5. Java break语句,标签
  6. 安装VS2010 SP1与ASP.NET MVC4详细步骤
  7. java集成极光推送
  8. python存钱挑战_【Python 22】52周存钱挑战2.0(列表list和math函数)
  9. nas服务器搭建网站,小白都能看懂的NAS服务器搭建教程
  10. NCURSES程序设计之皇后问题
  11. 如何释放计算机内存吗,教您如何有效释放计算机内存空间!
  12. java+selenium——Navigate命令
  13. 出生日期正则表达式丨出生日期年月日正则如何表达?
  14. 读ElasticSketch笔记
  15. 什么是架构?架构的本质和作用!
  16. 3.数据仓库之确定粒度
  17. 大幅提升冲浪效率,搜狗高速浏览器3.0
  18. WMS系统条码作业项目实施经验浅谈
  19. SDHK_Tool.Dynamic.SD_Motor_Angle 角度旋转电机
  20. python 办公自动化 视频教程_python办公自动化:Excel操作入门

热门文章

  1. php 转发邮件,PHP Email();我不接收转发的电子邮件
  2. 桌面上的计算机图标一直被选定,常见电脑桌面图标问题十则
  3. mysql 64位整型_高性能MySQL笔记精简(整数和实数优化)
  4. 设计字体打包_再也不用熬夜设计字体了!525款世界级绝美PS字体包免费送
  5. python中查找字符串_python中字符串操作--截取,查找,替换
  6. 电商BANNER灵感背景欣赏|平面设计中的极简风格
  7. 手机移动端APP引导界面设计模板素材,分层可临摹
  8. python time 时间差,python如何计算时间差
  9. wits数据格式_WITS标准
  10. 千牛机器人回复词库_智能聊天机器人 ai机器人电销-