• 使用代码给Unity中的动画片段绑定回调函数


    在制作动作游戏的时候,需要播放许多动画,同时还有个需求,那就是动画播放到一定时间时,给一个回调函数,好做对应的状态变更,

    我查了一下,发现如果使用的是unity自带的动画系统,要做到这样的话,需要这样做:

     1    public void AddCallBackOnClip(Type classType,AnimationClip clip,string callbacMethod,int callBackFrame,string sParam="",int iParam = 0,float fParam = 0f)
     2     {
     3         if (string.IsNullOrEmpty(callbacMethod)||clip==null)
     4         {
     5             return;
     6         }
     7         else
     8         {
     9             var methodByName = classType.GetMethod(callbacMethod);
    10 
    11             if (methodByName==null)
    12             {
    13                 Debug.LogError(string.Format("在{0}类中,找不到名为{1}的方法", classType.Name, callbacMethod));
    14                 return;
    15             }
    16             else
    17             {
    18                 var timer =Time.deltaTime*callBackFrame;
    19 
    20                 Debug.Log("timer=" + timer);
    21 
    22                 if (timer>clip.length)
    23                 {
    24                     return;
    25                 }
    26 
    27                 AnimationEvent evt = new AnimationEvent();
    28 
    29                 evt.functionName = callbacMethod;
    30                 evt.intParameter = iParam;
    31                 evt.floatParameter = fParam;
    32                 evt.stringParameter = sParam;
    33 
    34                 evt.time = timer;
    35 
    36                 clip.AddEvent(evt);             
    37             }
    38         }
    39     }

    通过以上代码可以看到,其实对于绑定回调函数,是传入的回调函数名字,而并没有使用类似于C#委托一类的东西,那么问题来了,这个只是传入方法的名字的字符串,到底是怎么确认到底该绑定哪个类里面的方法呢?

    通过实验,我发现是这样子的,对于上面给出的一个绑定方法,是在哪一个Mono脚本中调用,就会去绑定哪一个Mono脚本中对应的方法。

    举个例子,假设 物体Go上挂了脚本 A和脚本B,两个都拥有一个叫做PrintMsg()的方法,工具类C 中实现了 AddCallBackOnClip()方法

    那么现在在脚本A 中调用 AddCallBackOnClip() 方法,最后的结果是, A 和B 中的PrintMsg均会被调用,并且无论PrintMsg()是公有的还是私有的。

    这就很坑爹了!所以在使用Unity的这个功能时一定要小心,不然就很容易不知道问题出在哪儿了。

    除却上述坑爹的地方之外,还有一个小小的问题,那就是可以看到,事件回调只能通过指定 时间 来绑定,而不能通过指定 动画具体帧数来绑定,

    这样出现的问题是,可能不会那么精确,会存在一些小小的误差。不过这一点,相对来说是可以接受的。

  • 相关阅读:
    20165334 实验一 Java开发环境的熟悉
    20165334 《java程序设计》第5周学习总结
    20165334《java程序设计》第4周学习总结
    20165334《java程序设计》第三周学习总结
    20165334 预备作业3 Linux及学习
    20165334 学习基础与c语言学习心得
    20165228 实验一 Java开发环境的熟悉
    20165228 2017-2018-2 《Java程序设计》第5周学习总结
    20165228 2017-2018-2 《Java程序设计》第4周学习总结
    20165228 2017-2018-2 《Java程序设计》第3周学习总结
  • 原文地址:https://www.cnblogs.com/leiGameDesigner/p/9063916.html
Copyright © 2020-2023  润新知