Unity---动画系统学习(5)---使用MatchTarget来匹配动画
1. 介绍
做好了走、跑、转弯后,我们就需要来点更加高级的动画了。
我们使用自带动画学习笔记2中的翻墙Vault动画,来控制人物翻墙。
在[动画学习笔记4](https://www.cnblogs.com/Fflyqaq/p/10777793.html)的基础上添加Vault动画。
![](https://img2018.cnblogs.com/blog/1355434/201904/1355434-20190427134224868-1278682975.png)
添加一个参数**Vault**,设置当人物处于跑的状态并且Vault参数为true时会自动翻墙。
![](https://img2018.cnblogs.com/blog/1355434/201904/1355434-20190427134439683-1900554000.png)
2. 问题
问题1:如何判断当人物跑向墙体时,在一定范围内触发跳跃动画?
问题2:跳跃动画如果只是播放的话,很可能会出现穿模现象,如何让人物的手正好按着墙翻过去呢?
2.1 问题1
解决思路:
- 新建一个坐标用于存储跳跃时,手要按下的位置
- 判断人物是否处于跑的状态
- 使用射线检测,当人物正前方一段距离为要跳跃墙面时,获取此物体最上面的点为要按下的点
下面新方法的介绍:
anim.GetCurrentAnimatorStateInfo(0).IsName("LocalMotion"):判断当前播放的动画是否为LocalMotion动画,返回bool
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo,float maxDistance = Mathf.Infinity):射线起点,射线方向,碰撞物体信息,检测最大距离
private Animator anim;
private Vector3 matchTarget = Vector3.zero; //匹配手按下的位置
void Start () {
anim = gameObject.GetComponent<Animator>();
}
void Update()
{
ProcessVault();
}
private void ProcessVault()
{
bool isVault = false;
//只有物体在Blend Tree动画下才需要检测,0是层数,默认状态是第0层
if (anim.GetFloat(speedZID) > 3 && anim.GetCurrentAnimatorStateInfo(0).IsName("LocalMotion"))
{
//射线起点,射线方向,碰撞物体信息,检测最大距离
//起点在脚部向上一点,射线方向是人物正前方,
RaycastHit hit;
if (Physics.Raycast(transform.position + Vector3.up * 0.3f, transform.forward, out hit, 4.0f))
{
//Obstacle是要跳跃墙面的tag
if (hit.collider.tag == "Obstacle")
{
//只有一定距离时才会触发,不然贴着墙走就会跳了
if (hit.distance > 3)
{
Vector3 point = hit.point;
//修改碰撞点y坐标为:碰撞体的y位置+碰撞体的尺寸高度
point.y = hit.collider.transform.position.y + hit.collider.bounds.size.y;
matchTarget = point;
isVault = true;
}
}
}
}
anim.SetBool(valutID, isVault);
}
2.2. 问题2
问题2的解决方法就要靠我们的MatchTarget了,上面获取了手要按下的点后,只需要让手按在这里就行了。
anim.IsInTransition(0):该层动画是否在进行动画的过渡,返回bool
void MatchTarget (Vector3 matchPosition, Quaternion matchRotation, AvatarTarget targetBodyPart, MatchTargetWeightMask weightMask, float startNormalizedTime,float targetNormalizedTime):
参数1:要匹配点的位置。
参数2:匹配的目标点旋转角度的四元数(不太懂,写Quaternion.identity)。
参数3:要匹配的人物位置(AvatarTarget.LeftHand表示人物骨骼的左手)
参数4:position和rotation占的权重(因为我们只匹配位置,所以如下设置位置权重1,旋转权重0)。
参数5:从动画的什么时候开始匹配。
参数6:什么时候结束(这需要自己慢慢调试,多试试就好了)
private void ProcessVault()
{
if (anim.GetCurrentAnimatorStateInfo(0).IsName("Vault") && anim.IsInTransition(0) == false)
{
//当正为跳墙的状态时候触发
anim.MatchTarget(matchTarget, Quaternion.identity, AvatarTarget.LeftHand, new MatchTargetWeightMask(Vector3.one, 0), 0.32f, 0.4f);
}
}
Unity---动画系统学习(5)---使用MatchTarget来匹配动画的更多相关文章
- Unity3D之Legacy动画系统学习笔记
Unity3D的Mecanim动画系统是非常强大的,而且作为Unity推荐的动画系统,其未来会完全代替老的一套动画系统,即Legacy动画系统.目前的情况是Mecanim与Legacy两套动画系统同时 ...
- Unity3D之Mecanim动画系统学习笔记(一):认识Mecanim动画系统
Mecanim简介 Mecanim动画系统是Unity3D4.0开始引入的一套全新的动画系统,主要提供了下面4个方面的功能: 针对人形角色提供一套特殊的工作流. 动画重定向的能力,可以非常方便的把动画 ...
- Unity3D之Mecanim动画系统学习笔记(九):Blend Tree(混合树)
认识Blend Tree 我们在Animator Controller中除了可以创建一个State外还可以创建一个Blend Tree,如下: 那么我们看下新创建的Blend Tree和State有什 ...
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
简介 Animator Controller在Unity中是作为一种单独的配置文件存在的文件类型,其后缀为controller,Animator Controller包含了以下几种功能: 可以对多个动 ...
- Unity3D之Mecanim动画系统学习笔记(三):Animation View
动画组件之间的关系 我们先看一张图: 这里我们可以看到,我们在GameObject之上绑定的Animator组件是控制模型进行动画播放的. 而其属性Controller则对应一个Animator Co ...
- Unity3D之Mecanim动画系统学习笔记(四):Animation State
动画的设置 我们先看看Animation Clip的一些设置: Loop time:动画是否循环播放. 下面出现了3个大致一样的选项: Root Transform Rotation:表示为播放动画的 ...
- Unity3D之Mecanim动画系统学习笔记(二):模型导入
我们要在Unity3D中使用上模型和动画,需要经过下面几个阶段的制作,下面以一个人形的模型开发为准来介绍. 模型制作 模型建模(Modelling) 我们的美术在建模时一般会制作一个称为T-Pose( ...
- Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关
资源加载是必备的知识点,这里就说说Mecanim动画的资源如何打包及加载. 注意,Unity4.x和Unity5.x的AssetBundle打包策略不一样,本笔记是基于Unity4.x的AssetBu ...
- Unity3D之Mecanim动画系统学习笔记(八):Animator Layers(动画分层)
解决什么问题? 动画分层可以用来解决什么样的问题呢?试想一下如果你要开发一款第三人称的射击游戏,那么肯定是希望身体的动画分为上下两部分,上方根据瞄准的位置和是否射击进行动画播放,下方根据移动播放动画. ...
随机推荐
- leetcode605
public class Solution { public bool CanPlaceFlowers(int[] flowerbed, int n) { && flowerbed[] ...
- 转:创建一个javaweb项目,以及导出war包
一.使用IDEA创建一个javaweb项目 1.File->New Project选择Web Application 1 2 然后填写好路径和项目名称,点击确定. 1 2 2.先看一下刚创建好的 ...
- 编译错误error: invalid&nbsp…
昨天遇到一个莫名其妙的编译错误,以前没有见过,而且代码流程看起来也没有太多的奇异之处.后来忍无可忍,百度了下,发现别人也有遇到这个错误的,他的解决方法是:少了"}". 嘿嘿,我开始 ...
- 《转》我的ARM学习经历
1.基础阶段 话说06年第一份工作从事的是PLC开发,用protel画原理图和PCB,写AVR单片机程序,焊焊板子,还去过华强北买器件,比较杂,但是接触面比较广,为进一步学ARM打下了基础. ...
- C99标准新特性的说明
C99标准新特性的说明 一.说明 ====== 这里的讨论的是C语言的国际标准,即国际标准化组织ISO,制定的C语言标准.历史上ISO制定过4个版本的C语言标准,他们分别是:C90(ISO/IEC ...
- 字节流之文件输出流FileOutputStream
文件拷贝:
- Python常用算法
本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...
- svn之merge
[svn之merge] 1. merge SOURCE[@REV] [TARGET_WCPATH] (the 'sync' merge) This form is called a 'sync' ( ...
- SpringMVC总结一:快速入门
MVC: MVC是一种架构模型,本身没有什么功能,只是让我们的项目结构更加合理,流程控制更加清晰,一般包含三个组件: **Model(模型)**:数据模型,用于提供要展示的数据.一般包含数据和行为 ...
- 07-Location之正则匹配
大网站专门有自己的图片服务器,起码也得单独放一个目录里面. 淘宝网有些图片开启了防盗链(即使是小图片,也不让你下载,真小气).163新闻可以下载. 用正则匹配uri中的image,就是说你的uri中到 ...