Unity---动画系统学习(5)---使用MatchTarget来匹配动画
1. 介绍
做好了走、跑、转弯后,我们就需要来点更加高级的动画了。
我们使用自带动画学习笔记2中的翻墙Vault动画,来控制人物翻墙。
在[动画学习笔记4](https://www.cnblogs.com/Fflyqaq/p/10777793.html)的基础上添加Vault动画。

添加一个参数**Vault**,设置当人物处于跑的状态并且Vault参数为true时会自动翻墙。

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(动画分层)
解决什么问题? 动画分层可以用来解决什么样的问题呢?试想一下如果你要开发一款第三人称的射击游戏,那么肯定是希望身体的动画分为上下两部分,上方根据瞄准的位置和是否射击进行动画播放,下方根据移动播放动画. ...
随机推荐
- Strom简单介绍
1.离线计算是什么? 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据.MapReduce批量计算数据.Hive批量计算数据. ...
- windows 共存多个位数不同的jdk时,eclipse的报错对应措施
1. 判断当前jdk的位数 # java -version java version "1.6.0_26" Java(TM) SE Runtime Environment (bui ...
- 在VMware中为Red Hat配置静态ip并可访问网络-Windows下的VMware
首先确保虚拟网卡(VMware Network Adapter VMnet8)是开启的,然后在windows的命令行里输入“ipconfig /all”,找到VMware Network Adapte ...
- WebFlux01 webflux概念、异步servlet、WebFlux意义
1 概念 待更新...... 2 异步servlet 2.1 同步servlet servlet容器(如tomcat)里面,每处理一个请求会占用一个线程,同步servlet里面,业务代码处理多久,se ...
- Android Studio 编译提示 No installed build tools found. Please install the Android build tools
添加 ANDROID_HOME=D:\Android\adt-bundle-windows\sdk 系统变量即可
- PHP 5.5环境配置
php5.5 + apache2.4 安装配置 1 2 3 4 5 6 7 分步阅读 php5.5 做了大量的更新,在与apache搭配的时候如何选择也很有讲究,这里我们以64位 php5.6 和 A ...
- 594. Longest Harmonious Subsequence强制差距为1的最长连续
[抄题]: We define a harmonious array is an array where the difference between its maximum value and it ...
- ./configure 交叉编译库时所最常用到的配置
./configure 交叉编译,一般流程 ./configure xxx make make instal 结合我自己的编译工具,一般我的编译选项如下 ./configure --prefix=in ...
- c语言实践:求两个数的最大公约数
我的思路是这样的:比如12和16这两个数.先理解一下概念,什么叫最大公约数.就是12有很多个因数,16也有很多个因数,这两堆因数中有一些重合的因数,在这些重合的因数中找到那个最大的.那么最大公约数一定 ...
- A. Xor-tree
题目意思: 给一颗n个节点的树,每个节点有一个值要么是0要么是1,改变某个节点的值时,它的儿子不变,它儿子的儿子翻转,它儿子的儿子的儿子不变,如此类推.给定各个节点的目标值,求最少的翻转次数,使得达到 ...