Stage.5 Man is not just running(攻击判定和动画优先问题——)

游戏的github链接:
Project on github
游戏的演示视频:
MV on bilibili

目录

  • 攻击判定问题
  • 动画优先问题

攻击判定问题


13:真是简直了,都是因为你要加这些所以又变成这样子了。。。
k :什么样子啊,开心就好嘛
13:只有你很开心吧,差点就DDL了
k :不是说好我们不谈DDL的事吗(/幽怨)
13:额。。好吧。其实也不是加攻击的问题了,关键是。。
k :攻击的判定对吧
13:没错,其实现在比较常用的还是通过动画事件的回掉进行判定吧
k :那是?
13:那就是,我们在动画里面设置关键帧的方式,然后在关键帧内进行判定,如果在攻击范围内的话,那么游戏对象的管理类就通知在攻击范围内的怪物播放被击动画
k :可是,我们这个。。。
13:哎。。。没办法,用别人的预制体的话都是read only,添加不了key,但也不是没办法,还有一种感觉比较暴力的方法,就是我们自定义一个与攻击动画同步的动画,也就是,在播放攻击动画的时候同时播放该动画,然后我们在这个动画里面添加关键帧,然后我们处理这个动画事件的回掉的话也可以实现相同的效果,而且如果将来我们要修改判定条件的话,我们只需要对这个同步动画进行修改就好,而不用对预制体动画进行修改了
k :哦,这也算一种分离了吧!
13:是啊
k :但是为什么没什么人这么做呢?
13:这个,嘛,毕竟如果场景中有很多个角色,然后都要播放两个动画,而且很多时候都会有复合的动画,这样子做的话。。。
k :浪费资源呢。。。
13:是啊,游戏的话还是尽可能流畅一点好呢。当然我们还可以选择其他方法
k :比如说?
13:比如说,我们可以在人物前面加一个空的子物体,添加Collider(勾选isTrigger)还有rigidbody(不需要使用重力),然后用这个物体来判断当播放攻击动画的时候时候会有触发事件。
Stage.5 Man is not just running(攻击判定和动画优先问题——)
k :但是这样的话。。。
13:没错,容易出问题,比如说当被击动画播放时间比较长的时候,就很容易出问题呢,所以我们也可以将这个判定的子物体绑定在武器上。。。
k :哦,没错呢,这样子的话就只有当武器与攻击对象接触的时候才会触发了,这样子感觉也比较合理呢
13:不过,如果预制体动画是分开的话。。。
k :分开的话?
13:那么如果我们使用一般的预制体的话,那么播放动画的时候,使用的预制体是Attack动画的预制体,这个时候你会发现你添加的Collider不会有任何行为
k :也就是我们的作业的情况
13:嗯。。。
k :但是我们解决了这个问题了吧
13:是 我 解决了,其实也不是完全解决了,虽然还有一些问题,嘛,将就一下吧。其实说到底,所谓的关键帧吧
k :就是?
13:其实就是相对于动画开始播放时的一个时间段对吧,也就是一个时间点到另一个时间点
k :这么说是没错了
13:是啊,这样事实上就很简单了,我们只需要添加一个计时器,然后定义一个bool isAttackAvailable变量,只要让这个变量在那个时间段里面的值为true。。
k :哦,这样就相当于关键帧的效果了呢,哇~
13:嘛,也没什么大不了的啦
k :好孩子不能学哦
13:喂。。。唉,是没错啦,一般情况下也不会有人这样子做的。。

动画优先问题

k :动画优先问题记得当时也是一番挣扎呢
13:没cu。。。什么当时啊,不是才刚刚过去30分钟么。。。也是呢,不过其实真正的问题不是在于谁先谁后这件事,而是如何系统的去处理的问题了
k :直接写啊
13:没错,直接写是一种方法,在Update()从上往下写的话,其实也是定义了优先顺序了,也就是我们优先做出优先级较高的动作,并且如果这个动作只能被比他优先级高的动作打断。但是这样子的话,感觉缺乏一个系统的管理还有判断呢
k :那要怎么做呢?
13:其实,对于一个游戏对象来说,事实上他只有一个动作,也就是例如,一个弓箭手不能同时射击还有使用回复药水对吧
k :是呢
13:那么我们可以这样管理,设置一个当前动作以及优先级,然后用一个队列来接收动作,任何动作的触发都会调用一个函数,这个函数会比较队列前面的动作和当前动作的优先级判断接受到的新的动作是否必须优先执行,否则移除队列,判断下一个动作
k :这个队列的形式有点像。。。
13:没错,有点类似于动作管理的感觉,但是因为每个对象在一帧中对应一个动作,所以我们是针对对象进行更新而不是动作。巡逻兵也是这样管理的,我们可以定义一个Class GuardGeneral的类对所有的巡逻兵进行管理,例如,根据当前玩家的位置更新巡逻兵的状态(如:巡逻兵的target,巡逻兵通过判断有无target来做出相应的行为),然后再foreach调用每一个Update()函数,顾名思义,就是一个巡逻兵的指挥官的类,通过观察玩家的位置,通知相应的巡逻兵去攻击玩家,并且对巡逻兵的数量进行管理,即当巡逻兵死亡时生成新的巡逻兵。。。
k :zzzz。。。嗯?哦哦,嗯
13:嗯个鬼啊。。。
k :大家努力去。。zzz
13:至少把梗给我说完。。。

–完