AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > Unity3D

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

51自学网 2014-05-24 http://www.51zixue.net

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

 


建议使用电驴(eMule)下载分享的资源。

说明
:本教程来源互联网或网友分享或出版商宣传分享,仅为学习研究或媒体推广,51zixue.net不保证资料的完整性。
 
上一篇:Unity使用可空类型(Nullable Types)  下一篇:Unity添加自定义拓展方法