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

解决思路:

  1. 新建一个坐标用于存储跳跃时,手要按下的位置
  2. 判断人物是否处于跑的状态
  3. 使用射线检测,当人物正前方一段距离为要跳跃墙面时,获取此物体最上面的点为要按下的点

下面新方法的介绍:

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来匹配动画的更多相关文章

  1. Unity3D之Legacy动画系统学习笔记

    Unity3D的Mecanim动画系统是非常强大的,而且作为Unity推荐的动画系统,其未来会完全代替老的一套动画系统,即Legacy动画系统.目前的情况是Mecanim与Legacy两套动画系统同时 ...

  2. Unity3D之Mecanim动画系统学习笔记(一):认识Mecanim动画系统

    Mecanim简介 Mecanim动画系统是Unity3D4.0开始引入的一套全新的动画系统,主要提供了下面4个方面的功能: 针对人形角色提供一套特殊的工作流. 动画重定向的能力,可以非常方便的把动画 ...

  3. Unity3D之Mecanim动画系统学习笔记(九):Blend Tree(混合树)

    认识Blend Tree 我们在Animator Controller中除了可以创建一个State外还可以创建一个Blend Tree,如下: 那么我们看下新创建的Blend Tree和State有什 ...

  4. Unity3D之Mecanim动画系统学习笔记(五):Animator Controller

    简介 Animator Controller在Unity中是作为一种单独的配置文件存在的文件类型,其后缀为controller,Animator Controller包含了以下几种功能: 可以对多个动 ...

  5. Unity3D之Mecanim动画系统学习笔记(三):Animation View

    动画组件之间的关系 我们先看一张图: 这里我们可以看到,我们在GameObject之上绑定的Animator组件是控制模型进行动画播放的. 而其属性Controller则对应一个Animator Co ...

  6. Unity3D之Mecanim动画系统学习笔记(四):Animation State

    动画的设置 我们先看看Animation Clip的一些设置: Loop time:动画是否循环播放. 下面出现了3个大致一样的选项: Root Transform Rotation:表示为播放动画的 ...

  7. Unity3D之Mecanim动画系统学习笔记(二):模型导入

    我们要在Unity3D中使用上模型和动画,需要经过下面几个阶段的制作,下面以一个人形的模型开发为准来介绍. 模型制作 模型建模(Modelling) 我们的美术在建模时一般会制作一个称为T-Pose( ...

  8. Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关

    资源加载是必备的知识点,这里就说说Mecanim动画的资源如何打包及加载. 注意,Unity4.x和Unity5.x的AssetBundle打包策略不一样,本笔记是基于Unity4.x的AssetBu ...

  9. Unity3D之Mecanim动画系统学习笔记(八):Animator Layers(动画分层)

    解决什么问题? 动画分层可以用来解决什么样的问题呢?试想一下如果你要开发一款第三人称的射击游戏,那么肯定是希望身体的动画分为上下两部分,上方根据瞄准的位置和是否射击进行动画播放,下方根据移动播放动画. ...

随机推荐

  1. 判断修改的中的值,用前面的,否则容易获得空值;this.dataGridView1.Rows[i].Cells[0].EditedFormattedValue; VS bool b = (bool)this.dataGridView1.Rows[i].Cells[0].Value;

    判断修改的中的值,用前面的,否则容易获得空值:this.dataGridView1.Rows[i].Cells[0].EditedFormattedValue;  VS     bool b = (b ...

  2. leetcode592

    public class Solution { private int GCD(int a, int b) { ? GCD(b, a % b) : a; } private int LCM(int a ...

  3. 常用Linux命令-文件上传和下载

    rz 上传本地文件到远程服务器 sz fileName 下载文件到本地电脑 如果不能使用以上命令进行文件上传和下载需要安装命令,步骤如下: 1.软件安装1)编译安装root 账号登陆后,依次执行以下命 ...

  4. 从SQL Server中清除msdb备份和恢复记录

    正如我在前面的技巧“您的数据库上次恢复是什么时候呢?”中提到的,SQL Server使msdb数据库内系统表中的备份和恢复记录保持激活状态.没有正常的维护,这些系统表将变得很大,从而导致对于msdb数 ...

  5. JAVA基础知识总结18(反射)

    反射技术: 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的 ...

  6. 数据库SQL优化大总结之 百万级数据库优化方案 【转载】

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...

  7. lucene和solr

    我们为什么要用solr呢? 1.solr已经将整个索引操作功能封装好了的搜索引擎系统(企业级搜索引擎产品) 2.solr可以部署到单独的服务器上(WEB服务),它可以提供服务,我们的业务系统就只要发送 ...

  8. Web网站的几个QPS

    评价一个网站的"大小",处于视角的不同,有很多种衡量的方法,类似文章数,页面数之类的数据非常明显,也没有什么可以争议的.但对于并发来说,争议非常之多,这里就从一个技术的角度开始,谈 ...

  9. jQuery--加一行减一行

    效果: 知识点: 克隆--clone() 追加--append() 移除--remove() 代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 ...

  10. 黑盒测试实践--Day4 11.28

    黑盒测试实践--Day4 11.28 今天完成任务情况: 分块明确自己部分的工作,并做前期准备 完成被测系统--学生管理系统的需求规格说明书 完成Mook上高级测试课程的第六章在线学习,观看自动化测试 ...