在Unity3D中控制动画播放

用Unity3D也算是好久了,但是每次做项目总还是能学到新的东西。这次做一个TPS的项目就遇到了这样一个问题,如何同时在上下半身播放不同的动画?解决方法其实是很简单,但由于对于动画资源的了解不足导致问题不断,最后是彻彻底底的研究了一遍Unity3D的动画系统(Legacy),虽然4.0出了新的动画控制系统,使用了一下功能相比原来确实强大不少,但还是将这次对于原先的动画系统的学习总结记录下来,毕竟这些动画的概念与策略是通用的,而且因为4.0在mac上目前貌似还没有破解所以项目还是得在3.5上做。相信对于深入理解新的动画系统也会很有帮助。

一、Unity3D动画系统相关类

1.1 AnimationClip

AnimationClip是Unity3D中播放动画的最基本对象,通过FBX导入的各个动画对象其实就是一个AnimationClip。这个类已关键帧的形式记录了骨骼关节在各个时间节点上的位置、旋转信息,根据帧频率frameRate结合播放模式wrapMode通过插值计算即可播放出连续的骨骼动画。

1.2 AnimationState

每个AnimationState包含了一个AnimationClip,并记录这个动画片段的一些播放控制属性,实际上是一个AnimationClip的包装器。

其中比较重要的参数有layer,weight, enabled, speed, blendMode这几项。这些参数的具体含义将在自定义混合动画控制中详细解释,在简单的动画控制时并不需要对AnimationState进行直接操作。

1.3 Animation

Animation是Unity3D的动画播放控制组件,包含了一系列的AnimationState对象,提供各种动画播放及控制方法。常用方法有Play(), CrossFade(), Stop()。在脚本中通过animation即可直接引用同一物体上的Animation控件。


二、简单动画播放控制

所谓简单动画播放控制就是同一时间只有一个动作,比如Standard Assets中的那个水管工,静止idle,走walk,跑run,跳跃jump,攻击attack这些动作都是全身动作,同一时间只应该做一种动作,只有在动作切换时需要将两种切换动作进行混合以达到平滑过渡的效果,以上的操作使用Animation提供的CrossFade()方法即可达到。无论是CrossFade还是Play理论上都只需要在切换动画时调用一次即可,当然重复的调用并不会影响动画的播放,当Unity3D检测到当前播放的动画与函数调用使用的动画一样后会忽略该次调用。


三、自定义混合动画

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Unity3D,可以通过以下几种方式实现动画控制播放完成回调: 1. 使用AnimationEvent Unity3DAnimationEvent可以在动画播放过程插入自定义事件,可以在动画播放完成时触发回调函数。具体实现步骤如下: - 在动画控制要添加事件的动画片段,打开Animation选项卡。 - 点击Add Event按钮,在动画片段添加事件点。 - 选择添加事件点后,在Inspector窗口可以设置事件的参数,包括事件函数名、参数等。 - 在脚本编写事件回调函数。 示例代码: ```csharp using UnityEngine; using System.Collections; public class AnimationCallback : MonoBehaviour { public void OnAnimationFinished() { Debug.Log("Animation finished"); } } ``` 2. 使用AnimationClip.isReadyToPlay Unity3DAnimationClip类提供了isReadyToPlay属性,可以检测动画片段是否已准备好播放。可以在动画片段准备好播放触发回调函数。具体实现步骤如下: - 在脚本获取动画片段的引用。 - 在Update函数检测动画片段是否准备好播放,如果准备好则触发回调函数。 示例代码: ```csharp using UnityEngine; using System.Collections; public class AnimationCallback : MonoBehaviour { public AnimationClip animClip; void Update() { if (animClip.isReadyToPlay && !animClip.isPlaying) { OnAnimationFinished(); } } public void OnAnimationFinished() { Debug.Log("Animation finished"); } } ``` 3. 使用AnimationEventTrigger Unity3DAnimationEventTrigger组件可以在动画播放过程自动触发回调函数。具体实现步骤如下: - 在脚本编写事件回调函数。 - 将脚本挂载到包含AnimationEventTrigger组件的游戏对象上。 - 在AnimationEventTrigger组件添加事件,选择要触发的回调函数。 示例代码: ```csharp using UnityEngine; using System.Collections; public class AnimationCallback : MonoBehaviour { public void OnAnimationFinished() { Debug.Log("Animation finished"); } } ``` 注意:使用AnimationEventTrigger需要Unity版本在2019.1以上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值