使用代码给Unity中的动画片段绑定回调函数
在制作动作游戏的时候,需要播放许多动画,同时还有个需求,那就是动画播放到一定时间时,给一个回调函数,好做对应的状态变更,
我查了一下,发现如果使用的是unity自带的动画系统,要做到这样的话,需要这样做:
public void AddCallBackOnClip(Type classType,AnimationClip clip,string callbacMethod,int callBackFrame,string sParam="",int iParam = ,float fParam = 0f)
{
if (string.IsNullOrEmpty(callbacMethod)||clip==null)
{
return;
}
else
{
var methodByName = classType.GetMethod(callbacMethod); if (methodByName==null)
{
Debug.LogError(string.Format("在{0}类中,找不到名为{1}的方法", classType.Name, callbacMethod));
return;
}
else
{
var timer =Time.deltaTime*callBackFrame; Debug.Log("timer=" + timer); if (timer>clip.length)
{
return;
} AnimationEvent evt = new AnimationEvent(); evt.functionName = callbacMethod;
evt.intParameter = iParam;
evt.floatParameter = fParam;
evt.stringParameter = sParam; evt.time = timer; clip.AddEvent(evt);
}
}
}
通过以上代码可以看到,其实对于绑定回调函数,是传入的回调函数名字,而并没有使用类似于C#委托一类的东西,那么问题来了,这个只是传入方法的名字的字符串,到底是怎么确认到底该绑定哪个类里面的方法呢?
通过实验,我发现是这样子的,对于上面给出的一个绑定方法,是在哪一个Mono脚本中调用,就会去绑定哪一个Mono脚本中对应的方法。
举个例子,假设 物体Go上挂了脚本 A和脚本B,两个都拥有一个叫做PrintMsg()的方法,工具类C 中实现了 AddCallBackOnClip()方法
那么现在在脚本A 中调用 AddCallBackOnClip() 方法,最后的结果是, A 和B 中的PrintMsg均会被调用,并且无论PrintMsg()是公有的还是私有的。
这就很坑爹了!所以在使用Unity的这个功能时一定要小心,不然就很容易不知道问题出在哪儿了。
除却上述坑爹的地方之外,还有一个小小的问题,那就是可以看到,事件回调只能通过指定 时间 来绑定,而不能通过指定 动画具体帧数来绑定,
这样出现的问题是,可能不会那么精确,会存在一些小小的误差。不过这一点,相对来说是可以接受的。
使用代码给Unity中的动画片段绑定回调函数的更多相关文章
- unity中的动画制作方法
Unity中的动画制作方法 1.DOTween DoTween在5.0版本中已经用到了,到官网下载好插件之后,然后通过在项目中导入头using DG.Tweening;即可. 一些常用的API函数 D ...
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
史上最全的CSS hack方式一览 2013年09月28日 15:57:08 阅读数:175473 做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我 ...
- 原生js判断css动画结束 css 动画结束的回调函数
原文:原生js判断css动画结束 css 动画结束的回调函数 css3 的时代,css3--动画 一切皆有可能: 传统的js 可以通过回调函数判断动画是否结束:即使是采用CSS技术生成动画效果,Jav ...
- 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器
对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...
- (转)Unity3d使用心得(1):ModelImporter的使用、在代码中添加动画片段。
在使用 Unity3d 倒入Fbx模型的时候,动画的动画片段需要自己手动添加模型多了以后会是一个不小的工作量. Unity3d支持 编辑器脚本来控制资源导入的过程.添加一个 AssetPostproc ...
- Unity中的动画系统和Timeline(3) 混合树和动画匹配
混合树 前面我们通过在Animation界面添加单独的动作来控制动画,这样做比较麻烦,每个单独的属性,比如站立,奔跑等,都需要单独的代码来控制.现在我们可以通过使用混合树,其基本思想是将相近的动画混合 ...
- C#中委托、事件和回调函数的理解
在C#中我们经常会碰到事件,尤其是在WPF或者WinForm中,窗体加载.或者点击一个按钮,都会触发事件.实际上,事件是对委托的封装.如果不进行封装,让委托暴露给调用者,调用者就可以把委托变量重新引用 ...
- JavaScript ES7 中使用 async/await 解决回调函数嵌套问题
原文链接:http://aisk.me/using-async-await-to-avoid-callback-hell/ JavaScript 中最蛋疼的事情莫过于回调函数嵌套问题.以往在浏览器中, ...
- 原生js判断css3动画过度(transition)结束 transitionend事件 以及关键帧keyframes动画结束(animation)回调函数 animationEnd 以及 css 过渡 transition无效
上图的 demo 主要讲的 是 css transition的过渡回调函数transitionend事件: css3 的时代,css3--动画 一切皆有可能: 传统的js 可以通过回调函数判断动画 ...
随机推荐
- java进阶(2)--抽象类
一.抽象类集刺虎: 1.概念 类与类之前有共同特征,将这些共同特征提取出来,行为抽象类 2.抽象类的数据类型: 引用数据类型 3.语法 [修饰符列表]abstract Class 类型{类体} ...
- 当asp.net core偶遇docker二(打造个人docker镜像)
网络上的docker容器总有一些不尽人意的感觉,这个时候,就需要自己diy一个自用的. 比如我们想在163的mysql 5.7内diy一下,结果发现,这个不带vim,我想改造一个自用的mysql镜像, ...
- js数组中如何去除重复值?
在日常开发中,我们可能会遇到将一个数组中里面的重复值去除,那么,我就将我自己所学习到的几种方法分享出来 去除数组重复值方法: 1,利用indexOf()方法去除 思路:创建一个新数组,然后循环要去重的 ...
- 在图像中隐藏数据:用 Python 来实现图像隐写术
什么是“隐写术”? 隐写术是将机密信息隐藏在更大的信息中,使别人无法知道隐藏信息的存在以及隐藏信息内容的过程.隐写术的目的是保证双方之间的机密交流.与隐藏机密信息内容的密码学不同,隐写术隐瞒了传达消息 ...
- FTP服务器搭建及自动备份设置
本次随笔内容主要是FTP服务器搭建. 其实去年十月服务器就搭建完了.当时写了个PPT保存了一下,准备以后写博客,结果时隔快一年我自己都快要看不懂我自己写的PPT了 ( = o = ) 不过还是尽量尝 ...
- 笑了,面试官问我知不知道异步编程的Future。
荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 60 篇. 老规矩,先来一个简短的荒腔走板,给冰冷的技术文注入一丝色彩. 上面这图是我五年前,在学校宿舍拍的. 前几天由于有点事情, ...
- LeetCode 64最小路径和
题目 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5 ...
- 《T-GCN: A Temporal Graph Convolutional Network for Traffic Prediction》 代码解读
论文链接:https://arxiv.org/abs/1811.05320 博客原作者Missouter,博客链接https://www.cnblogs.com/missouter/,欢迎交流. 解读 ...
- [C/C++]快速读入代码(快读)
快读 1.为什么要有快读 好吧,有些题目看上去十分简单,例如https://www.luogu.com.cn/problem/P4305这道题,实际上数据量巨多,光是一个测试点就可能有几个MB,在这种 ...
- for语句——猜数字
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib. ...