上期链接:Unity2D游戏制作入门 | 13 ( 之人物三段攻击 )-CSDN博客
上期我们聊到给人物添加三段攻击的动画,通过建立新的图层动画当我们按下攻击按键就会自动切换进攻击的动画,如果我们连续按下攻击键,我们还可以进行好几段的攻击。因为攻击的检测是当我们按下按键时才触发的,所以使用了注册事件的方式进行启动攻击动画,然后在攻击动画退出后我们还使用代码修改人物攻击状态为flase以此来让人物不要继续播放攻击动画。这期我们来让人物有真正的攻击伤害,即人物实装攻击的判定。
这期代码不是很多,请在关键代码处添加即可。如果不知道在哪份代码文件下添加请查看往期。
正文:
我们将使用触发器的方式来执行攻击。我们选中物体:人物,然后在Animation中查看人物的攻击动画,我们观察人物攻击的关键帧,即人物出刀的那一帧有白色的刀影,我们需要在它身加上触发器,即关键帧的触发,然后先要规定这个触发器的范围(你也可以理解为形状,因为当其他碰撞体进去该触发器范围就会启动触发器)
然后接下步骤有点多,根据下图:因为人物不能那么多的碰撞体,所以我们在人物下创建新的子物体,然后统统改名方便我们管理。然后添加Polygon多边形碰撞体,记得把isTrrigger选项勾选起来,然后在人物关键帧出让多边形吻合我们的刀影,最后在人物攻击动画下的AddProperty添加Attack1的isActive。这个isActive是控制物体的开启和关闭,举例如果把人物这个物体名称旁的正方形选项点击为不勾选的状态,那么人物就会在场景中消失,就是这个意思,所以我们需要通过这个开关来控制攻击触发器的开启和关闭,所以在关键帧打开这个触发器即可,需要注意的是,如果你要运行游戏试玩的话一定要先关闭攻击的碰撞体。
因为人物的第一段攻击是在第四帧才有刀影,所以我们把其他帧的isActive关闭即可。然后再播放人物的第一段攻击动画(记得把编辑多边形的功能关闭了,让那个绿色的边框给取消),然后发现人物在攻击的关键帧才会出现白色的边框(那是触发器的形状)。
然后让每个攻击的状态挂载上Polygon碰撞器,然后绘制好边再在关键帧启动它,这需要重复工作,然后每次攻击状态都要挂载上Attack的代码让每段攻击拥有伤害值,第一和第二段为10,第三段为暴击输入20。
然后根据代码:我们发现Attack的代码是获取物体身上的Character代码去执行TakeDamage的函数方法,但是我们人物也是有初始的碰撞体(胶囊碰撞体)所以如果我们攻击,会伤害到我们人物自己。
private void OnTriggerStay2D(Collider2D other){other.GetComponent<Character>()?.TakeDamage(this);//加问号处为语法唐,意思是对面身上有对应函数我才执行。}
所以我们需要让我们攻击状态下的触发器和敌人发生关系就好了,三段攻击都需要修改一下。
如果发现人物攻击野猪时,野猪没有受到伤害,那么我们去把野猪身上的胶囊碰撞体的碰撞优先级打开(因为野猪身上有两个碰撞体所以可能会判断失误),测试的时候记得给野猪规定无敌时间1秒或多少都可以。
测试的过程中发现人物还能边走边攻击,这个不是我们想要的,所以我们需要限制一下人物。我们在人物控制代码中添加条件!isHurt&&!isAttack
,也就是只有在没有受伤和人物攻击时我们可以进行位移。然后需要注意的是:之前我们在攻击动画退出后添加代码已更改人物的攻击状态isAttack为flase,这里我们不需要修改啥了。
private void FixedUpdate()//固定频率运行,即0.02秒执行一次。跟物理有关的放在这执行{if (!isHurt&&!isAttack){if (isShift && physicsCheck.isGround)Walk();elseMove();}
但是又有一个问题了,我们跑步后突然攻击还是会有一段的位移,这是因为人物的材质是光滑的所以我们需要规定人物在地上时材质是有摩檫力的,靠近墙体就就是光滑的。所以我们需要修改人物的材质为有摩檫力的即可,然后如果你不希望人物攻击时还有位移,你就可以在攻击动画链接的代码下添加代码:这样人物一攻击就会停下来了。
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){animator.GetComponent<Player_control>().isAttack = true;}
然后解决材质问题:所以我们先在人物控制代码中添加材质:我们要用到三元运算符physicsCheck.isGround?normal:wall
,如果为true就执行冒号前的。
private CapsuleCollider2D coll;[Header("材质")]public PhysicsMaterial2D wall;//碰墙材质摩檫力为0public PhysicsMaterial2D normal;//在地上时材质摩檫力是0.8
//在Awack中获得权限
coll = GetComponent<CapsuleCollider2D>();//在Update中检测调用CheckState();//材质替换函数private void CheckState(){coll.sharedMaterial=physicsCheck.isGround?normal:wall;}
总结:
这节我们学习了人物在攻击动画中添加关键帧来用触发器的方式进行人物的攻击是否启动的问题,我还让人物只对敌人造成伤害(排除人物自己不然就会受到攻击)。然后我们还规定了人物攻击时是不能移动的(因为我们没有边跑边攻击的动画绘制),然后还修复了短暂性的人物攻击状态为true却一直不是true的状态(就人物如果一直在播放攻击的动画那么它应该一直是true,这样不会立马播放动画后我们又可以继续移动了)。最后我们还解决了材质的问题,当我们的人物在地上时我们的人物材质是有摩檫力的,一旦离开地面我们的人物就是光滑的材质。但是还是有一个问题没有解决,**如果贴墙跳会跳不高因为当时人物的才是是normal,所以需要解决这个问题。**其次爬墙、滑铲这里的UP只限在付费课堂获取,所以需要靠自己去解决。
补充:
1、如果使用Polygon多边行,在变出弄出了更多的锚点,如果想取消只能按下Ctrl键加左键再点击边就能实现取消了。
未尽事宜以后可能会补充。
---------------------结束线