Unity中实现简单的弹反小游戏
最近开发了一个小游戏,在其中实现了简单的弹反效果。
在敌人的剑上绑定一个box collider,同时勾选 is Trigger :
保证玩家有一个胶囊碰撞体。
1、敌人代码
随后我在控制敌人的代码(enemy.cs)中加入下面的函数控制弹反:
//进入剑触发器 void OnTriggerEnter(Collider collider) { if(collider.tag == "character" && isAttack == true) { //Character是玩家类,character是玩家对象,这里调用玩家类中的enemyAttack函数 if(character.GetComponent<Character>().enemyAttack()) { //弹反 //下面代码仅测试用 animator.SetTrigger("AttackFalse"); } } }
OnTriggerEnter 在两个 Trigger 碰撞时会被调用。
首先判断碰撞到的 tag 是否是玩家角色,当前敌人是否是正在攻击的状态。
如果敌人当前正在攻击,isAttack变量会为true。
如果满足上面两个条件,说明当前敌人处于攻击状态,且敌人的剑已经碰到了玩家。
这时调用玩家类中的函数enemyAttack()。这个函数会返回bool,返回true表示弹反成功,false表示弹反失败。
如果弹反成功,就播放敌人被弹反的动画。
2、玩家代码
在玩家上挂载的代码中编辑函数enemyAttack():
//返回true表示弹反成功,返回false表示弹反失败,该扣血了 public bool enemyAttack() { if(defendTime < 0.3f && isDefend == true) { //按下时间合适 audioSource.clip = defendAudio; audioSource.Play(); return true; } //按下时间不合适,受伤 animator.SetBool("Damage", true); blood -= 0.03f; slider.value = blood; return false; }
这个函数返回是否弹反成功。
弹反成功需要有下面的条件:
- 当前玩家正在按下防御按键
- 按下防御按键的时间小于一定长度
如果按下时间合适,就弹反成功,播放音频;如果按下时间不合适,则播放受伤动画,扣血、更改界面的UI。
函数Defend会被每帧调用,记录当前是否处于防御状态,以及按下防御按键的时长:
//每帧调用 private void Defend() { //按下右键,且当前没有处于受伤状态,可以防御 if (Input.GetMouseButton(1) && !animator.GetBool("Damage")) { //按下右键 isDefend = true; defendTime += Time.deltaTime; animator.SetTrigger("Defend"); } else { isDefend = false; defendTime = 0; animator.SetTrigger("DefendEnd"); } }
3、动画控制器
我设计的主角的动画控制器如下:
敌人的动画控制器如下:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步