分类目录归档:点点滴滴

点点滴滴便是点点和滴滴是也

居家办公的一些感受

由于北京近期疫情情况,公司所处区域的疫情尤为严重,物业大楼基本已经不让人进出,特殊情况进入大楼取物品都需开具证明,所以我已经居家办公一周有余,说说居家办公的一些感想吧。

首先,公司要求居家办公和学校要求孩子居家上网课后,省去了早上送娃上学和自己路上通勤的时间,这部分的时间可以用来跑步晨练,坦白说我目前的这个工作的状态,如果正常工作状态下,还要能做到跑步晨练的话,那我应该差不多就是圣人或者金刚了,对我这种凡夫俗子来说忒不现实。就这样,除了小区临时封控的两个早晨和今天早晨(室外气温实在太冷了,零下9度,昨天跑的时候没把我给冻死,加上感觉膝盖有点不适,先缓一天),基本上做到了每天跑步5公里。这与平日正常上班期间午间1个小时的公园散步的运动量相比还是多不少的,也能让自己的身体得到更多的锻炼。

其次,居家办公的沟通转为纯线上,理论上的情况是大家能把很多需要实时沟通的环节通过离线沟通来完成,而实际情况是,项目组的绝大部分同学的文字表达能力和文字阅读理解能力都很糟糕,平日里的沟通更多的都是在钉钉群中通过即时消息来完成的,也没有养成通过文档或者任务跟踪系统来记录同步进展并进行讨论的习惯和能力锻炼。最终的结果就是,大家基本沟通还是依赖各种电话会议来完成的,而参与过电话会议的同学大体都会有一个感受那就是电话会议太密集了,会议的沟通效果也没有那么好,很多时候会出现话赶话的情况。

再者,家里空间实在紧张,一家五口,两位居家办公,一位居家上课,一位居家玩耍,还有一位老人辛劳操持全家人的吃喝。哥哥占据自己屋里的书桌,老婆占据老人次卧里头的书桌,我占据餐后的餐桌,弟弟占据主卧和客厅,奶奶主战场在厨房。天气尚佳时,工作时段的大部分时间,奶奶会带着弟弟到小区楼下户外活动,近日气温骤降出门时间也骤减,我就得试着如何与弟弟共享客厅了(餐桌在客厅的一角)。而且电话会议的过程中,免不了要发言,而此时家里的各种背景音,电视节目的声音(奶奶仅有的娱乐),娃娃们玩闹的声音(哥哥课间会与弟弟一起在家里玩闹),以及偶尔会出现的娃娃们对我的主动呼喊(时不时地会有,孩子看到家长在旁边,有些事情就是想同步一下给到对方),这些东西都或多或少地会让人感觉到一些压力,感觉工作和生活之间连个缝隙都没有,时间长了,有点会喘不上来气的感觉。

最后,因着这次世界杯的主办方卡塔尔所在时区与我们相近,而大家又都居家办公,世界杯看球的机会倒是多了一些。平日加班到11点回到家都是常事,累得也够呛,坦白说对于我这种非球迷,看不看也就那么回事,大概率也就不看了。这次倒是靠着世界杯,还能跟孩子一起看看球,缓解缓解心里不好的情绪。

昨夜的朋友圈值得被记住

昨天是北京22年继5月份那一次「静下来」后的又一次「静下来」的一个周五的晚上,卡塔尔世界杯上伊朗🇮🇷🆚🏴󠁧󠁢󠁷󠁬󠁳󠁿威尔士,伊朗队在伤停补时阶段凭借着自己不放弃的精神和场上多一人的优势最终将比分锁定在2:0,拿到一场非常漂亮的胜利和珍贵的3分。

在居家办公一周之后,听说过有人举报自己公司恶意到岗办公的,有见过群里有人堂而皇之地埋怨「小区怎么还不封控啊,哪怕是一天也行啊,我还没有享受过不上班也领薪水的日子呢,一天都没有,就让我体验一下呗」,然后看到了乌鲁木齐的大火惨剧新闻,心中更是发涩犯堵。

到了晚上8点,提前跟公司同事们约好的「周五晚-云喝酒」钉钉视频会议开始了,大家依次进入会议,有的伙伴还在准备酒菜(可能工作刚刚才忙完),大概十来分钟后,大家各自落座,在手机屏幕前开始频频举杯。长时间不见面后,突然能一次见到这么多昔日每天一起工作的伙伴们,大家心情都极为舒畅,甚至比在线下饭馆喝酒的时候更为放得开,除了劝酒没有线下压力山大之外,大家都尤为自在。平时话多的伙伴,在视频会议中也更贫了(我也算是其一),平日里话少一些的伙伴,更是需要频频被cue才会应付几句,更多就是听着,跟着一起乐。整场云喝酒下来,有的伙伴喝了1.8L的啤酒,有的伙伴喝了6瓶啤酒,有的伙伴喝了8两53度的汾酒,也有伙伴喝了一杯茶或是一瓶大窑,最终会议结束时间在22:12,约定好解封后到岗上班得及时行乐,赶紧吃上一顿,吃一顿少一顿的。

洗漱结束后,躺在床上打开朋友圈,看到一篇篇文章和视频转发,我在这里罗列一下这些文章和视频的标题

  • 《习仲勋:应当允许人民讲话!》
  • 《路是通的,是他们不跑》
  • 《毛泽东:让人说话,天塌不下来》
  • 视频号内容外交部发言人办公室发布的《赵立坚引用美国歌曲批驳美方》,这首美国歌曲就是鲍勃·迪伦的《答案在风中飘》

也许是喝了一点酒,也许是被这防疫的种种怪象给弄的,我毫不犹豫地频频转发了多篇文章和视频,然后趁着酒劲就睡了。

早上一起来,想着看看昨天的测试结果,果然不出所料,大家所有的动作都非常有效地传达到了各大审核团队那儿,突然朋友圈又一次清净了。姑且不谈这些内容还可见不可见,我倒是觉得以后大家发内容,只要标题足够清晰有力,即便别封了被敏感了,大家的态度也完成了表达,也探测到了当局的态度和应对策略,也蛮好的。大家持续发声,也持续被失声,人总是会疯的,等大家都疯了,也许会有一些变化吧。

从现在开始,我不想等着别人帮我发声,看着别人失声,我也想发声,反正失声只是早晚,何必呢。

聊聊近况吧

昨天居家办公的时候听完了池建强和王建硕在播客节目《夜航西飞》中的一次关于web3、大理、写作、思考、创业等等一系列话题的对谈。其间聊到了一次王建硕与阮一峰的一次对谈,阮一峰在谈及其自身的个人写作更需要读者的互动来给自己正反馈的激励,而王建硕相对来说就比较享受写作过程中的自我表达和逻辑的完善,其写作的目的更多的是帮助自己的思考和凝练。

今天早上在微信视频号里看到了读库老六与陈晓楠关于写作的对谈,老六非常骄傲地「鄙视」了一下他口中的「拖拉机」为啥会不愿意写稿,他已经能从写作中找到一种与自己对话和疗愈的出路,写作会让自己放松,把自己劝开了,写完了整个人都舒坦了,跟一次健身结束后的感受很类似。

以上提及的几位,在我个人成长的过程中,或多或少都对我有一定程度上的影响,阮一峰老师很多的技术科普类文章在我学习很多新技术概念的时候给到我很多的帮助,我自己的技术类文章也力求向阮一峰老师的技术类文章看齐,想要做到用简单和确定的文字把一个纯技术领域的内容说明白。对了,想起来了,虽然我没有正经写过 JavaScript 的代码,我还是买了一本阮一峰老师的 ES 相关的书,纯支持作者(是的,我每年或多或少都会做类似的一些事情,去年和今年就为了支持推上的两个技术书籍作者,买了一本 Golang 和一本 Python 的技术书籍,实际上这两本书我压根儿都没打开读过)。

池建强老师作为微信公众号早期的三剑客之一,又是MacTalk的主笔人,我一直都是其微信公众号的订阅者,看着他从用友到锤子,从锤子到极客时间,再到现在的墨问西东。虽然期间有一段时间因为「懒投资」的事情,我把曾经不断给「懒投资」和「张磊」站台的池建强和冯大辉的公众号都取关了,最后还是都关注回来了。池建强老师的书貌似我还买了一本,虽然其中大部分的内容都在微信公众号上都读了个七七八八,还是支持了一把。池建强老师的爱好广泛,其中爱读闲书对人文学科兴趣浓厚这一点,我也沾点边,所以会有天然的亲切感,而且他也是一个不折不扣的老程序员,直到最近几年才彻底完成转身,刚好我自己也处于这样的一个节点上。

读库老六对我个人的影响可能更为深远了,我早在上大四的时候通过网络了解到了有读库这么个出版物,在我开始来北京实习后,从 2009 年开始我就成为了读库的全年订户了,直到今年每一年都没有落下,虽然大概还有一半的读库我没有读完(持续创业996留给自己阅读的时间相对较少,毕竟自己不是那种重度阅读爱好者),但是每一期的老六的语和每一年的 00 刊,我都会完整地读完,看着这个小机构一步步成长,看着一个这么传统的行业里头,一位这么没有野心的人,踏踏实实把这么一个事做到「随时可死」的状态,对我自己的触动还是很大的。我记得当年我从喜讯离职的时候,跟我的老大聊的时候,我曾经还说过我有可能会选择去投奔读库,看看那家出版机构有没有能用得上我的地方。当然最终因为手游创业元年的大浪潮给了我一些其他的机会和幻想,我就跟着我的另外一位老哥哥就投身于手游创业去了,这事儿我就抛诸脑后了,连发个邮件问询一下的动作都没做,所以可能还是不够真热爱吧,都是说来骗人和骗自己的。

前一阵子,我隔几天都会问自己一个问题,那就是我到底是个什么样的人,缘由呢就是因为我做了多年的工作内容发生了变化,我从一个技术开发人员半推半就地转成了一个产品经理,并且要带领一个已经相对成熟的产品的产品团队。这期间产生的一些不适和压力,让我开始反问自己是不是适合这份工作,人大抵都会在不舒服的时候产生一些怀疑情绪吧,至少在我这儿是成立的。所以我就写了不长不短的大概一万来字吧,用手机在「纯纯写作」里配合着「微信键盘」写完的,从自己上学开始写到就业和创业,一直到现在,甚至有点自己写回忆录的感觉了,但是我应该还不到要给自己写回忆录的时候吧,如果自己能活到平均年龄的话,而且坦白讲自己的人生历练还非常的浅薄,远没有啥实际内容可写的。

前一阵子在多抓鱼上买了一本《讣告》,目前还没有打开塑封,跟它一起下单的另一本《变局:七千人大会始末》的塑封也还没有打开,不过对于《讣告》一书早有耳闻,因着这书是读库出品的,所以通过读库的各种渠道多少听了那么几耳朵,而且播客节目《文化有限》和《忽左忽右》都有专门做过节目介绍此书,所以大抵这该书中的内容和形式有所了解,应该是汇集了经济学人杂志上刊登的一些人物的讣告出版的一本书,由于杂志篇幅和形式,大体上每位人物的讣告篇幅都会凝练为两张纸以内吧,书籍出版的时候伊丽莎白女王还健在,当节目录制的时候女王刚刚去世不久,节目中主播们还在讨论「不知道经济学人会怎么给伊丽莎白二世写这篇讣告」。

像我这般的升斗小民,徇着社会大势,通过升学一步步从农村走到城市,生活非常的具体,也很模式化,有属于个人的喜怒哀乐,更多的是淹没在尘世中的一粒沙。没有太多闪光点,生活的单元基本可以用年来计算,跟我们国家的GDP统计单元有点类似😭,咋听着好像我就是一个经济大循环中的小螺丝呢,好无力啊。

不过回到自己为何主动尝试写作,尤其以回顾自己为何会走到今天这一步来做私人的写作这个话题上来,虽然写作不是一笔写到底,而是断断续续,中间还间隔了不短的时间,大概在一个月内写完的。前半部分的情绪会非常饱满,书写的速度和流畅感也会更好,也许那会儿心中还有比较强烈的肿胀感?有些块垒亟需抒发一下子?也许吧。后半部分有点想延续前半部分把这个写作完成,但是由于工作内容的变化和自己心境的变化,逐渐进入到新的岗位和角色后,最初的那个心境已经很难直接找回来了,写作的过程中还能延续的就是逻辑。也就是说,我后半部分的写作相对来说情绪更弱,更多的是在前半部分已形成的内容中呈现的逻辑之上的延续。然后在整个写作完成之后,我会发现一次较为完整的自己回顾,自己还是会选择那些自己情绪想要突破的出口相关的高光点来完成自己的书写,而那些同样真实的,在自己潜意识里与当前情绪相关度不高的内容,还是会选择性的放弃掉,最终会出现前文逻辑非常严密,立意非常清晰,但是后文有点难以为继,逐渐出现羞于呼应的状态了。

这次书写还是达成了两个目的的:

  • 情绪的出口找到了,至少那几天自己羞于对外人诉说的情绪被化解了;
  • 拉长时间的非即兴书写能帮助自己厘清自己的思考逻辑,设置产生怀疑;

所以,我感觉王建硕老师说的那句话还蛮有意思的,公众号更适合用来输出自己比较成型的一些思考结果,而Blog就是自己的自留地,我想种点啥都可,甚至不开花不结果也不重要,重要的是过程能历练我们自己的种地技巧并积累经验,内化为我们的能力。

那么我是不是也可以这么干呢,我想试试。

做了两个转换 Color HEX Codes 的 PopClip 插件

最近这三年里头,我成了一个 Flutter 开发人员,加入了映客这家做直播的公司,主要做直播相关的业务开发。映客的产品研发流程中设计团队的设计稿交付通常都是通过蓝湖来完成的,我们也就习惯使用这个工具来查看设计稿了,开发的过程中确认尺寸和取色的过程基本上都是直接在蓝湖上完成。

通常我们需要使用的颜色值在设计稿页面右侧的标注栏中根据我们想要的颜色格式,在 HEX、AHEX、HEXA、RGBA、HSLA 这几种颜色表达格式中随意切换,然后直接拷贝即可。

但是由于我们做的是 Flutter 开发,Flutter 原生支持的颜色构造方法有以下几种:

const Color(int value) : value = value & 0xFFFFFFFF;

const Color.fromARGB(int a, int r, int g, int b) :
    value = (((a & 0xff) << 24) |
             ((r & 0xff) << 16) |
             ((g & 0xff) << 8)  |
             ((b & 0xff) << 0)) & 0xFFFFFFFF;

const Color.fromRGBO(int r, int g, int b, double opacity) :
    value = ((((opacity * 0xff ~/ 1) & 0xff) << 24) |
              ((r                    & 0xff) << 16) |
              ((g                    & 0xff) << 8)  |
              ((b                    & 0xff) << 0)) & 0xFFFFFFFF;

每次从蓝湖中拷贝过来的 HEX Color Codes 字符串总是无法直接拷贝粘贴到 Dart 代码中直接使用,每次要么得自己把 #FFFD3666 中的 # 换成 0x,最终变成 Color(0xFFFD3666) 这样才能正常构建出来一个颜色值对象。对于这种简单重复的劳动,我是有种本能的反感,在前两年的开发中,我自己实际动手写 UI 控件的机会不多,因为组内有其他能做得更好和更熟练的伙伴在负责 UI 控件这块儿,这近一年由于自己从原来的大项目组调整到了更小的团队中,由于人力配置的问题,日常开发工作中也开始自己写一些 UI 控件了。一次次地拷贝中,除了想着想把一些颜色值做成主题(更多依赖于研发和设计高度认同,严格遵守规范,定义好业务内不同场景下应用的颜色、尺寸、圆角半径等等),还有就是想着能不能把每次手动改动 # 符号为 0x 的这种机械式的动作简化掉。

恰巧我很多年之前使用过 PopClip 这款软件,具体为何我会购买这款软件,以及当时我用这款软件来帮助我完成什么事情,我已经记不起来了,但是我非常清楚地记得它有一个非常强大的插件生态和插件能力。所以我就想着是不是可以利用它的能力,帮助我达成每次拷贝到这种 HTML 的 Hex Color Codes 字符串的时候,弹出一个处理选项按钮,我直接点一下就帮我处理好了,我只需要切到我的 IDEA 代码编辑器中直接粘贴就好了,所以我这就直接先去这个官方整理的插件页面去找了一圈,不过看来这种需求还是有点小众,并没有完全匹配的。

想来想去,还是忍不了这样总是无聊的重复劳动,借着周末在家,刚好新项目的研发工作已经阶段性地告一段落了,只需要日常推进持续迭代即可。想着给自己来个代码按摩吧,了解了解这个编程世界中的其他一些美好的角落中的小故事,顺便给自己写个提效的小工具,也算不错,刚好北京近两周正处于疫情苗头又起来了的阶段,也不太能带娃出门。

既然选择要写自己的插件,那就找到官方的教程来读读看,不看不知道,一看吓一跳,真是要给这样的开发者竖大拇哥👍啊,文档写得是真到位,写得真好,但凡作者觉得能对读者有帮助的内容,都给出了外链和应用方法。从这个文档中,我至少拓展阅读或了解了以下一些非常优秀的项目:

quickref

case-anything

 The Noun Project

SF Symbols

ICU specification

作为一个非冲动动手型选手,在动手写任何代码之前,我总是希望能对我即将要做的事情有一个大致的了解后再思考自己需要怎么做。虽然我也能直接拿着官方插件仓库中的代码之间改一改就能跑起来,但我显然一直都不是这样的一个人,我还是比较享受从0到1慢慢了解一个项目,这样难度相对更低,自己也能更舒服,渐进了解了 PopClip Extension 的设计思路和整体规范之后,再了解具体制作的流程和规范,再结合自己要做的事情,匹配到我需要使用的特性,最终确定我需要使用到其 Shell Script Action 的特性来执行我自己稍微熟一些的 python 脚本来完成我想要做的两件事情。

  1. 将 #FFFFFFFF 这样的 HTML Hex Color Codes 一键转换为 0xFFFFFFFF 这样的 16 进制字面常量表示形式;
  2. 将 #FFFFFFFF 这样的 HTML Hex Color Codes 一键转换为整型数 4294967295。

具体的制作过程就不展开了,实际上非常的简单,直接照着教程,创建一个目录,在目录下放上以下三个文件即可:

  1. Config.json => 用于声明这个插件的各项参数和具体需要使用的图标,执行的脚本,以及执行完脚本得到结果后的动作等等;
  2. h2d.py => 这是我写的两个插件中的其中一个插件依赖的 python 脚本的名称;
  3. README.md => 一个用于描述自己插件是干嘛的 MD 文档,可有可无,但是我认为是需要的,像优秀的人和优秀的项目靠近,我们才可能也变得更好一些;

然后将整个目录改名,加一个 .popclipext 后缀在目录名称后面即可,安装了 PopClip 的 macOS 系统会自动识别出来这个目录是一个插件,整个目录的图标展示都会变成 PopClip 的图标样式,双击安装插件,由于我们自己写的插件目录下没有签名文件(如果要签名可以联系 PopClip 的作者帮忙),所以 PopClip 会检测到这是一个未签名的插件,需要我们二次确认后才可安装成功,安装成功之后,即可使用了。

我的这两个插件的效果就是这样的,#FFFFFFFF => 4294967295,0xFFFFFFFF

插件效果演示

最后附上我自己 fork 出来的 PopClip-Extensions 的地址吧:https://github.com/lishali12345/PopClip-Extensions

另外这两个插件的代码分别在:https://github.com/lishali12345/PopClip-Extensions/tree/master/source/Hex2Decimalhttps://github.com/lishali12345/PopClip-Extensions/tree/master/source/HexColorCodes2HexText

下载后可以直接双击安装并使用的插件(注意未签名)在:https://github.com/lishali12345/PopClip-Extensions/blob/master/extensions/Hex2Decimal.popclipextzhttps://github.com/lishali12345/PopClip-Extensions/blob/master/extensions/HexColorCodes2HexText.popclipextz

Unity3D Mecanim 中 Transition 的 Atomic 属性是个什么鬼

我们游戏中一直有一个让我非常恼火的问题,关键是查了已经无数次了,根本尼玛不屌我啊,像我如此这般坚强的程序猿都要拜倒了。谁知前几天再次出现,因为已经把 Log 打得有点天罗地网的意思了,而且还持久化到磁盘 Log 文件上了,这下也不担心查着查着突然被其他的事情打断之后,然后再次回来想查问题的时候发现 Log 已经不见了,尼玛不是说好的要保护第一现场的咩?

不扯淡了,先说这个问题是啥。我们的游戏中,对于战斗 NPC 的动作都加了 AnimationEvent 回调,游戏中很多逻辑都依赖于 AnimationEvent 的回调,例如战斗 NPC 释放了一个技能,那么在这个技能动画刚刚开始播放和即将结束的某个时间点,会分别调用 OnSkillStart 和 OnSkillEnd 这两个 AnimationEvent,在这两个回调函数中会有相应的处理逻辑,例如在 OnSkillStart 中给 NPC 加上霸体的 Buf,在 OnSkillEnd 中将 NPC 的 Buf 取消。我碰到的诡异现象是这样的,NPC 的技能 A 的动画时间长度为 3 秒,OnSkillStart 方法和 OnSkillEnd 方法分别处于整个动画时间轴的 0.2 秒和 2.8 秒,NPC 在 AI 判断确定释放技能 A,在技能 A 动画播放到 0.1 秒的时候,受到了主角的攻击,此时 NPC 应该立即切换到受击状态,开始播放受击动画,但是事实上却不是这样,我们能看到的日志信息如下:

10:34:05.565 AM ya_zhang_tie_qi_jun(Clone)001 TriggerSkill ya_zhang_tie_qi_jun_attack_3

10:34:05.573 AM #Network# GameClient Emit a Message: [Action, Ping]

10:34:05.667 AM Player OnSkillStart: player_female_suplex_back
10:34:05.792 AM Player OnSkillTrigger (player_female_suplex_back#0)
10:34:05.799 AM ya_zhang_tie_qi_jun(Clone)001 OnHookAttackHit by Player with player_female_suplex_back#0
10:34:05.803 AM ya_zhang_tie_qi_jun(Clone)001 Hit to Hooking from None
10:34:05.817 AM ya_zhang_tie_qi_jun(Clone)001 OnSkillStart: ya_zhang_tie_qi_jun_attack_3
10:34:06.297 AM GameClient Received a Message: [Action, Ping]

10:34:06.338 AM Player OnSkillTrigger (player_female_suplex_back#1)
10:34:06.345 AM ya_zhang_tie_qi_jun(Clone)001 OnSuplexAttackHit by Player with player_female_suplex_back#1
10:34:06.352 AM ya_zhang_tie_qi_jun(Clone)001 is SuperArmored, cannot be Suplex
10:34:06.359 AM ya_zhang_tie_qi_jun(Clone)001 ApplySuperArmoredFX
10:34:06.744 AM ya_zhang_tie_qi_jun(Clone)001 CancelSuperArmoredFX
10:34:06.859 AM Player OnSkillEnd: player_female_suplex_back
10:34:08.589 AM #Network# GameClient Emit a Message: [Action, Ping]

从日志里头看到的信息就是这个牙帐铁骑军已经释放了一个技能,但是在其技能动画播放到 OnSkillStart 的时间点时,已经被主角攻击了,此时其并未立即切换到受击状态,而是继续播放其技能动画并且触发了 OnSkillStart 的回调。所以游戏的逻辑就出问题了,NPC 因为触发了 OnSkillStart 回调进入霸体状态了,然后主角后续的所有攻击都无法让 NPC 做出相应的受击动作了,关键是这个 NPC 在回调了 OnSkillStart 函数进入霸体之后呢,还是会进入到对应的受击状态,这下就奇了怪了。你要么就不进入受击状态呗,要么就别触发霸体啊,这不是要疯吗。

最后仔细分析排查,知道了这个问题是因为 OnSkillStart 的触发时间点处于动画过渡的时间区间内,也就是说 NPC 从 Idle 状态进入到技能 Attack_3 的状态时间长为 0.3 秒,并且这个动画的过渡 Atomic 属性为 True。问题就这么来了,NPC 在从 Idle 状态时释放技能 Attack_3,动画从 Idle 切换到 Attack_3,动画切换到 0.1 秒的时候,受到了主角的攻击,NPC 的整个 AnimatorController 状态图中,受击状态都是直接从 Any State 跳转过去的。按理来说就应该在任意状态下都能切换到受击状态才对啊,为啥动画还会继续往后播放呢,直到 OnSkillStart 回调完了之后再切换到受击状态呢?

最终发现了就是这个 Atomic 属性给闹的,这个 Atomic 属性的字面意思已经很清楚了,那就是当它为 True 的时候,这个过渡是原子的,也就是说只要进入了这个过渡,那么这个过渡就一定会播放完成,不论是发生任何情况这个过渡都会播放完成,而刚好我们的这个 OnSkillStart 回调函数所处的时间点就在这个过渡时间段里头,所以就出现了,虽然最终 NPC 还是进入了受击状态,但是在进入受击状态之前因为已经回调了 OnSkillStart 函数,所以导致逻辑上出现了错误。

这个问题呢,有两个解决方法:

  1. 取消所有的动画状态切换之间的过渡时间,让动画之间的切换不再有过渡的过程,都是直接切换,这样就可以避免出现过渡的时候触发 AnimationEvent 了;
  2. 将牙帐铁骑军的 AnimatorController 中从 Idle 到 Attack_3 状态的 Transition 的 Atomic 选项取消,允许该 Transition 被打断,这个解决方法看上去更有技术含量一些,也更符合我们设计意图,当我们不论处于一种什么状态的时候,受击之后就应该立刻切换到某个受击状态下,这个从语义上也很能说得通,对伐?