添加野猪
添加刚体2D组件,碰撞组件,该碰撞组件是确保野猪能跟地面碰撞
添加玩家图层和敌人图层,并应用,使野猪和玩家不会彼此被推着走
碰撞剔除中选择Player和Enemy
再增加一个碰撞组件当作触发器,设置如下,该碰撞组件是确保人物和怪物的互动
基本属性及其计算
再如图路径下创建Character脚本负责基本属性和计算,并应用给Player和Boar
无敌时间和伤害计算
在受到伤害时进行血量计算并进入到无敌时间,运用到计时器的方法来控制无敌时间,在无敌时间中不会受到伤害
攻击
在如图路径下创建Attack脚本负责攻击的计算,并应用给Player和Boar
在attack中的攻击触发代码
private void OnTriggerStay2D(Collider2D other):这是一个Unity中特有的回调函数,当另一个游戏对象(带有Collider2D组件)与当前游戏对象(此脚本所挂载的对象,且该对象需要有Collider2D组件,并设置为触发器(Is Trigger))在2D空间中接触开始时,这个函数会被自动调用。other参数代表与当前对象接触的游戏对象的Collider2D组件。
other.GetComponent
()?.TakeDamage(this);:这行代码尝试从other游戏对象(即与当前触发器接触的游戏对象)上获取一个Character类型的组件。
如果other游戏对象上确实有这个Character组件,那么?.操作符(C#的空条件访问操作符)会确保如果GetComponent()返回的不是null,则调用TakeDamage(this)方法。
这里的TakeDamage(this)方法是Character类中的一个方法,用于处理角色受到伤害的逻辑,this指的是当前触发这个事件的触发器对象(此脚本所挂载的对象,即伤害来源)。
受伤和死亡动画
在上面的Character代码中编写了让血量减少或为零的代码,减少时执行受伤动画,当血量为零时执行死亡动画
受伤动画
死亡动画
在受伤时,玩家会闪烁以此来告诉玩家受伤并进入到了无敌状态
因此创建一个新的动画层Hurt :layer
设置参数如下
Weight代表了当前这个Layer中的动画会在多大程度上影响整个动画的最终表现。
Weight的值为0时,表示该层权重是0,即该层不生效,这一层的动画就像不存在一样。
Weight的值为1时,表示该层权重为1,即该层中的动画能完全表现。
当存在多个Layer且都设置了非0的Weight时,这些Layer的动画会按照各自的Weight进行混合,共同影响最终动画的表现。
Blending Modes(混合模式)是决定动画层之间如何相互作用的关键属性。
Override(覆盖):
当使用覆盖模式时,当前动画层的动画会完全替代下层动画。
如果当前动画层的Weight(权重)为1,则下层动画完全被当前动画覆盖,不会显示。
如果Weight在0到1之间,则会出现两个动画的混合效果,但实际上是其效果根据Weight进行了一定程度的“淡化”或“强化”
适用于需要完全替换下层动画的场景,如角色从行走状态切换到跑步状态时。
Additive(添加):
在添加模式下,当前动画层的动画会在下层动画的基础上叠加。
Weight决定了当前动画层动画对下层动画的影响程度。Weight为1时,当前动画完全叠加在下层动画上;Weight为0时,当前动画不生效。
这种模式适用于需要在不改变下层动画基础动作的前提下,添加一些额外的动作效果,如面部表情、肢体抖动等。
制作的思路就是在原动画和新创建的动画中执行被击中的状态,但一个有素材一个空素材交替之下就变成了人物的闪烁
创建一个新的动画blue Hurt2但不添加素材
在这里我们可以修改各样的参数
找到如下组件,rgb为三原色,a为阿尔法值,表示人物的透明度
将0.2S的a改成 0.5
人物肉眼可见透明了
依次改一下其他时间的透明度保证动画平稳闪烁
状态树添加动画
转换条件为Trriger触发器hurt当触发时。进入。设置如下
当执行完后退出,设置如下
在控制组件代码中写入如下代码
因为trriger触发器可以在被设置为true时触发一次状态转换,并且在转换完成后自动重置为false。不用再update中一直更新,所以单独写
在受伤时,程序要执行很多功能调用很多的代码,如无敌状态,ui的变化,因此引入事件
事件 Events 用于在特定情况下触发特定的行为或动作。Unity提供了多种处理事件的方式,包括使用Unity引擎内置的事件系统、通过脚本监听和处理事件,以及利用UI组件的事件系统来构建交互式用户界面。
调用命名空间
创建事件
反映到unity的Character组件中
添加函数方法,即受到伤害时,执行playAnimation中的PLayHurt方法
启动事件代码,事件中有一个参数
受伤被弹开的效果
定义变量
编辑代码
修改移动
添加进事件
设置反弹力
现在还没有在被反弹后的ishurt状态中退出的功能
进入Animator选中playerHurt2添加HurtAnimation脚本
在该脚本中输入代码使该动作结束时ishurt = false
死亡动画
修改状态树
转换设置如下
死亡状态退出
在死亡后也要执行诸如游戏通知你死亡并重新开始等等事情,因此定义一个事件
事件的执行代码
事件的方法:如果死亡了,玩家就无法控制人物了
定义死亡状态
编辑代码
在Animation中获得player Controller.isDead
现在,在玩家死亡后会“反复去世”,取消动作的循环播放
有很多动作都是需要取消循环播放的,但是只要不连接到AnyState中就不会有问题
悲T_T
三段攻击的实现
创建三个攻击动画,状态树如下
条件分别为bool和trigger和int类型
第一个转换条件如下
不过后两个要有过度时间,即后摇
当任意一个动作完全被执行完才能退出动作,即动作的后摇,其余同理
在input系统中添加攻击按钮
调用Animation触发器和isAttack和combo
在PlayerController中获得Animation组件,和bool值
创建一个计数器,用来进行攻击123的转变
玩家攻击函数如下
完成,但是出现一个问题,连续快速按攻击会导致combo快速改变值,使攻击一直处于第一段攻击第一段
暂时先删除combo后续进行优化
退出isAttack状态
添加行为
退出代码如下
给每一个攻击状态都添加该行为
成功,现在可以退出isAttack了
实装攻击判定和伤害
在Player下创建子物体如图
为子物体添加碰撞体,且为触发器
希望触发时间为挥刀时,如图
调整范围,三段攻击同理,
CTRL删除线
如何在这一瞬间触发呢,用到改变颜色时的方法,通过开启关闭Attack来实现
在帧动画中添加控制该功能的组件
在第1帧关闭,第三帧开启,第四帧关闭,其余两端攻击同理
把攻击脚本加入,并设置伤害
注意,要默认把Attack关掉
防止攻击碰撞和人物碰撞
野猪有两个碰撞体,优先以capsule碰撞体判断
OnTriggerStayD的休眠时间
在测试过程中,发现人物在移动时攻击野猪才会掉血,而人物和野猪静止后攻击不掉血
这是因为OnTriggerStayD的休眠时间,他被触发一段时间后自动停止。碰撞盒移动后才会再次触发该函数
修改休眠方法(默认为0.5)
成功,现在原地不动也可以使野猪血量减少
走路攻击
希望在攻击时人物不能进行移动
修改代码
修改完代码后,由于地面时光滑的,人物会由于加速度仍然往前滑行
添加带有摩檫力的材质,normal为0.4,wall为正常
给PLayer应用normal材质
现在,在两次攻击的间隔处人物还可以进行移动的操作
这是因为在退出一段动作时isattack为false,而只有按下J键时isAttack变为true
中间会出现空隙,如果不喜欢这样的手感,可以在动画事件start中加入修改,(这里不做修改)
材质问题
由于修改了材质,所以现在又出现了黏墙的问题
希望在跳起来时为wall光滑材质,在地面上时为摩檫力材质
获取物理材质并定义
代码如下
在update中更新该函数
完成