通过脚本向AnimClip添加动画事件

最近我的独立游戏已经开始进入到了收尾阶段,所以开始需要大量的配置怪物了,那么怪物攻击通过动画事件回调来通知脚本层一些重要信息,比如,开启伤害判定,关闭伤害判定,通知脚本层本次攻击结束,可以让AI做下一个决断了,等等。

如下所示:

protected void OnAnimEvent(string param)
{switch (param){case "resetOnly":
{onAttackEnd?.Invoke();break;}case "reset":
{onAttackEnd?.Invoke();meleeDamageJudging = false;break;}case "meleeDamageJudge":
{meleeDamageJudging = true;break;}case "attackEnd":
{isAttacking = false;meleeDamageJudging = false;aiProfile?.Get<ZombieThink_KeepDistance>().TrySetSignal( this );break;}}
}

如果一个一个向AnimClip添加脚本,就非常麻烦。

于是我就想到了一个用右键菜单动态向动画事件添加脚本的方法。由于只有攻击行为需要添加事件,所以也就没做动态配置文件,直接把需要添加的事件写道脚本里面去了。

当然由于每个动画的触发点,是要根据动画内容细调的,这块是没办法做自动的,因为目前还只能依靠眼睛来判断,什么位置应该开启伤害判定,什么位置应该重置伤害判定,但是这个工作就比一个一个建立动画事件,省心多了。

要点:

ModelImporter:这个是代表导入的模型。

ModelImporterClipAnimation:这个是代表一个导入的动画文件。

importer.SaveAndReimport();这个是保存导入动画的操作。

AssetDatabase.Refresh();刷新Asset数据库,不解释了。

代码如下:

public class AddAnimEvent
{public static string animationEventName = "OnAnimEvent";public static string [] eventForSingleAttack = new[] {"meleeDamageJudge", "reset", "attackEnd"};public static string [] eventForDoubleAttack = new[] {"meleeDamageJudge", "resetOnly", "reset", "attackEnd"};public static string [] eventForTrippleAttack = new[] {"meleeDamageJudge", "resetOnly","resetOnly", "reset", "attackEnd"};//这个是用来验证,选中的是不是模型,有没有动画的。[MenuItem("Assets/Add Attack Event",true)]private static bool ValidAddAttackEvent(){if (Selection.activeObject){ModelImporter importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(Selection.activeObject)) as ModelImporter;if (importer){ModelImporterClipAnimation[] animation = importer.clipAnimations;if (animation.Length > 0 ){return true;       }}}return false; }[MenuItem("Assets/Add Attack Event")]private static void AddAttackEvent(){ModelImporter importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(Selection.activeObject)) as ModelImporter;if (importer){ModelImporterClipAnimation[] animations = importer.clipAnimations;List<AnimationEvent> events = new List<AnimationEvent>();ModelImporterClipAnimation animation = animations[0];string[] paramGroup = eventForSingleAttack;//单动画,2段,3段攻击的命名,要和美术同学约定好。if (animation.name.Contains("2attack")||animation.name.Contains("Attack_2")){paramGroup = eventForDoubleAttack;}else if (animation.name.Contains("3attack")||animation.name.Contains("Attack_3")){paramGroup = eventForTrippleAttack;}for (int eventIndex = 0; eventIndex < paramGroup.Length; eventIndex++){AnimationEvent _event = new AnimationEvent();_event.functionName = animationEventName;_event.time = 0.1f * eventIndex;_event.floatParameter = 0;_event.intParameter = 0;_event.stringParameter = paramGroup[eventIndex];events.Add(_event);}animation.events = events.ToArray();importer.clipAnimations = animations;importer.SaveAndReimport();}AssetDatabase.Refresh();}
}

通过脚本向AnimClip添加动画事件相关推荐

  1. Unity3D学习笔记——添加动画事件(Animation Events)

    前言: 事件的触发可以通过鼠标点击或者键盘按钮进行触发,对于主角人物的声音或者一些特效的话在动画上添加事件是非常方便的. 使用步骤: 1.在挂载主角人物的脚本上写触发的方法. void Test(){ ...

  2. Spine2D动画系统添加骨骼动画事件帧

    spine是基于骨骼的2D动画系统,相比较与模型动画各有利弊.在做项目时,有时候需要在spine特定骨骼出添加动画帧,类似于模型动画的Animation动画帧一样. 接下来就是 spine骨骼的2D动 ...

  3. Unity 入门笔记 - 05 - 动画事件类音效对话框

    Unity 入门笔记 - 05 - 动画事件&类&音效&对话框 前言:无 目录 Unity 入门笔记 - 05 - 动画事件&类&音效&对话框 一.动画 ...

  4. 【Unity3D】动画回调函数、动画事件、动画曲线

    1 动画回调函数 动画回调函数是指动画在开始时.执行中.结束时回调的函数,主要有:OnStateEnter.OnStateUpdate.OnStateExit.OnStateMove.OnStateI ...

  5. U3D Animator 组件控制动画的播放暂停,动态添加帧事件

    //顺便说一句,U3D的动画编辑器有BUG,添加关键帧事件后选了函数会说不支持,其实是可以用.运行下看结果来定吧. //大家好我是笨笨,笨笨的笨,笨笨的笨,谢谢! //20150810 by Jerr ...

  6. unity动画事件问题---为什么添加了没有触发

    unity动画事件问题-为什么添加了没有触发 已经添加过动画事件了,但是为什么不触发了 后来我发现需要脚本添加给主角,我一开始添加给父物体空物体上了,导致unity识别不到,可能是因为由于主角上才有a ...

  7. a标签里面设置onclick_详解a标签添加onclick事件的几种方式

    我们常用的在a标签中有点击事件: 1. a href="javascript:js_method();" rel="external nofollow" 这种方 ...

  8. Unity (二) Animator:Events - 动画事件案例(呐喊出现字幕)

    Events的运用案例1: 在呐喊动画中,加入字幕事件 1)在呐喊动画Shout里添加2个事件: 2)在画布里添加一个Text作为字幕 将Text设为不激活 3)给角色添加脚本: 把画布里的Text拖 ...

  9. Unity (二) Animator:Events : 动画事件案例(呐喊出现字幕)

    Events的运用案例1: 在呐喊动画中,加入字幕事件 1)在呐喊动画Shout里添加2个事件: 2)在画布里添加一个Text作为字幕 将Text设为不激活 3)给角色添加脚本: 把画布里的Text拖 ...

最新文章

  1. Android官方提供的支持不同屏幕大小的全部方法
  2. [zz]一份非常内行的Linux LVM HOWTO
  3. 可以改善mysql性能的InnoDB配置参数
  4. CloudFoundry cf push命令报错误码223的解决方法
  5. 判断是否大于_电动车是否属于机动车的辩论要点
  6. 几个接下来要解决的问题
  7. Oracle 11gR2 中 示例用户 安装说明
  8. arm linux 内存压力测试,嵌入式中如何给内存做压力测试?
  9. 数模美赛-层次分析模型方法(评价类问题)
  10. 基于 OpenFlow 的 SDN 技术 (论文笔记)
  11. 黄淮江淮等地有大雾 较强冷空气将影响中东部地区
  12. Key(Windows Android),申请 android google 地图 API key(转)
  13. vue-live2d 看板娘
  14. 域控服务器更新规则,由服务器升级为域控制器的方法
  15. amp;#9733;电车难题的n个坑爹变种
  16. html设计动画小黄人,【二次元的CSS】—— 用 DIV + LESS 做一个小黄人构造器
  17. vos3000 更换ip具体操作方法
  18. java毕业生设计选课系统计算机源码+系统+mysql+调试部署+lw
  19. 绘图基础--画弧,扇形,弓形
  20. 2022年制冷与空调设备安装修理特种作业证考试题库模拟考试平台操

热门文章

  1. mysql实现线性插值法_向量之间的插值-四元数法VS.旋转矩阵法的性能比较
  2. mysql锁与性能_MySQL性能与锁
  3. 无限想象空间,用Python就能玩的3D人体姿态估计
  4. (一)unity shader在实际项目中出现的问题————unity的后处理插件景深效果在某些低档机(如三星)无效的解决方案
  5. UVA1587:给6组长和宽,判断能否构成长方体
  6. C++builder 组件的安装与卸载
  7. python turtle画小兔子图片_如何用Python画一只兔子——turtle库circle()画圆函数的详细用法介绍...
  8. 延时函数delay_us
  9. 人类最基本的思维方式有哪些?
  10. 通过应用程序缓存实现HTML5的离线浏览