Unity游戏开发——自动为动画剪辑添加事件 之 最后几帧的事件不能被调用的问题
最近在做一个根据配置表自动生成动画剪辑clip以及controller的功能.做法是根据配置表配置的动作以及每个动作的关键帧,自动为每个clip添加事件.这样做可以把动画的事件处理在游戏运行之前就计算好然后存到动画文件.anim中,可以提高游戏的运行效率,如果做的再细点,还可以自定义动画事件的传入的参数.比如act游戏中的多段攻击,这些数据一定是配到表中的,我们可以把表中的数据导入成Unity的ScriptableObject类型,然后打成.asset文件,在把他指定给AnimationEvent的objectReferenceParam参数,这样当动画播放的攻击帧并检测到攻击事件后直接把本段攻击的配置数据传入游戏运行时,可以减少不少的数据查找操作.
private static void AddClipEvent(AnimationClip clip, ActionData data)
{
List atvts = new List();
float maxFrame = data.frameCount;
if (!string.IsNullOrEmpty(data.detFrames))
{
string[] dets = data.detFrames.Split(',');
for (int i = 0; i < dets.Length; i++)
{
int frame;
if (int.TryParse(dets[i], out frame))
{
if (frame > 0 && frame <= maxFrame)
{
AnimationEvent detEvt = new AnimationEvent();
detEvt.functionName = GCharacter.FRAME_EVENT_NAME;
detEvt.stringParameter = GCharacter.FrameType.Detec.ToString() + "_" + data.id + "_" + i;
detEvt.time = frame / clip.frameRate;
atvts.Add(detEvt);
}
}
}
}
AnimationEvent endEvt = new AnimationEvent();
endEvt.functionName = GCharacter.FRAME_EVENT_NAME;
endEvt.stringParameter = GCharacter.FrameType.End.ToString() + "_" + data.id;
endEvt.time = data.frameCount / clip.frameRate;
atvts.Add(endEvt);
AnimationUtility.SetAnimationEvents(clip, atvts.ToArray());
}
不过在做到这的时候你会发现一个问题,那就是GCharacter.FrameType.End是最后一帧的帧事件,每当一个state切换到另一个state的时候这个帧尾的事件是不会被调用的!盯着Unity的状态机视图看了很久,终于找到了问题的所在!

Unity之所以收到很多人的青睐就是因为他给开发者实现了很多比较复杂的功能,这里就是因为两个动画过度时候的融合导致的,添加Transition的时候会默认指定一个过度时间,也就是上图中的Transition Duration,这里是0.1.
所以其实就相当于上个动画播放到距离最后一帧还有0.1秒的时候开始播放下一个动画,也就是此时Unity的"当前状态"已经是下一个state,而上一个state的后几帧的事件也不会触发.
有两种方法,一种是Transition Duration设为0,还有一种是让动画在离最后一帧还有0.1秒的时候就认为动画已经播放到最后一帧.我是用的后者,毕竟Unity"动画过度的融合"咱不能自己写吧,可是差0.1秒,到是可以在程序中自己控制.
把这句改成这样:endEvt.time = (data.frameCount / clip.frameRate) - 0.12f;
OK,完事!
本文固定连接:http://www.cnblogs.com/fly-100/p/5008961.html
Unity游戏开发——自动为动画剪辑添加事件 之 最后几帧的事件不能被调用的问题的更多相关文章
- 喵的Unity游戏开发之路 - 轨道摄像机
前言 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3 ...
- 喵的Unity游戏开发之路 - 游泳
原文: https://mp.weixin.qq.com/s/-ERFNB1GRZ6UAkHOhP9UQw 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀 ...
- 喵的Unity游戏开发之路 - 互动环境(有影响的运动)
如图片.视频或代码格式等显示异常,请查看原文: https://mp.weixin.qq.com/s/Sv0FOxZCAHHUQPjT8rUeNw 很多童鞋没有系统的Unity3D游戏开发基础,也不知 ...
- 【Unity游戏开发】记一次解决 LuaFunction has been disposed 的bug的过程
一.引子 RT,本篇博客记录的是马三的一次解决 LuaFunction has been disposed 的bug的全过程,事情还要从马三的自研框架 ColaFrameWork 说起.最近,马三在业 ...
- Unity 游戏开发技巧集锦之创建透明的材质
Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示. ...
- 【Unity游戏开发】不接SDK也能在游戏内拉起加QQ群操作?
一.引子 一般在游戏进行对外测试的时候都会有一个玩家QQ群,方便玩家反馈问题.交流游戏心得等.那么为了增加玩家加QQ群的欲望,可能会在游戏里面设计一个小功能,点击一下可以直接拉起手Q加群的操作,加了Q ...
- 喵的Unity游戏开发之路 - 玩家控制下的球的滑动
- 喵的Unity游戏开发之路 - 在球体上行走
很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...
- 喵的Unity游戏开发之路 - 多场景:场景加载
如果丢失格式.图片或视频,请查看原文:https://mp.weixin.qq.com/s/RDVMg6l41uc2IHBsscc0cQ 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始 ...
随机推荐
- 去掉谷歌input记住账号或密码时默认出现的黄色背景
在谷歌浏览器会默认记住账号,而记住账号之后其input的背景会变成黄色,解决的办法如下: 方法一:直接用css的内阴影来覆盖黄色,代码如下: input:-webkit-autofill { -web ...
- JQuery的插件开发——重点
1.给JQuery全局对象扩展一个函数方法 $.log=function(){ /* 给全局对象$扩展一个函数*/ } $.log;//调用方法 2.给JQuery普通对象扩展一个函数方法 3.使用第 ...
- Gradle依赖项学习总结,dependencies、transitive、force、exclude的使用与依赖冲突解决
http://www.paincker.com/gradle-dependencies https://docs.gradle.org/current/userguide/dependency_man ...
- [iOS]C语言技术视频-03-程序分支结构(switch)
下载地址: 链接: http://pan.baidu.com/s/1iBpYA 密码: e2ym
- openstack controller ha测试环境搭建记录(五)——配置rabbitmq集群
配置rabbitmq集群的步骤非常简单,因为其本身含集群功能,参考openstack官网文档:http://docs.openstack.org/ha-guide/controller-ha-rabb ...
- 一个很好玩的命令:stty
stty命令修改终端命令行的相关设置.语法stty(选项)(参数)选项-a:以容易阅读的方式打印当前的所有配置:-g:以stty可读方式打印当前的所有配置.参数终端设置:指定终端命令行的设置选项.实例 ...
- mysql管理----状态参数释义
下面是数据库MySQL优化的一些步骤 一.通过show status和应用特点了解各种SQL的执行频率 通过SHOW STATUS可以提供服务器状态信息,也可以使用mysqladmin extende ...
- 分治算法(Divide-and-Conquer)和Google的云计算
1.云计算:涉及到存储.计算.资源的调度和权限的管理等 2.分治算法的原理: 讲一个复杂的问题,分成若干个简单的子问题进行解决,然后对子问题的记过进行合并,得到原有问题的解 ...
- Bash中的变量
Bash中的变量1.用户定义的变量变量的定义 用户定义的变量有字母数字及下划线组成,并且变量名的第一个字符不能为数字. 与其它UNIX名字一样,变量名是大小写敏感的. 对于变量 ...
- MySQL测试环境遇到 mmap(xxx bytes) failed; errno 12解决方法
查看Mysql日志 InnoDB: Initializing buffer pool, size = 128.0M InnoDB: mmap( bytes) failed; errno InnoDB: ...