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

来源:互联网 发布:sql 已注册的服务器 编辑:程序博客网 时间:2024/06/04 19:33

最近,公司想把旧的动画系统转到使用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;
        }
    }
}

0 0
原创粉丝点击