代码改变世界

Unity 3D 动画帧事件

2015-11-14 16:55  wuzhang  阅读(14799)  评论(2编辑  收藏  举报

  前几天在项目开发中碰到一个这样的需求,RPG游戏中,特效和动画播放不同步的。假如主角在攻击NPC时,先实例化特效,后播放动画。动画毕竟是有一个时间长度的。等到动画播放攻击挥刀的那一瞬间时,特效可能早就播放完了。于是就想着在动画播放到某一帧的时刻才实例化特效,这样就解决了动画与特效不同步的问题。首先我们要做的是如何给动画添加事件?

1,建立一个空白的Unity工程,导入一个带有动画的模型。

前期准备基本上就这么多了,接下来就可以添加动画事件了。添加动画事件有两种:方法一:直接在模型中添加事件

到此处设置已完成了。运行下看会发生怎样的结果。

报错了,回掉函数找不到接收者,说白了就是我们没有给人家回掉函数的定义,那么在脚本中定义该回掉函数吧!

OK,在场景中挂载该脚本,再次运行。

动画播放了,回掉函数也生效了!此时再实例特效就OK了。

那么开始第二种方法,我们可以对任意动画任意帧添加任意事件,貌似说的有点任性了。说的好像和真的一样,那就看看到底是不是真的。

在码代码之前,我们先去学习一个叫做AnimationEvent的东东。

了解这几个参数,我们就可以写代码了。

using UnityEngine;
using System.Collections;

public class TestAnimationEvent : MonoBehaviour
{
    /// <summary>
    /// 我们要添加事件的动画
    /// </summary>
    public AnimationClip clip;
    public GameObject target;
    // Use this for initialization
    void Start()
    {
        AddAnimationEvent();
    }
    /// <summary>
    /// 代码中自定义事件
    /// </summary>
    public void AddAnimationEvent()
    {
        //创建动画事件
        AnimationEvent animationEvent = new AnimationEvent();
        //设置事件回掉函数名字
        animationEvent.functionName = "GoToTarget";
        //传入参数
        animationEvent.objectReferenceParameter = target;
        //设置触发帧
        animationEvent.time = 1.0f;
        //注册事件
        clip.AddEvent(animationEvent);
    }

    /// <summary>
    /// 可视化添加动画帧事件 
    /// </summary>
    public void CallFuncation()
    {
        Debug.Log("Animation Event Triggered !");
    }
    
    /// <summary>
    /// 代码添加回掉函数
    /// </summary>
    /// <param name="go"></param>
    public void GoToTarget(GameObject go)
    {
        this.transform.LookAt(go.transform);
        Debug.Log("目标物体:" + go.name + " " + go.transform.position);
        if (Vector3.Distance(this.transform.position, go.transform.position) < 0.2f)
        {
            return;
        }
        else
        {
             transform.position= Vector3.MoveTowards(this.transform.position, go.transform.position, 2f);
        }
    }
}

好了,我们来运行一下,测试结果就是人物移动到目标点。

运行后

好了,到此基本上完成了,如果有什么疑问,联系我哦!

工程代码: http://pan.baidu.com/s/1fZ9pW