Unity3D Mecanim在某个状态下动画重新播放

本文详细介绍了如何在 Unity3D 中使用 Mecanim 系统进行动画控制,包括状态转换、受击动画重播机制的实现,并通过实例代码演示了简化状态控制的方法。

最近,公司想把旧的动画系统转到使用Mecanim来实现,让我来做技术预演。之前学习Unity3D的时候有接触过Mecanim,不过都忘了,所以又重新学了一遍。重新看了官网的Mecanim视频教程,凭我这半吊子英语水平也只是一知半解,所以又找了个视频看看,中国人的Mecanim教程。经过近1个半小时的努力,总算是实现了用Mecanim来控制各个动画的播放。可以做到Idle、Run、Attack、Hit和Die这五个状态的转换。当验收时主管提出但人物处于Hit状态时,再次受到Hit时动画要重头播放,故要重新返工。先 是自己摸索一下Animator类是否支持动画重新播放,查看了文档,无奈官方文档 没有详细介绍Animator类,中文文档根本就没有介绍Animator类。现在就只能靠猜了,看来看去也就Animator下的 StartPlayback()这个方法比较靠谱。可是试来试去还是不得法,最后就只能靠搜索引擎了。在这我不得不吐槽一下,做技术的还是用谷歌吧,百度 搜不到的东西谷歌也许就能搜到。好吧,我就是用谷歌搜到了,网址在这,我会跟你说这是日本网站么。

好吧,自己也实现了一把,送给有缘看到这篇博客的人,免去了找资料的痛苦。简化了Mecanim的状态,只有Idle和Hit两个状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using UnityEngine;
using System.Collections;
 
public class SimpleExample : MonoBehaviour {
 
     Animator anim = null ;
     AnimatorStateInfo currentBaseStage;
     int idle = Animator.StringToHash( "Base Layer.Idle" );
     int hit = Animator.StringToHash( "Base Layer.Hit" );
     bool isHit = false ; //在播放受击动画时是否再次受击 true: 受击
     bool isPlayBack = false ; //是否重播  true: 重播
 
     // Use this for initialization
     void Start () {
         anim = GetComponent<Animator>();
     }
     
     // Update is called once per frame
     void Update () {
         currentBaseStage = anim.GetCurrentAnimatorStateInfo(0);
         if (currentBaseStage.nameHash == idle && !anim.IsInTransition(0))
         {
             anim.SetBool( "hit" , false );
             isHit = false ;
         }
         //hit
         if (!isHit && Input.GetKey(KeyCode.H) && !anim.IsInTransition(0) && currentBaseStage.nameHash == idle)
         {
             anim.SetBool( "hit" , true );
             anim.StartRecording(0); //记录重播开始位置
             isHit = true ;
         }
         if (isHit && Input.GetKey(KeyCode.H) && currentBaseStage.nameHash == hit)
         {
             //二次受击
             isPlayBack = true ;
             anim.StopRecording(); //停止记录重播
             anim.StartPlayback(); //开始重播
             anim.playbackTime = 0f; //从0s开始重播
         }
 
         //设置现在重播时播放的时间
         if (isPlayBack)
         {
             float newPlaybackTime = anim.playbackTime + Time.deltaTime;
             if (newPlaybackTime > anim.recorderStopTime) {
                 newPlaybackTime = 0;
                 anim.StopPlayback();
                 isPlayBack = false ;
             }
             anim.playbackTime = newPlaybackTime;
         }
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值